@cratis/components 4.19.2 → 4.21.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 (83) hide show
  1. package/README.md +2 -2
  2. package/compat-manifest.json +11 -11
  3. package/dist/esm/Chat/ChatConversation.d.ts +8 -1
  4. package/dist/esm/Chat/ChatConversation.d.ts.map +1 -1
  5. package/dist/esm/Chat/ChatConversation.js +2 -2
  6. package/dist/esm/Chat/ChatConversation.js.map +1 -1
  7. package/dist/esm/Chat/ChatSidebar.d.ts +12 -2
  8. package/dist/esm/Chat/ChatSidebar.d.ts.map +1 -1
  9. package/dist/esm/Chat/ChatSidebar.js +2 -2
  10. package/dist/esm/Chat/ChatSidebar.js.map +1 -1
  11. package/dist/esm/Chat/ChatTopicAction.d.ts +23 -0
  12. package/dist/esm/Chat/ChatTopicAction.d.ts.map +1 -0
  13. package/dist/esm/Chat/ChatTopicAction.js +4 -0
  14. package/dist/esm/Chat/ChatTopicAction.js.map +1 -0
  15. package/dist/esm/Chat/ChatTopicActions.d.ts +25 -0
  16. package/dist/esm/Chat/ChatTopicActions.d.ts.map +1 -0
  17. package/dist/esm/Chat/ChatTopicActions.js +6 -0
  18. package/dist/esm/Chat/ChatTopicActions.js.map +1 -0
  19. package/dist/esm/Chat/ChatTopicList.d.ts +5 -2
  20. package/dist/esm/Chat/ChatTopicList.d.ts.map +1 -1
  21. package/dist/esm/Chat/ChatTopicList.js +17 -9
  22. package/dist/esm/Chat/ChatTopicList.js.map +1 -1
  23. package/dist/esm/Chat/index.d.ts +1 -0
  24. package/dist/esm/Chat/index.d.ts.map +1 -1
  25. package/dist/esm/Chat/useTopicActionFocusRecovery.d.ts +19 -0
  26. package/dist/esm/Chat/useTopicActionFocusRecovery.d.ts.map +1 -0
  27. package/dist/esm/Chat/useTopicActionFocusRecovery.js +41 -0
  28. package/dist/esm/Chat/useTopicActionFocusRecovery.js.map +1 -0
  29. package/dist/esm/Common/ActionMenubar.d.ts.map +1 -1
  30. package/dist/esm/Common/ActionMenubar.js +11 -6
  31. package/dist/esm/Common/ActionMenubar.js.map +1 -1
  32. package/dist/esm/Common/ToolbarFocusMode.d.ts +9 -1
  33. package/dist/esm/Common/ToolbarFocusMode.d.ts.map +1 -1
  34. package/dist/esm/Common/ToolbarFocusMode.js +1 -0
  35. package/dist/esm/Common/ToolbarFocusMode.js.map +1 -1
  36. package/dist/esm/Common/ToolbarRovingContext.d.ts +39 -0
  37. package/dist/esm/Common/ToolbarRovingContext.d.ts.map +1 -0
  38. package/dist/esm/Common/ToolbarRovingContext.js +40 -0
  39. package/dist/esm/Common/ToolbarRovingContext.js.map +1 -0
  40. package/dist/esm/Common/useToolbarKeyboardNavigation.d.ts +2 -0
  41. package/dist/esm/Common/useToolbarKeyboardNavigation.d.ts.map +1 -1
  42. package/dist/esm/Common/useToolbarKeyboardNavigation.js +164 -15
  43. package/dist/esm/Common/useToolbarKeyboardNavigation.js.map +1 -1
  44. package/dist/esm/DataTables/DataTableCore.d.ts +19 -1
  45. package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
  46. package/dist/esm/DataTables/DataTableCore.js +19 -14
  47. package/dist/esm/DataTables/DataTableCore.js.map +1 -1
  48. package/dist/esm/DataTables/DataTableRowProcessing.d.ts +11 -0
  49. package/dist/esm/DataTables/DataTableRowProcessing.d.ts.map +1 -0
  50. package/dist/esm/DataTables/DataTableRowProcessing.js +8 -0
  51. package/dist/esm/DataTables/DataTableRowProcessing.js.map +1 -0
  52. package/dist/esm/DataTables/DataTableSort.d.ts +9 -0
  53. package/dist/esm/DataTables/DataTableSort.d.ts.map +1 -0
  54. package/dist/esm/DataTables/DataTableSort.js +4 -0
  55. package/dist/esm/DataTables/DataTableSort.js.map +1 -0
  56. package/dist/esm/DataTables/DataTableSortDirection.d.ts +8 -0
  57. package/dist/esm/DataTables/DataTableSortDirection.d.ts.map +1 -0
  58. package/dist/esm/DataTables/DataTableSortDirection.js +8 -0
  59. package/dist/esm/DataTables/DataTableSortDirection.js.map +1 -0
  60. package/dist/esm/DataTables/index.d.ts +3 -0
  61. package/dist/esm/DataTables/index.d.ts.map +1 -1
  62. package/dist/esm/DataTables/index.js +2 -0
  63. package/dist/esm/DataTables/index.js.map +1 -1
  64. package/dist/esm/DataTables/useControllableState.d.ts +10 -0
  65. package/dist/esm/DataTables/useControllableState.d.ts.map +1 -0
  66. package/dist/esm/DataTables/useControllableState.js +15 -0
  67. package/dist/esm/DataTables/useControllableState.js.map +1 -0
  68. package/dist/esm/Toolbar/Toolbar.d.ts.map +1 -1
  69. package/dist/esm/Toolbar/Toolbar.js +3 -2
  70. package/dist/esm/Toolbar/Toolbar.js.map +1 -1
  71. package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -1
  72. package/dist/esm/Toolbar/ToolbarButton.js +4 -2
  73. package/dist/esm/Toolbar/ToolbarButton.js.map +1 -1
  74. package/dist/esm/Toolbar/ToolbarFanOutItem.d.ts.map +1 -1
  75. package/dist/esm/Toolbar/ToolbarFanOutItem.js +10 -2
  76. package/dist/esm/Toolbar/ToolbarFanOutItem.js.map +1 -1
  77. package/dist/esm/Toolbar/ToolbarFolder.d.ts.map +1 -1
  78. package/dist/esm/Toolbar/ToolbarFolder.js +10 -2
  79. package/dist/esm/Toolbar/ToolbarFolder.js.map +1 -1
  80. package/dist/esm/styles.Canvas.css +17 -1
  81. package/dist/esm/styles.Chat.css +17 -1
  82. package/dist/esm/styles.css +17 -1
  83. package/package.json +8 -2
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableCore.js","sources":["../../../DataTables/DataTableCore.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type TableHTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport { useCratisIcon } from '../configuration/useCratisIcon';\nimport type { ColumnProps } from './Column';\nimport { ColumnFilterMenu } from './ColumnFilterMenu';\nimport type { DataTableSelectionChangeEvent } from './DataTableSelectionChangeEvent';\nimport {\n DataTableFilterMatchMode,\n type DataTableFilterConstraint,\n type DataTableFilterEntry,\n type DataTableFilterMeta,\n} from './DataTableFilterMeta';\nimport { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry';\nimport { DataTableStatus } from './DataTableStatus';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** Event emitted when a DataTable row is activated. */\nexport interface DataTableRowClickEvent<TData> {\n /** Activated row data. */\n data: TData;\n /** Loaded-page row index. */\n index: number;\n}\n\n/** Stable Cratis-owned parts for styling a {@link DataTableCore}. */\nexport interface DataTableParts {\n /** Outer table composition. */\n root?: HTMLAttributes<HTMLDivElement>;\n /** Loaded-page search wrapper. */\n search?: HTMLAttributes<HTMLDivElement>;\n /** Loaded-page search input. */\n searchInput?: React.InputHTMLAttributes<HTMLInputElement>;\n /** Scroll container. */\n tableContainer?: HTMLAttributes<HTMLDivElement>;\n /** Semantic table element. */\n table?: TableHTMLAttributes<HTMLTableElement>;\n /** Table head. */\n head?: HTMLAttributes<HTMLTableSectionElement>;\n /** Header row. */\n headerRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Header cell. */\n headerCell?: ThHTMLAttributes<HTMLTableCellElement>;\n /** Table body. */\n body?: HTMLAttributes<HTMLTableSectionElement>;\n /** Data row. */\n row?: HTMLAttributes<HTMLTableRowElement>;\n /** Data cell. */\n cell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Empty-state row. */\n emptyRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Empty-state cell. */\n emptyCell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Loading-state row. */\n loadingRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Loading-state cell. */\n loadingCell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Failed or unauthorized row. */\n failureRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Failed or unauthorized cell. */\n failureCell?: TdHTMLAttributes<HTMLTableCellElement>;\n}\n\n/** Props for the semantic loaded-page DataTable renderer. */\nexport interface DataTableCoreProps<TData extends object> {\n /** Loaded page rows. */\n data: TData[];\n /** Declarative {@link Column} markers. */\n children?: ReactNode;\n /** Row property used as stable identity. Required to preserve selection across refreshed row objects. */\n dataKey?: string;\n /** Content shown when the loaded page has no matching rows. */\n emptyMessage: ReactNode;\n /** Table display state. Defaults to ready. */\n status?: DataTableStatus;\n /** Message shown while loading without rows. */\n loadingMessage?: ReactNode;\n /** Message shown for a failed query. */\n failureMessage?: ReactNode;\n /** Message shown for an unauthorized query. */\n unauthorizedMessage?: ReactNode;\n /**\n * Enables row selection. `'single'` selects one row at a time through row activation;\n * `'multiple'` adds per-row checkboxes and a select-all header checkbox, and reports through\n * {@link onSelectedItemsChange} rather than {@link onSelectionChange}.\n */\n selectionMode?: 'single' | 'multiple';\n /** Accessible name for row selection controls. Falls back to the provider's `dataTable.selectRow` message, then `'Select row'`. */\n selectionAriaLabel?: string;\n /** Accessible name for the select-all control. Falls back to the provider's `dataTable.selectAllRows` message, then `'Select all rows'`. */\n selectAllAriaLabel?: string;\n /** Controlled selected row. Applies to `selectionMode='single'`. */\n selection?: TData | null;\n /** Invoked when the single-row selection changes. */\n onSelectionChange?: (event: DataTableSelectionChangeEvent<TData>) => void;\n /** Controlled selected rows. Applies to `selectionMode='multiple'`. */\n selectedItems?: TData[];\n /** Invoked with the full set of selected rows when a multiple selection changes. */\n onSelectedItemsChange?: (items: TData[]) => void;\n /** Invoked when a row is clicked or keyboard activated. */\n onRowClick?: (event: DataTableRowClickEvent<TData>) => void;\n /** Builds an extra class name for one row. */\n rowClassName?: (rowData: TData) => string;\n /** Row fields searched on the loaded page. */\n globalFilterFields?: string[];\n /** Placeholder for the loaded-page search input. Falls back to the provider's `dataTable.search` message, then `'Search…'`. */\n globalSearchPlaceholder?: string;\n /** Accessible name for the loaded-page search input. Falls back to the provider's `dataTable.searchAriaLabel` message, then `'Search table'`. */\n globalSearchAriaLabel?: string;\n /** Initial per-field filter constraints. */\n defaultFilters?: DataTableFilterMeta;\n /** Invoked when applied field filters change. */\n onFilter?: (filters: DataTableFilterMeta) => void;\n /** Enables the bounded scroll container. */\n scrollable?: boolean;\n /** Scroll-container maximum height. */\n scrollHeight?: string;\n /** Extra class name for the table composition. */\n className?: string;\n /** Inline style for the table composition. */\n style?: CSSProperties;\n /** Cratis-owned per-part attributes. */\n pt?: DataTableParts;\n /**\n * @deprecated Cratis parts always merge. Remove this renderer-era option.\n */\n ptOptions?: object;\n /**\n * @deprecated Components always uses consumer-owned CSS. Customize through `pt` and CSS instead.\n */\n unstyled?: boolean;\n}\n\nconst useColumns = (children: ReactNode): React.ReactElement<ColumnProps<any>>[] =>\n useMemo(\n () =>\n React.Children.toArray(children).filter(\n React.isValidElement,\n ) as React.ReactElement<ColumnProps<any>>[],\n [children],\n );\n\ntype CellValue =\n string | number | boolean | bigint | symbol | Date | object | null | undefined;\n\nconst asCellValue = (value: unknown): CellValue =>\n typeof value === 'function' ? String(value) : (value as CellValue);\n\nconst valueAtPath = (\n row: Record<string, unknown>,\n path: string | undefined,\n): CellValue => {\n if (!path) return undefined;\n let current: CellValue = row;\n for (const segment of path.split('.')) {\n if (current === null || typeof current !== 'object') return undefined;\n const record = current as Record<string, unknown>;\n if (!Object.hasOwn(record, segment)) return undefined;\n current = asCellValue(record[segment]);\n }\n return current;\n};\n\nconst renderCellContent = (\n column: ColumnProps<any>,\n row: Record<string, unknown>,\n): ReactNode => {\n if (column.body) return column.body(row);\n const value = valueAtPath(row, column.field);\n return value == null ? '' : String(value);\n};\n\nconst dateNumber = (value: unknown) => {\n // A cloned Date is normalized in place so caller-owned Date instances (row\n // values and filter constraints alike) are never mutated by comparison.\n const date =\n value instanceof Date ? new Date(value.getTime()) : new Date(String(value));\n return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);\n};\n\nconst firstConstraint = (\n entry: DataTableFilterEntry | undefined,\n): DataTableFilterConstraint | undefined =>\n entry && 'constraints' in entry ? entry.constraints[0] : entry;\n\nconst builtInMatches = (\n value: unknown,\n constraint: DataTableFilterConstraint,\n): boolean => {\n const filter = constraint.value;\n const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;\n if (filter === null || filter === undefined || filter === '') return true;\n\n const valueText = String(value ?? '').toLocaleLowerCase();\n const filterText = String(filter).toLocaleLowerCase();\n const valueNumber = typeof value === 'number' ? value : Number(value);\n const filterNumber = typeof filter === 'number' ? filter : Number(filter);\n\n switch (mode) {\n case DataTableFilterMatchMode.StartsWith:\n return valueText.startsWith(filterText);\n case DataTableFilterMatchMode.Contains:\n return valueText.includes(filterText);\n case DataTableFilterMatchMode.NotContains:\n return !valueText.includes(filterText);\n case DataTableFilterMatchMode.EndsWith:\n return valueText.endsWith(filterText);\n case DataTableFilterMatchMode.Equals:\n return Object.is(value, filter) || valueText === filterText;\n case DataTableFilterMatchMode.NotEquals:\n return !(Object.is(value, filter) || valueText === filterText);\n case DataTableFilterMatchMode.In:\n return Array.isArray(filter) && filter.some((item) => Object.is(item, value));\n case DataTableFilterMatchMode.Between:\n return (\n Array.isArray(filter) &&\n filter.length >= 2 &&\n valueNumber >= Number(filter[0]) &&\n valueNumber <= Number(filter[1])\n );\n case DataTableFilterMatchMode.LessThan:\n return valueNumber < filterNumber;\n case DataTableFilterMatchMode.LessThanOrEqual:\n return valueNumber <= filterNumber;\n case DataTableFilterMatchMode.GreaterThan:\n return valueNumber > filterNumber;\n case DataTableFilterMatchMode.GreaterThanOrEqual:\n return valueNumber >= filterNumber;\n case DataTableFilterMatchMode.DateIs:\n return dateNumber(value) === dateNumber(filter);\n case DataTableFilterMatchMode.DateIsNot:\n return dateNumber(value) !== dateNumber(filter);\n case DataTableFilterMatchMode.DateBefore:\n return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);\n case DataTableFilterMatchMode.DateAfter:\n return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);\n default:\n return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;\n }\n};\n\nconst matchesFilterEntry = (value: unknown, entry: DataTableFilterEntry) => {\n if (!('constraints' in entry)) return builtInMatches(value, entry);\n if (entry.constraints.length === 0) return true;\n\n const matches = entry.constraints.map((constraint) =>\n builtInMatches(value, constraint),\n );\n return entry.operator?.toLowerCase() === 'or'\n ? matches.some(Boolean)\n : matches.every(Boolean);\n};\n\nconst compareValues = (left: unknown, right: unknown): number => {\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (left instanceof Date && right instanceof Date)\n return left.getTime() - right.getTime();\n return String(left ?? '').localeCompare(String(right ?? ''), undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n};\n\nconst classNames = (...values: Array<string | undefined>) =>\n values.filter(Boolean).join(' ');\n\n/** A semantic, renderer-independent data table over one already-loaded page. */\nexport const DataTableCore = <TData extends object>({\n data,\n children,\n dataKey,\n emptyMessage,\n status = DataTableStatus.Ready,\n loadingMessage,\n failureMessage,\n unauthorizedMessage,\n selectionMode,\n selectionAriaLabel,\n selectAllAriaLabel,\n selection,\n onSelectionChange,\n selectedItems,\n onSelectedItemsChange,\n onRowClick,\n rowClassName,\n globalFilterFields,\n globalSearchPlaceholder,\n globalSearchAriaLabel,\n defaultFilters,\n onFilter,\n scrollable,\n scrollHeight,\n className,\n style,\n pt,\n}: DataTableCoreProps<TData>) => {\n const { messages } = useCratisComponentsConfig();\n const dataTableMessages = messages?.dataTable;\n const resolvedSelectionAriaLabel =\n selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row';\n const resolvedSelectAllAriaLabel =\n selectAllAriaLabel ?? dataTableMessages?.selectAllRows ?? 'Select all rows';\n const resolvedGlobalSearchPlaceholder =\n globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…';\n const resolvedGlobalSearchAriaLabel =\n globalSearchAriaLabel ?? dataTableMessages?.searchAriaLabel ?? 'Search table';\n const resolvedLoadingMessage = loadingMessage ?? dataTableMessages?.loading ?? 'Loading…';\n const resolvedFailureMessage =\n failureMessage ?? dataTableMessages?.failed ?? 'Could not load data.';\n const resolvedUnauthorizedMessage =\n unauthorizedMessage ?? dataTableMessages?.unauthorized ??\n 'You are not authorized to view this data.';\n const isBusy = status === DataTableStatus.Loading && data.length > 0;\n const icon = useCratisIcon();\n const sortAscendingIcon = icon('sortAscending', '▲');\n const sortDescendingIcon = icon('sortDescending', '▼');\n const columns = useColumns(children);\n const selectionGroupName = useId();\n const [filters, setFilters] = useState<DataTableFilterMeta>(defaultFilters ?? {});\n const [globalFilter, setGlobalFilter] = useState('');\n const [sort, setSort] = useState<{\n field: string;\n direction: 'ascending' | 'descending';\n }>();\n\n const filteredRows = useMemo(() => {\n const term = globalFilter.trim().toLocaleLowerCase();\n const rows = data\n .map((row, loadedIndex) => ({ row, loadedIndex }))\n .filter(({ row }) => {\n const rowValues = row as Record<string, unknown>;\n const matchesColumns = Object.entries(filters).every(([field, entry]) =>\n matchesFilterEntry(valueAtPath(rowValues, field), entry),\n );\n if (!matchesColumns) return false;\n if (!term || !globalFilterFields?.length) return true;\n return globalFilterFields.some((field) =>\n String(valueAtPath(rowValues, field) ?? '')\n .toLocaleLowerCase()\n .includes(term),\n );\n });\n\n if (!sort) return rows;\n return [...rows].sort((left, right) => {\n const comparison = compareValues(\n valueAtPath(left.row as Record<string, unknown>, sort.field),\n valueAtPath(right.row as Record<string, unknown>, sort.field),\n );\n return sort.direction === 'ascending' ? comparison : -comparison;\n });\n }, [data, filters, globalFilter, globalFilterFields, sort]);\n\n const updateFilter = (\n field: string,\n constraint: DataTableFilterConstraint | undefined,\n ) => {\n const next = { ...filters };\n if (constraint) next[field] = constraint;\n else delete next[field];\n setFilters(next);\n onFilter?.(next);\n };\n\n const activateRow = (\n row: TData,\n index: number,\n originalEvent: React.SyntheticEvent,\n ) => {\n onRowClick?.({ data: row, index });\n if (selectionMode === 'single') {\n onSelectionChange?.({ value: row, originalEvent });\n }\n if (selectionMode === 'multiple') {\n toggleRowSelection(row);\n }\n };\n\n const dataKeyIdentity = (row: TData) =>\n String(valueAtPath(row as Record<string, unknown>, dataKey!));\n const dataKeyCounts = useMemo(() => {\n const counts = new Map<string, number>();\n if (!dataKey) return counts;\n for (const row of data) {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n counts.set(identity, (counts.get(identity) ?? 0) + 1);\n }\n return counts;\n }, [data, dataKey]);\n const firstLoadedIndexByDataKey = useMemo(() => {\n const indices = new Map<string, number>();\n if (!dataKey) return indices;\n data.forEach((row, loadedIndex) => {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n if (!indices.has(identity)) indices.set(identity, loadedIndex);\n });\n return indices;\n }, [data, dataKey]);\n const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;\n const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;\n const isSelectedRow = (row: TData, loadedIndex: number) => {\n if (!selection) return false;\n if (!dataKey) return loadedIndex === selectedLoadedIndex;\n\n const identity = dataKeyIdentity(row);\n if (identity !== selectedDataKey) return false;\n if ((dataKeyCounts.get(identity) ?? 0) <= 1) return true;\n if (selectedLoadedIndex >= 0) return loadedIndex === selectedLoadedIndex;\n return loadedIndex === firstLoadedIndexByDataKey.get(identity);\n };\n\n // Membership is by dataKey when there is one, and by object identity otherwise. A table whose\n // rows are replaced wholesale on every refresh - which is every observable query - keeps its\n // selection only in the first case, which is why dataKey matters here as much as it does for\n // single selection.\n const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);\n const isRowSelected = (row: TData) =>\n dataKey\n ? selectedItemsList.some(\n (selected) => dataKeyIdentity(selected) === dataKeyIdentity(row),\n )\n : selectedItemsList.includes(row);\n\n const toggleRowSelection = (row: TData) => {\n const next = isRowSelected(row)\n ? selectedItemsList.filter((selected) =>\n dataKey\n ? dataKeyIdentity(selected) !== dataKeyIdentity(row)\n : selected !== row,\n )\n : [...selectedItemsList, row];\n onSelectedItemsChange?.(next);\n };\n\n // Select-all means the rows the user can currently see. A filtered table that silently selected\n // rows hidden behind the filter would act on more than it showed, which is the whole hazard of a\n // bulk action.\n const visibleRows = filteredRows.map(({ row }) => row);\n const isVisibleRow = (row: TData) =>\n dataKey\n ? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))\n : visibleRows.includes(row);\n const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;\n const allFilteredRowsSelected =\n visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;\n const someFilteredRowsSelected =\n selectedVisibleCount > 0 && !allFilteredRowsSelected;\n const selectAllRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someFilteredRowsSelected;\n }\n }, [someFilteredRowsSelected]);\n\n const toggleSelectAll = () => {\n if (allFilteredRowsSelected) {\n onSelectedItemsChange?.(\n selectedItemsList.filter((selected) => !isVisibleRow(selected)),\n );\n return;\n }\n const additions = visibleRows.filter((row) => !isRowSelected(row));\n onSelectedItemsChange?.([...selectedItemsList, ...additions]);\n };\n\n\n return (\n <div\n {...pt?.root}\n className={classNames(\n 'cratis-datatable',\n scrollable ? 'cratis-datatable--scrollable' : undefined,\n pt?.root?.className,\n className,\n )}\n style={{ ...pt?.root?.style, ...style }}\n data-cratis-part='root'\n data-busy={isBusy || undefined}\n >\n {!!globalFilterFields?.length && (\n <div\n {...pt?.search}\n className={classNames(\n 'cratis-datatable-search',\n pt?.search?.className,\n )}\n data-cratis-part='search'\n >\n <input\n {...pt?.searchInput}\n value={globalFilter}\n placeholder={resolvedGlobalSearchPlaceholder}\n aria-label={resolvedGlobalSearchAriaLabel}\n className={classNames(\n 'cratis-datatable-search__input',\n pt?.searchInput?.className,\n )}\n data-cratis-part='search-input'\n onChange={(event) => setGlobalFilter(event.target.value)}\n />\n </div>\n )}\n <div\n {...pt?.tableContainer}\n className={classNames(\n 'cratis-datatable__container',\n pt?.tableContainer?.className,\n )}\n style={{\n ...pt?.tableContainer?.style,\n ...(scrollable\n ? { maxHeight: scrollHeight ?? '100%', overflow: 'auto' }\n : {}),\n }}\n data-cratis-part='table-container'\n >\n <table\n {...pt?.table}\n className={classNames(\n 'cratis-datatable__table',\n pt?.table?.className,\n )}\n data-cratis-part='table'\n aria-busy={isBusy || undefined}\n >\n <thead\n {...pt?.head}\n className={classNames(\n 'cratis-datatable__head',\n pt?.head?.className,\n )}\n data-cratis-part='head'\n >\n <tr\n {...pt?.headerRow}\n className={classNames(\n 'cratis-datatable__header-row',\n pt?.headerRow?.className,\n )}\n data-cratis-part='header-row'\n >\n {columns.map((column, index) => {\n const field =\n column.props.filterField ?? column.props.field;\n const ariaSort =\n sort && sort.field === column.props.field\n ? sort.direction\n : undefined;\n return (\n <th\n key={index}\n {...pt?.headerCell}\n scope='col'\n aria-label={\n column.props.selectionMode\n ? resolvedSelectionAriaLabel\n : undefined\n }\n aria-sort={ariaSort}\n style={{\n ...pt?.headerCell?.style,\n ...column.props.style,\n ...column.props.headerStyle,\n }}\n className={classNames(\n 'cratis-datatable__header-cell',\n pt?.headerCell?.className,\n column.props.headerClassName,\n )}\n data-cratis-part='header-cell'\n data-selected={Boolean(ariaSort) || undefined}\n >\n <div\n className='cratis-datatable-header-cell'\n data-cratis-part='header-content'\n data-selected={Boolean(ariaSort) || undefined}\n >\n {column.props.selectionMode ===\n 'multiple' ? (\n <input\n type='checkbox'\n aria-label={\n resolvedSelectAllAriaLabel\n }\n data-cratis-part='select-all'\n checked={allFilteredRowsSelected}\n ref={selectAllRef}\n onChange={toggleSelectAll}\n />\n ) : (\n column.props.selectionMode && (\n <span className='cratis-datatable__sr-only'>\n {resolvedSelectionAriaLabel}\n </span>\n )\n )}\n {column.props.sortable &&\n column.props.field ? (\n <button\n type='button'\n className='cratis-datatable__sort'\n data-cratis-part='sort'\n data-pressed={\n Boolean(ariaSort) || undefined\n }\n onClick={() =>\n setSort((current) => ({\n field: column.props\n .field as string,\n direction:\n current?.field ===\n column.props.field &&\n current?.direction ===\n 'ascending'\n ? 'descending'\n : 'ascending',\n }))\n }\n >\n <span>{column.props.header}</span>\n {ariaSort && (\n <span aria-hidden='true'>\n {ariaSort === 'ascending'\n ? sortAscendingIcon\n : sortDescendingIcon}\n </span>\n )}\n </button>\n ) : (\n column.props.header\n )}\n {column.props.filter && field && (\n <ColumnFilterMenu\n field={field}\n dataType={column.props.dataType}\n placeholder={\n column.props.filterPlaceholder\n }\n showMatchModes={\n column.props.showFilterMatchModes\n }\n filterElement={\n column.props.filterElement\n }\n filterOptions={\n column.props.filterOptions\n }\n labels={column.props.filterLabels}\n pt={column.props.filterPt}\n constraint={firstConstraint(\n filters[field],\n )}\n onApply={(constraint) =>\n updateFilter(field, constraint)\n }\n onClear={() =>\n updateFilter(field, undefined)\n }\n />\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody\n {...pt?.body}\n className={classNames(\n 'cratis-datatable__body',\n pt?.body?.className,\n )}\n data-cratis-part='body'\n >\n {status === DataTableStatus.Failed ||\n status === DataTableStatus.Unauthorized ? (\n <tr\n key={status}\n {...pt?.failureRow}\n className={classNames(\n 'cratis-datatable__failure-row',\n pt?.failureRow?.className,\n )}\n data-cratis-part='failure-row'\n data-reason={status}\n >\n <td\n {...pt?.failureCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__failure-cell',\n pt?.failureCell?.className,\n )}\n data-cratis-part='failure-cell'\n >\n <div role='alert'>\n {status === DataTableStatus.Failed\n ? resolvedFailureMessage\n : resolvedUnauthorizedMessage}\n </div>\n </td>\n </tr>\n ) : status === DataTableStatus.Loading && data.length === 0 ? (\n <tr\n key={status}\n {...pt?.loadingRow}\n className={classNames(\n 'cratis-datatable__loading-row',\n pt?.loadingRow?.className,\n )}\n data-cratis-part='loading-row'\n >\n <td\n {...pt?.loadingCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__loading-cell',\n pt?.loadingCell?.className,\n )}\n data-cratis-part='loading-cell'\n >\n <div role='status'>{resolvedLoadingMessage}</div>\n </td>\n </tr>\n ) : filteredRows.length === 0 ? (\n <tr\n {...pt?.emptyRow}\n className={classNames(\n 'cratis-datatable__empty-row',\n pt?.emptyRow?.className,\n )}\n data-cratis-part='empty-row'\n >\n <td\n {...pt?.emptyCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__empty-cell',\n pt?.emptyCell?.className,\n )}\n data-cratis-part='empty-cell'\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n filteredRows.map(({ row, loadedIndex }) => {\n const identity = dataKey\n ? dataKeyIdentity(row)\n : 'loaded-row';\n const rowKey = `${identity}::${loadedIndex}`;\n const isSelected =\n selectionMode === 'single' &&\n isSelectedRow(row, loadedIndex);\n const isInteractive =\n Boolean(onRowClick) ||\n selectionMode === 'single' ||\n selectionMode === 'multiple';\n return (\n <tr\n key={rowKey}\n {...pt?.row}\n tabIndex={isInteractive ? 0 : pt?.row?.tabIndex}\n aria-selected={\n selectionMode === 'single'\n ? isSelected\n : undefined\n }\n className={classNames(\n 'cratis-datatable__row',\n pt?.row?.className,\n rowClassName?.(row),\n )}\n data-cratis-part='row'\n data-selected={isSelected || undefined}\n data-interactive={isInteractive || undefined}\n onClick={(event) =>\n activateRow(row, loadedIndex, event)\n }\n onKeyDown={(event) => {\n if (\n event.target !== event.currentTarget ||\n (event.key !== 'Enter' &&\n event.key !== ' ')\n ) {\n return;\n }\n event.preventDefault();\n activateRow(row, loadedIndex, event);\n }}\n >\n {columns.map((column, columnIndex) => (\n <td\n key={columnIndex}\n {...pt?.cell}\n style={{\n ...pt?.cell?.style,\n ...column.props.style,\n ...column.props.bodyStyle,\n }}\n className={classNames(\n 'cratis-datatable__cell',\n pt?.cell?.className,\n column.props.bodyClassName ??\n column.props.className,\n )}\n data-cratis-part='cell'\n data-selected={isSelected || undefined}\n >\n {column.props.selectionMode ===\n 'multiple' ? (\n <input\n type='checkbox'\n aria-label={\n resolvedSelectionAriaLabel\n }\n checked={isRowSelected(row)}\n onClick={(event) =>\n event.stopPropagation()\n }\n onChange={() =>\n toggleRowSelection(row)\n }\n />\n ) : column.props.selectionMode ? (\n <input\n type='radio'\n name={selectionGroupName}\n readOnly\n tabIndex={-1}\n aria-label={\n resolvedSelectionAriaLabel\n }\n checked={isSelected}\n />\n ) : (\n renderCellContent(\n column.props,\n row as Record<string, unknown>,\n )\n )}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"DataTableCore.js","sources":["../../../DataTables/DataTableCore.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, {\n useEffect,\n useId,\n useMemo,\n useRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type TableHTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport { useCratisIcon } from '../configuration/useCratisIcon';\nimport type { ColumnProps } from './Column';\nimport { ColumnFilterMenu } from './ColumnFilterMenu';\nimport type { DataTableSelectionChangeEvent } from './DataTableSelectionChangeEvent';\nimport {\n DataTableFilterMatchMode,\n type DataTableFilterConstraint,\n type DataTableFilterEntry,\n type DataTableFilterMeta,\n} from './DataTableFilterMeta';\nimport { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry';\nimport { DataTableStatus } from './DataTableStatus';\nimport type { DataTableSort } from './DataTableSort';\nimport { DataTableSortDirection } from './DataTableSortDirection';\nimport { DataTableRowProcessing } from './DataTableRowProcessing';\nimport { useControllableState } from './useControllableState';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** Event emitted when a DataTable row is activated. */\nexport interface DataTableRowClickEvent<TData> {\n /** Activated row data. */\n data: TData;\n /** Loaded-page row index. */\n index: number;\n}\n\n/** Stable Cratis-owned parts for styling a {@link DataTableCore}. */\nexport interface DataTableParts {\n /** Outer table composition. */\n root?: HTMLAttributes<HTMLDivElement>;\n /** Loaded-page search wrapper. */\n search?: HTMLAttributes<HTMLDivElement>;\n /** Loaded-page search input. */\n searchInput?: React.InputHTMLAttributes<HTMLInputElement>;\n /** Scroll container. */\n tableContainer?: HTMLAttributes<HTMLDivElement>;\n /** Semantic table element. */\n table?: TableHTMLAttributes<HTMLTableElement>;\n /** Table head. */\n head?: HTMLAttributes<HTMLTableSectionElement>;\n /** Header row. */\n headerRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Header cell. */\n headerCell?: ThHTMLAttributes<HTMLTableCellElement>;\n /** Table body. */\n body?: HTMLAttributes<HTMLTableSectionElement>;\n /** Data row. */\n row?: HTMLAttributes<HTMLTableRowElement>;\n /** Data cell. */\n cell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Empty-state row. */\n emptyRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Empty-state cell. */\n emptyCell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Loading-state row. */\n loadingRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Loading-state cell. */\n loadingCell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Failed or unauthorized row. */\n failureRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Failed or unauthorized cell. */\n failureCell?: TdHTMLAttributes<HTMLTableCellElement>;\n}\n\n/** Props for the semantic loaded-page DataTable renderer. */\nexport interface DataTableCoreProps<TData extends object> {\n /** Loaded page rows. */\n data: TData[];\n /** Declarative {@link Column} markers. */\n children?: ReactNode;\n /** Row property used as stable identity. Required to preserve selection across refreshed row objects. */\n dataKey?: string;\n /** Content shown when the loaded page has no matching rows. */\n emptyMessage: ReactNode;\n /** Table display state. Defaults to ready. */\n status?: DataTableStatus;\n /** Message shown while loading without rows. */\n loadingMessage?: ReactNode;\n /** Message shown for a failed query. */\n failureMessage?: ReactNode;\n /** Message shown for an unauthorized query. */\n unauthorizedMessage?: ReactNode;\n /**\n * Enables row selection. `'single'` selects one row at a time through row activation;\n * `'multiple'` adds per-row checkboxes and a select-all header checkbox, and reports through\n * {@link onSelectedItemsChange} rather than {@link onSelectionChange}.\n */\n selectionMode?: 'single' | 'multiple';\n /** Accessible name for row selection controls. Falls back to the provider's `dataTable.selectRow` message, then `'Select row'`. */\n selectionAriaLabel?: string;\n /** Accessible name for the select-all control. Falls back to the provider's `dataTable.selectAllRows` message, then `'Select all rows'`. */\n selectAllAriaLabel?: string;\n /** Controlled selected row. Applies to `selectionMode='single'`. */\n selection?: TData | null;\n /** Invoked when the single-row selection changes. */\n onSelectionChange?: (event: DataTableSelectionChangeEvent<TData>) => void;\n /** Controlled selected rows. Applies to `selectionMode='multiple'`. */\n selectedItems?: TData[];\n /** Invoked with the full set of selected rows when a multiple selection changes. */\n onSelectedItemsChange?: (items: TData[]) => void;\n /** Invoked when a row is clicked or keyboard activated. */\n onRowClick?: (event: DataTableRowClickEvent<TData>) => void;\n /** Builds an extra class name for one row. */\n rowClassName?: (rowData: TData) => string;\n /** Row fields searched on the loaded page. */\n globalFilterFields?: string[];\n /** Placeholder for the loaded-page search input. Falls back to the provider's `dataTable.search` message, then `'Search…'`. */\n globalSearchPlaceholder?: string;\n /** Accessible name for the loaded-page search input. Falls back to the provider's `dataTable.searchAriaLabel` message, then `'Search table'`. */\n globalSearchAriaLabel?: string;\n /** Initial per-field filter constraints. */\n defaultFilters?: DataTableFilterMeta;\n /** Controlled per-field filter constraints. Leave undefined to let the table keep its own. */\n filters?: DataTableFilterMeta;\n /** Invoked when applied field filters change. */\n onFilter?: (filters: DataTableFilterMeta) => void;\n /** Controlled search text. Leave undefined to let the table keep its own. */\n globalFilter?: string;\n /** Invoked when the search text changes. */\n onGlobalFilterChange?: (globalFilter: string) => void;\n /** Controlled sort; null means not sorted. Leave undefined to let the table keep its own. */\n sort?: DataTableSort | null;\n /** Invoked when a sortable column header changes the sort. */\n onSortChange?: (sort: DataTableSort | null) => void;\n /**\n * Whether the table filters and sorts the rows it is given (default:\n * {@link DataTableRowProcessing.Loaded}). Use {@link DataTableRowProcessing.None} when the\n * source already applied the controlled filter and sort state.\n */\n rowProcessing?: DataTableRowProcessing;\n /** Enables the bounded scroll container. */\n scrollable?: boolean;\n /** Scroll-container maximum height. */\n scrollHeight?: string;\n /** Extra class name for the table composition. */\n className?: string;\n /** Inline style for the table composition. */\n style?: CSSProperties;\n /** Cratis-owned per-part attributes. */\n pt?: DataTableParts;\n /**\n * @deprecated Cratis parts always merge. Remove this renderer-era option.\n */\n ptOptions?: object;\n /**\n * @deprecated Components always uses consumer-owned CSS. Customize through `pt` and CSS instead.\n */\n unstyled?: boolean;\n}\n\nconst useColumns = (children: ReactNode): React.ReactElement<ColumnProps<any>>[] =>\n useMemo(\n () =>\n React.Children.toArray(children).filter(\n React.isValidElement,\n ) as React.ReactElement<ColumnProps<any>>[],\n [children],\n );\n\ntype CellValue =\n string | number | boolean | bigint | symbol | Date | object | null | undefined;\n\nconst asCellValue = (value: unknown): CellValue =>\n typeof value === 'function' ? String(value) : (value as CellValue);\n\nconst valueAtPath = (\n row: Record<string, unknown>,\n path: string | undefined,\n): CellValue => {\n if (!path) return undefined;\n let current: CellValue = row;\n for (const segment of path.split('.')) {\n if (current === null || typeof current !== 'object') return undefined;\n const record = current as Record<string, unknown>;\n if (!Object.hasOwn(record, segment)) return undefined;\n current = asCellValue(record[segment]);\n }\n return current;\n};\n\nconst renderCellContent = (\n column: ColumnProps<any>,\n row: Record<string, unknown>,\n): ReactNode => {\n if (column.body) return column.body(row);\n const value = valueAtPath(row, column.field);\n return value == null ? '' : String(value);\n};\n\nconst dateNumber = (value: unknown) => {\n // A cloned Date is normalized in place so caller-owned Date instances (row\n // values and filter constraints alike) are never mutated by comparison.\n const date =\n value instanceof Date ? new Date(value.getTime()) : new Date(String(value));\n return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);\n};\n\nconst firstConstraint = (\n entry: DataTableFilterEntry | undefined,\n): DataTableFilterConstraint | undefined =>\n entry && 'constraints' in entry ? entry.constraints[0] : entry;\n\nconst builtInMatches = (\n value: unknown,\n constraint: DataTableFilterConstraint,\n): boolean => {\n const filter = constraint.value;\n const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;\n if (filter === null || filter === undefined || filter === '') return true;\n\n const valueText = String(value ?? '').toLocaleLowerCase();\n const filterText = String(filter).toLocaleLowerCase();\n const valueNumber = typeof value === 'number' ? value : Number(value);\n const filterNumber = typeof filter === 'number' ? filter : Number(filter);\n\n switch (mode) {\n case DataTableFilterMatchMode.StartsWith:\n return valueText.startsWith(filterText);\n case DataTableFilterMatchMode.Contains:\n return valueText.includes(filterText);\n case DataTableFilterMatchMode.NotContains:\n return !valueText.includes(filterText);\n case DataTableFilterMatchMode.EndsWith:\n return valueText.endsWith(filterText);\n case DataTableFilterMatchMode.Equals:\n return Object.is(value, filter) || valueText === filterText;\n case DataTableFilterMatchMode.NotEquals:\n return !(Object.is(value, filter) || valueText === filterText);\n case DataTableFilterMatchMode.In:\n return Array.isArray(filter) && filter.some((item) => Object.is(item, value));\n case DataTableFilterMatchMode.Between:\n return (\n Array.isArray(filter) &&\n filter.length >= 2 &&\n valueNumber >= Number(filter[0]) &&\n valueNumber <= Number(filter[1])\n );\n case DataTableFilterMatchMode.LessThan:\n return valueNumber < filterNumber;\n case DataTableFilterMatchMode.LessThanOrEqual:\n return valueNumber <= filterNumber;\n case DataTableFilterMatchMode.GreaterThan:\n return valueNumber > filterNumber;\n case DataTableFilterMatchMode.GreaterThanOrEqual:\n return valueNumber >= filterNumber;\n case DataTableFilterMatchMode.DateIs:\n return dateNumber(value) === dateNumber(filter);\n case DataTableFilterMatchMode.DateIsNot:\n return dateNumber(value) !== dateNumber(filter);\n case DataTableFilterMatchMode.DateBefore:\n return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);\n case DataTableFilterMatchMode.DateAfter:\n return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);\n default:\n return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;\n }\n};\n\nconst matchesFilterEntry = (value: unknown, entry: DataTableFilterEntry) => {\n if (!('constraints' in entry)) return builtInMatches(value, entry);\n if (entry.constraints.length === 0) return true;\n\n const matches = entry.constraints.map((constraint) =>\n builtInMatches(value, constraint),\n );\n return entry.operator?.toLowerCase() === 'or'\n ? matches.some(Boolean)\n : matches.every(Boolean);\n};\n\nconst compareValues = (left: unknown, right: unknown): number => {\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (left instanceof Date && right instanceof Date)\n return left.getTime() - right.getTime();\n return String(left ?? '').localeCompare(String(right ?? ''), undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n};\n\nconst classNames = (...values: Array<string | undefined>) =>\n values.filter(Boolean).join(' ');\n\n/** A semantic, renderer-independent data table over one already-loaded page. */\nexport const DataTableCore = <TData extends object>({\n data,\n children,\n dataKey,\n emptyMessage,\n status = DataTableStatus.Ready,\n loadingMessage,\n failureMessage,\n unauthorizedMessage,\n selectionMode,\n selectionAriaLabel,\n selectAllAriaLabel,\n selection,\n onSelectionChange,\n selectedItems,\n onSelectedItemsChange,\n onRowClick,\n rowClassName,\n globalFilterFields,\n globalSearchPlaceholder,\n globalSearchAriaLabel,\n defaultFilters,\n filters: filtersProp,\n onFilter,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n sort: sortProp,\n onSortChange,\n rowProcessing = DataTableRowProcessing.Loaded,\n scrollable,\n scrollHeight,\n className,\n style,\n pt,\n}: DataTableCoreProps<TData>) => {\n const { messages } = useCratisComponentsConfig();\n const dataTableMessages = messages?.dataTable;\n const resolvedSelectionAriaLabel =\n selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row';\n const resolvedSelectAllAriaLabel =\n selectAllAriaLabel ?? dataTableMessages?.selectAllRows ?? 'Select all rows';\n const resolvedGlobalSearchPlaceholder =\n globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…';\n const resolvedGlobalSearchAriaLabel =\n globalSearchAriaLabel ?? dataTableMessages?.searchAriaLabel ?? 'Search table';\n const resolvedLoadingMessage = loadingMessage ?? dataTableMessages?.loading ?? 'Loading…';\n const resolvedFailureMessage =\n failureMessage ?? dataTableMessages?.failed ?? 'Could not load data.';\n const resolvedUnauthorizedMessage =\n unauthorizedMessage ?? dataTableMessages?.unauthorized ??\n 'You are not authorized to view this data.';\n const isBusy = status === DataTableStatus.Loading && data.length > 0;\n const icon = useCratisIcon();\n const sortAscendingIcon = icon('sortAscending', '▲');\n const sortDescendingIcon = icon('sortDescending', '▼');\n const columns = useColumns(children);\n const selectionGroupName = useId();\n const [filters, setFilters] = useControllableState<DataTableFilterMeta>(filtersProp, defaultFilters ?? {}, onFilter);\n const [globalFilter, setGlobalFilter] = useControllableState(globalFilterProp, '', onGlobalFilterChange);\n const [sort, setSort] = useControllableState<DataTableSort | null>(sortProp, null, onSortChange);\n\n const filteredRows = useMemo(() => {\n if (rowProcessing === DataTableRowProcessing.None) {\n return data.map((row, loadedIndex) => ({ row, loadedIndex }));\n }\n const term = globalFilter.trim().toLocaleLowerCase();\n const rows = data\n .map((row, loadedIndex) => ({ row, loadedIndex }))\n .filter(({ row }) => {\n const rowValues = row as Record<string, unknown>;\n const matchesColumns = Object.entries(filters).every(([field, entry]) =>\n matchesFilterEntry(valueAtPath(rowValues, field), entry),\n );\n if (!matchesColumns) return false;\n if (!term || !globalFilterFields?.length) return true;\n return globalFilterFields.some((field) =>\n String(valueAtPath(rowValues, field) ?? '')\n .toLocaleLowerCase()\n .includes(term),\n );\n });\n\n if (!sort) return rows;\n return [...rows].sort((left, right) => {\n const comparison = compareValues(\n valueAtPath(left.row as Record<string, unknown>, sort.field),\n valueAtPath(right.row as Record<string, unknown>, sort.field),\n );\n return sort.direction === 'ascending' ? comparison : -comparison;\n });\n }, [data, filters, globalFilter, globalFilterFields, sort, rowProcessing]);\n\n const updateFilter = (\n field: string,\n constraint: DataTableFilterConstraint | undefined,\n ) => {\n const next = { ...filters };\n if (constraint) next[field] = constraint;\n else delete next[field];\n setFilters(next);\n };\n\n const activateRow = (\n row: TData,\n index: number,\n originalEvent: React.SyntheticEvent,\n ) => {\n onRowClick?.({ data: row, index });\n if (selectionMode === 'single') {\n onSelectionChange?.({ value: row, originalEvent });\n }\n if (selectionMode === 'multiple') {\n toggleRowSelection(row);\n }\n };\n\n const dataKeyIdentity = (row: TData) =>\n String(valueAtPath(row as Record<string, unknown>, dataKey!));\n const dataKeyCounts = useMemo(() => {\n const counts = new Map<string, number>();\n if (!dataKey) return counts;\n for (const row of data) {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n counts.set(identity, (counts.get(identity) ?? 0) + 1);\n }\n return counts;\n }, [data, dataKey]);\n const firstLoadedIndexByDataKey = useMemo(() => {\n const indices = new Map<string, number>();\n if (!dataKey) return indices;\n data.forEach((row, loadedIndex) => {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n if (!indices.has(identity)) indices.set(identity, loadedIndex);\n });\n return indices;\n }, [data, dataKey]);\n const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;\n const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;\n const isSelectedRow = (row: TData, loadedIndex: number) => {\n if (!selection) return false;\n if (!dataKey) return loadedIndex === selectedLoadedIndex;\n\n const identity = dataKeyIdentity(row);\n if (identity !== selectedDataKey) return false;\n if ((dataKeyCounts.get(identity) ?? 0) <= 1) return true;\n if (selectedLoadedIndex >= 0) return loadedIndex === selectedLoadedIndex;\n return loadedIndex === firstLoadedIndexByDataKey.get(identity);\n };\n\n // Membership is by dataKey when there is one, and by object identity otherwise. A table whose\n // rows are replaced wholesale on every refresh - which is every observable query - keeps its\n // selection only in the first case, which is why dataKey matters here as much as it does for\n // single selection.\n const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);\n const isRowSelected = (row: TData) =>\n dataKey\n ? selectedItemsList.some(\n (selected) => dataKeyIdentity(selected) === dataKeyIdentity(row),\n )\n : selectedItemsList.includes(row);\n\n const toggleRowSelection = (row: TData) => {\n const next = isRowSelected(row)\n ? selectedItemsList.filter((selected) =>\n dataKey\n ? dataKeyIdentity(selected) !== dataKeyIdentity(row)\n : selected !== row,\n )\n : [...selectedItemsList, row];\n onSelectedItemsChange?.(next);\n };\n\n // Select-all means the rows the user can currently see. A filtered table that silently selected\n // rows hidden behind the filter would act on more than it showed, which is the whole hazard of a\n // bulk action.\n const visibleRows = filteredRows.map(({ row }) => row);\n const isVisibleRow = (row: TData) =>\n dataKey\n ? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))\n : visibleRows.includes(row);\n const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;\n const allFilteredRowsSelected =\n visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;\n const someFilteredRowsSelected =\n selectedVisibleCount > 0 && !allFilteredRowsSelected;\n const selectAllRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someFilteredRowsSelected;\n }\n }, [someFilteredRowsSelected]);\n\n const toggleSelectAll = () => {\n if (allFilteredRowsSelected) {\n onSelectedItemsChange?.(\n selectedItemsList.filter((selected) => !isVisibleRow(selected)),\n );\n return;\n }\n const additions = visibleRows.filter((row) => !isRowSelected(row));\n onSelectedItemsChange?.([...selectedItemsList, ...additions]);\n };\n\n\n return (\n <div\n {...pt?.root}\n className={classNames(\n 'cratis-datatable',\n scrollable ? 'cratis-datatable--scrollable' : undefined,\n pt?.root?.className,\n className,\n )}\n style={{ ...pt?.root?.style, ...style }}\n data-cratis-part='root'\n data-busy={isBusy || undefined}\n >\n {!!globalFilterFields?.length && (\n <div\n {...pt?.search}\n className={classNames(\n 'cratis-datatable-search',\n pt?.search?.className,\n )}\n data-cratis-part='search'\n >\n <input\n {...pt?.searchInput}\n value={globalFilter}\n placeholder={resolvedGlobalSearchPlaceholder}\n aria-label={resolvedGlobalSearchAriaLabel}\n className={classNames(\n 'cratis-datatable-search__input',\n pt?.searchInput?.className,\n )}\n data-cratis-part='search-input'\n onChange={(event) => setGlobalFilter(event.target.value)}\n />\n </div>\n )}\n <div\n {...pt?.tableContainer}\n className={classNames(\n 'cratis-datatable__container',\n pt?.tableContainer?.className,\n )}\n style={{\n ...pt?.tableContainer?.style,\n ...(scrollable\n ? { maxHeight: scrollHeight ?? '100%', overflow: 'auto' }\n : {}),\n }}\n data-cratis-part='table-container'\n >\n <table\n {...pt?.table}\n className={classNames(\n 'cratis-datatable__table',\n pt?.table?.className,\n )}\n data-cratis-part='table'\n aria-busy={isBusy || undefined}\n >\n <thead\n {...pt?.head}\n className={classNames(\n 'cratis-datatable__head',\n pt?.head?.className,\n )}\n data-cratis-part='head'\n >\n <tr\n {...pt?.headerRow}\n className={classNames(\n 'cratis-datatable__header-row',\n pt?.headerRow?.className,\n )}\n data-cratis-part='header-row'\n >\n {columns.map((column, index) => {\n const field =\n column.props.filterField ?? column.props.field;\n const ariaSort =\n sort && sort.field === column.props.field\n ? sort.direction\n : undefined;\n return (\n <th\n key={index}\n {...pt?.headerCell}\n scope='col'\n aria-label={\n column.props.selectionMode\n ? resolvedSelectionAriaLabel\n : undefined\n }\n aria-sort={ariaSort}\n style={{\n ...pt?.headerCell?.style,\n ...column.props.style,\n ...column.props.headerStyle,\n }}\n className={classNames(\n 'cratis-datatable__header-cell',\n pt?.headerCell?.className,\n column.props.headerClassName,\n )}\n data-cratis-part='header-cell'\n data-selected={Boolean(ariaSort) || undefined}\n >\n <div\n className='cratis-datatable-header-cell'\n data-cratis-part='header-content'\n data-selected={Boolean(ariaSort) || undefined}\n >\n {column.props.selectionMode ===\n 'multiple' ? (\n <input\n type='checkbox'\n aria-label={\n resolvedSelectAllAriaLabel\n }\n data-cratis-part='select-all'\n checked={allFilteredRowsSelected}\n ref={selectAllRef}\n onChange={toggleSelectAll}\n />\n ) : (\n column.props.selectionMode && (\n <span className='cratis-datatable__sr-only'>\n {resolvedSelectionAriaLabel}\n </span>\n )\n )}\n {column.props.sortable &&\n column.props.field ? (\n <button\n type='button'\n className='cratis-datatable__sort'\n data-cratis-part='sort'\n data-pressed={\n Boolean(ariaSort) || undefined\n }\n onClick={() =>\n setSort({\n field: column.props\n .field as string,\n direction:\n sort?.field ===\n column.props.field &&\n sort?.direction ===\n DataTableSortDirection.Ascending\n ? DataTableSortDirection.Descending\n : DataTableSortDirection.Ascending,\n })\n }\n >\n <span>{column.props.header}</span>\n {ariaSort && (\n <span aria-hidden='true'>\n {ariaSort === 'ascending'\n ? sortAscendingIcon\n : sortDescendingIcon}\n </span>\n )}\n </button>\n ) : (\n column.props.header\n )}\n {column.props.filter && field && (\n <ColumnFilterMenu\n field={field}\n dataType={column.props.dataType}\n placeholder={\n column.props.filterPlaceholder\n }\n showMatchModes={\n column.props.showFilterMatchModes\n }\n filterElement={\n column.props.filterElement\n }\n filterOptions={\n column.props.filterOptions\n }\n labels={column.props.filterLabels}\n pt={column.props.filterPt}\n constraint={firstConstraint(\n filters[field],\n )}\n onApply={(constraint) =>\n updateFilter(field, constraint)\n }\n onClear={() =>\n updateFilter(field, undefined)\n }\n />\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody\n {...pt?.body}\n className={classNames(\n 'cratis-datatable__body',\n pt?.body?.className,\n )}\n data-cratis-part='body'\n >\n {status === DataTableStatus.Failed ||\n status === DataTableStatus.Unauthorized ? (\n <tr\n key={status}\n {...pt?.failureRow}\n className={classNames(\n 'cratis-datatable__failure-row',\n pt?.failureRow?.className,\n )}\n data-cratis-part='failure-row'\n data-reason={status}\n >\n <td\n {...pt?.failureCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__failure-cell',\n pt?.failureCell?.className,\n )}\n data-cratis-part='failure-cell'\n >\n <div role='alert'>\n {status === DataTableStatus.Failed\n ? resolvedFailureMessage\n : resolvedUnauthorizedMessage}\n </div>\n </td>\n </tr>\n ) : status === DataTableStatus.Loading && data.length === 0 ? (\n <tr\n key={status}\n {...pt?.loadingRow}\n className={classNames(\n 'cratis-datatable__loading-row',\n pt?.loadingRow?.className,\n )}\n data-cratis-part='loading-row'\n >\n <td\n {...pt?.loadingCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__loading-cell',\n pt?.loadingCell?.className,\n )}\n data-cratis-part='loading-cell'\n >\n <div role='status'>{resolvedLoadingMessage}</div>\n </td>\n </tr>\n ) : filteredRows.length === 0 ? (\n <tr\n {...pt?.emptyRow}\n className={classNames(\n 'cratis-datatable__empty-row',\n pt?.emptyRow?.className,\n )}\n data-cratis-part='empty-row'\n >\n <td\n {...pt?.emptyCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__empty-cell',\n pt?.emptyCell?.className,\n )}\n data-cratis-part='empty-cell'\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n filteredRows.map(({ row, loadedIndex }) => {\n const identity = dataKey\n ? dataKeyIdentity(row)\n : 'loaded-row';\n const rowKey = `${identity}::${loadedIndex}`;\n const isSelected =\n selectionMode === 'single' &&\n isSelectedRow(row, loadedIndex);\n const isInteractive =\n Boolean(onRowClick) ||\n selectionMode === 'single' ||\n selectionMode === 'multiple';\n return (\n <tr\n key={rowKey}\n {...pt?.row}\n tabIndex={isInteractive ? 0 : pt?.row?.tabIndex}\n aria-selected={\n selectionMode === 'single'\n ? isSelected\n : undefined\n }\n className={classNames(\n 'cratis-datatable__row',\n pt?.row?.className,\n rowClassName?.(row),\n )}\n data-cratis-part='row'\n data-selected={isSelected || undefined}\n data-interactive={isInteractive || undefined}\n onClick={(event) =>\n activateRow(row, loadedIndex, event)\n }\n onKeyDown={(event) => {\n if (\n event.target !== event.currentTarget ||\n (event.key !== 'Enter' &&\n event.key !== ' ')\n ) {\n return;\n }\n event.preventDefault();\n activateRow(row, loadedIndex, event);\n }}\n >\n {columns.map((column, columnIndex) => (\n <td\n key={columnIndex}\n {...pt?.cell}\n style={{\n ...pt?.cell?.style,\n ...column.props.style,\n ...column.props.bodyStyle,\n }}\n className={classNames(\n 'cratis-datatable__cell',\n pt?.cell?.className,\n column.props.bodyClassName ??\n column.props.className,\n )}\n data-cratis-part='cell'\n data-selected={isSelected || undefined}\n >\n {column.props.selectionMode ===\n 'multiple' ? (\n <input\n type='checkbox'\n aria-label={\n resolvedSelectionAriaLabel\n }\n checked={isRowSelected(row)}\n onClick={(event) =>\n event.stopPropagation()\n }\n onChange={() =>\n toggleRowSelection(row)\n }\n />\n ) : column.props.selectionMode ? (\n <input\n type='radio'\n name={selectionGroupName}\n readOnly\n tabIndex={-1}\n aria-label={\n resolvedSelectionAriaLabel\n }\n checked={isSelected}\n />\n ) : (\n renderCellContent(\n column.props,\n row as Record<string, unknown>,\n )\n )}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Whether a data table filters and sorts the rows it is given. */
2
+ export declare enum DataTableRowProcessing {
3
+ /** Filter and sort the rows the table was given, such as the loaded page (default). */
4
+ Loaded = "loaded",
5
+ /**
6
+ * Render the rows exactly as given. Use when the source already applied the table's filter and
7
+ * sort state, for example a server query driven by the controlled `filters` and `sort` props.
8
+ */
9
+ None = "none"
10
+ }
11
+ //# sourceMappingURL=DataTableRowProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableRowProcessing.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableRowProcessing.ts"],"names":[],"mappings":"AAGA,mEAAmE;AACnE,oBAAY,sBAAsB;IAC9B,uFAAuF;IACvF,MAAM,WAAW;IACjB;;;OAGG;IACH,IAAI,SAAS;CAChB"}
@@ -0,0 +1,8 @@
1
+ var DataTableRowProcessing;
2
+ (function (DataTableRowProcessing) {
3
+ DataTableRowProcessing["Loaded"] = "loaded";
4
+ DataTableRowProcessing["None"] = "none";
5
+ })(DataTableRowProcessing || (DataTableRowProcessing = {}));
6
+
7
+ export { DataTableRowProcessing };
8
+ //# sourceMappingURL=DataTableRowProcessing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableRowProcessing.js","sources":["../../../DataTables/DataTableRowProcessing.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** Whether a data table filters and sorts the rows it is given. */\nexport enum DataTableRowProcessing {\n /** Filter and sort the rows the table was given, such as the loaded page (default). */\n Loaded = 'loaded',\n /**\n * Render the rows exactly as given. Use when the source already applied the table's filter and\n * sort state, for example a server query driven by the controlled `filters` and `sort` props.\n */\n None = 'none',\n}\n"],"names":[],"mappings":"IAIY;AAAZ,CAAA,UAAY,sBAAsB,EAAA;AAE9B,IAAA,sBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AAKjB,IAAA,sBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACjB,CAAC,EARW,sBAAsB,KAAtB,sBAAsB,GAAA,EAAA,CAAA,CAAA;;"}
@@ -0,0 +1,9 @@
1
+ import type { DataTableSortDirection } from './DataTableSortDirection.js';
2
+ /** The column a data table is sorted by, and in which direction. */
3
+ export interface DataTableSort {
4
+ /** The sorted column's field. */
5
+ field: string;
6
+ /** The sort direction. */
7
+ direction: DataTableSortDirection;
8
+ }
9
+ //# sourceMappingURL=DataTableSort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableSort.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableSort.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA0B,CAAC;AAEvE,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC1B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,SAAS,EAAE,sBAAsB,CAAC;CACrC"}
@@ -0,0 +1,4 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ export {};
4
+ //# sourceMappingURL=DataTableSort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableSort.js","sourceRoot":"","sources":["../../../DataTables/DataTableSort.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { DataTableSortDirection } from './DataTableSortDirection';\n\n/** The column a data table is sorted by, and in which direction. */\nexport interface DataTableSort {\n /** The sorted column's field. */\n field: string;\n /** The sort direction. */\n direction: DataTableSortDirection;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /** The direction a data table column is sorted in. */
2
+ export declare enum DataTableSortDirection {
3
+ /** Smallest value first. */
4
+ Ascending = "ascending",
5
+ /** Largest value first. */
6
+ Descending = "descending"
7
+ }
8
+ //# sourceMappingURL=DataTableSortDirection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableSortDirection.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableSortDirection.ts"],"names":[],"mappings":"AAGA,sDAAsD;AACtD,oBAAY,sBAAsB;IAC9B,4BAA4B;IAC5B,SAAS,cAAc;IACvB,2BAA2B;IAC3B,UAAU,eAAe;CAC5B"}
@@ -0,0 +1,8 @@
1
+ var DataTableSortDirection;
2
+ (function (DataTableSortDirection) {
3
+ DataTableSortDirection["Ascending"] = "ascending";
4
+ DataTableSortDirection["Descending"] = "descending";
5
+ })(DataTableSortDirection || (DataTableSortDirection = {}));
6
+
7
+ export { DataTableSortDirection };
8
+ //# sourceMappingURL=DataTableSortDirection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableSortDirection.js","sources":["../../../DataTables/DataTableSortDirection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** The direction a data table column is sorted in. */\nexport enum DataTableSortDirection {\n /** Smallest value first. */\n Ascending = 'ascending',\n /** Largest value first. */\n Descending = 'descending',\n}\n"],"names":[],"mappings":"IAIY;AAAZ,CAAA,UAAY,sBAAsB,EAAA;AAE9B,IAAA,sBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AAEvB,IAAA,sBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AAC7B,CAAC,EALW,sBAAsB,KAAtB,sBAAsB,GAAA,EAAA,CAAA,CAAA;;"}
@@ -7,5 +7,8 @@ export * from './ColumnFilterMenu.js';
7
7
  export * from './TablePaginator.js';
8
8
  export * from './DataTableSelectionChangeEvent.js';
9
9
  export * from './DataTableFilterMeta.js';
10
+ export type { DataTableSort } from './DataTableSort.js';
11
+ export { DataTableSortDirection } from './DataTableSortDirection.js';
12
+ export { DataTableRowProcessing } from './DataTableRowProcessing.js';
10
13
  export { registerDataTableFilterMatcher, resolveDataTableFilterMatcher, unregisterDataTableFilterMatcher, type DataTableFilterMatcherRegistration, } from './DataTableFilterMatcherRegistry.js';
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../DataTables/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAiB,CAAC;AAChC,cAAc,sBAAmB,CAAC;AAClC,cAAc,wBAAqB,CAAC;AACpC,cAAc,kCAA+B,CAAC;AAC9C,cAAc,aAAU,CAAC;AACzB,cAAc,uBAAoB,CAAC;AACnC,cAAc,qBAAkB,CAAC;AACjC,cAAc,oCAAiC,CAAC;AAChD,cAAc,0BAAuB,CAAC;AACtC,OAAO,EACH,8BAA8B,EAC9B,6BAA6B,EAC7B,gCAAgC,EAChC,KAAK,kCAAkC,GAC1C,MAAM,qCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../DataTables/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAiB,CAAC;AAChC,cAAc,sBAAmB,CAAC;AAClC,cAAc,wBAAqB,CAAC;AACpC,cAAc,kCAA+B,CAAC;AAC9C,cAAc,aAAU,CAAC;AACzB,cAAc,uBAAoB,CAAC;AACnC,cAAc,qBAAkB,CAAC;AACjC,cAAc,oCAAiC,CAAC;AAChD,cAAc,0BAAuB,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAiB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA0B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA0B,CAAC;AAClE,OAAO,EACH,8BAA8B,EAC9B,6BAA6B,EAC7B,gCAAgC,EAChC,KAAK,kCAAkC,GAC1C,MAAM,qCAAkC,CAAC"}
@@ -6,5 +6,7 @@ export { Column } from './Column.js';
6
6
  export { ColumnFilterMenu, defaultColumnFilterMenuLabels } from './ColumnFilterMenu.js';
7
7
  export { TablePaginator } from './TablePaginator.js';
8
8
  export { DataTableFilterMatchMode } from './DataTableFilterMeta.js';
9
+ export { DataTableSortDirection } from './DataTableSortDirection.js';
10
+ export { DataTableRowProcessing } from './DataTableRowProcessing.js';
9
11
  export { registerDataTableFilterMatcher, resolveDataTableFilterMatcher, unregisterDataTableFilterMatcher } from './DataTableFilterMatcherRegistry.js';
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * State that the owner controls when it passes a value, and that the component keeps itself when
3
+ * the value is undefined. Changes are always reported through the change handler.
4
+ * @param value The controlled value, or undefined to let the component keep its own state.
5
+ * @param defaultValue The initial value while uncontrolled.
6
+ * @param onChange Called with every new value.
7
+ * @returns The current value and a setter.
8
+ */
9
+ export declare const useControllableState: <TValue>(value: TValue | undefined, defaultValue: TValue, onChange: ((next: TValue) => void) | undefined) => [TValue, (next: TValue) => void];
10
+ //# sourceMappingURL=useControllableState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useControllableState.d.ts","sourceRoot":"","sources":["../../../DataTables/useControllableState.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAAI,MAAM,SAChC,MAAM,GAAG,SAAS,gBACX,MAAM,YACV,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,KAC/C,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAQjC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { useState, useCallback } from 'react';
2
+
3
+ const useControllableState = (value, defaultValue, onChange) => {
4
+ const [internal, setInternal] = useState(defaultValue);
5
+ const controlled = value !== undefined;
6
+ const set = useCallback((next) => {
7
+ if (!controlled)
8
+ setInternal(next);
9
+ onChange?.(next);
10
+ }, [controlled, onChange]);
11
+ return [controlled ? value : internal, set];
12
+ };
13
+
14
+ export { useControllableState };
15
+ //# sourceMappingURL=useControllableState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useControllableState.js","sources":["../../../DataTables/useControllableState.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback, useState } from 'react';\n\n/**\n * State that the owner controls when it passes a value, and that the component keeps itself when\n * the value is undefined. Changes are always reported through the change handler.\n * @param value The controlled value, or undefined to let the component keep its own state.\n * @param defaultValue The initial value while uncontrolled.\n * @param onChange Called with every new value.\n * @returns The current value and a setter.\n */\nexport const useControllableState = <TValue>(\n value: TValue | undefined,\n defaultValue: TValue,\n onChange: ((next: TValue) => void) | undefined,\n): [TValue, (next: TValue) => void] => {\n const [internal, setInternal] = useState(defaultValue);\n const controlled = value !== undefined;\n const set = useCallback((next: TValue) => {\n if (!controlled) setInternal(next);\n onChange?.(next);\n }, [controlled, onChange]);\n return [controlled ? value : internal, set];\n};\n"],"names":[],"mappings":";;AAaO,MAAM,oBAAoB,GAAG,CAChC,KAAyB,EACzB,YAAoB,EACpB,QAA8C,KACZ;IAClC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC;AACtD,IAAA,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS;AACtC,IAAA,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,IAAY,KAAI;AACrC,QAAA,IAAI,CAAC,UAAU;YAAE,WAAW,CAAC,IAAI,CAAC;AAClC,QAAA,QAAQ,GAAG,IAAI,CAAC;AACpB,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC1B,IAAA,OAAO,CAAC,UAAU,GAAG,KAAK,GAAG,QAAQ,EAAE,GAAG,CAAC;AAC/C;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../Toolbar/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC;AAM9D,kDAAkD;AAClD,MAAM,WAAW,YAAY;IACzB,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACzC;AAKD,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IACzB,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,CAAC;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;CACrE;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,iJAUjB,YAAY,gCA+Bd,CAAC"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../Toolbar/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC;AAO9D,kDAAkD;AAClD,MAAM,WAAW,YAAY;IACzB,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACzC;AAKD,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IACzB,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,CAAC;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;CACrE;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,iJAUjB,YAAY,gCAiCd,CAAC"}
@@ -2,6 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { ToolbarDragContext } from './ToolbarDragContext.js';
3
3
  import { ToolbarFocusMode } from '../Common/ToolbarFocusMode.js';
4
4
  import { useToolbarKeyboardNavigation } from '../Common/useToolbarKeyboardNavigation.js';
5
+ import { ToolbarRovingContext } from '../Common/ToolbarRovingContext.js';
5
6
  import 'react';
6
7
  import 'react-aria-components/I18nProvider';
7
8
  import 'ts-deepmerge';
@@ -11,7 +12,7 @@ import '../Notifications/toast.js';
11
12
  import '../renderer/RendererContext.js';
12
13
 
13
14
  const Toolbar = ({ children, orientation = 'vertical', focusMode = ToolbarFocusMode.Arrows, draggable = false, onItemDragStart, className, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, pt, }) => {
14
- const { rootRef, onKeyDown } = useToolbarKeyboardNavigation(orientation, focusMode);
15
+ const { rootRef, onKeyDown, roving } = useToolbarKeyboardNavigation(orientation, focusMode);
15
16
  const { messages } = useCratisComponentsConfig();
16
17
  const resolvedAriaLabel = ariaLabel ?? messages?.toolbar?.label ?? 'Tools';
17
18
  return (jsx(ToolbarDragContext.Provider, { value: { draggable, onItemDragStart }, children: jsx("div", { ...pt?.root, ref: rootRef, onKeyDown: event => { pt?.root?.onKeyDown?.(event); if (!event.isPropagationStopped())
@@ -23,7 +24,7 @@ const Toolbar = ({ children, orientation = 'vertical', focusMode = ToolbarFocusM
23
24
  className,
24
25
  ]
25
26
  .filter(Boolean)
26
- .join(' '), "data-cratis-part": 'root', "data-orientation": orientation, children: children }) }));
27
+ .join(' '), "data-cratis-part": 'root', "data-orientation": orientation, children: jsx(ToolbarRovingContext.Provider, { value: roving, children: children }) }) }));
27
28
  };
28
29
 
29
30
  export { Toolbar };
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.js","sources":["../../../Toolbar/Toolbar.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { type HTMLAttributes, type ReactNode } from 'react';\nimport { ToolbarDragContext } from './ToolbarDragContext';\nimport { ToolbarFocusMode } from '../Common/ToolbarFocusMode';\nimport { useToolbarKeyboardNavigation } from '../Common/useToolbarKeyboardNavigation';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport type { ExactPartKeys } from '../types/ExactPartKeys';\nimport type { PartsOf } from '../types/parts';\n\n/** Stable part attributes for {@link Toolbar}. */\nexport interface ToolbarParts {\n /** Toolbar root. */\n root?: HTMLAttributes<HTMLDivElement>;\n}\n\nconst toolbarPartsMatchManifest: ExactPartKeys<ToolbarParts, PartsOf<'Toolbar'>> = true;\nvoid toolbarPartsMatchManifest;\n\n/** Props for the {@link Toolbar} component. */\nexport interface ToolbarProps {\n /** The {@link ToolbarButton} elements to render inside this toolbar group. */\n children: ReactNode;\n /** Keyboard focus behavior (default: {@link ToolbarFocusMode.Arrows}). */\n focusMode?: ToolbarFocusMode;\n /** Layout direction of the toolbar (default: 'vertical'). */\n orientation?: 'vertical' | 'horizontal';\n /** Extra class name for the toolbar root. */\n className?: string;\n /** Accessible toolbar name. Overrides the provider's `messages.toolbar.label` fallback. */\n 'aria-label'?: string;\n /** Identifies an external element that names the toolbar. Takes precedence over `aria-label`. */\n 'aria-labelledby'?: string;\n /** Stable toolbar part attributes. */\n pt?: ToolbarParts;\n /**\n * When `true`, all {@link ToolbarButton} children become draggable by default.\n * Individual buttons can still override this with their own `draggable` prop.\n */\n draggable?: boolean;\n /**\n * Callback invoked when any child toolbar item starts being dragged.\n * Receives the item's associated data and the originating drag event.\n * Only fires for items that are actually draggable.\n */\n onItemDragStart?: (data: unknown, event: React.DragEvent) => void;\n}\n\n/**\n * A toolbar container that groups icon buttons with a rounded border,\n * mimicking the style of tools panels found in canvas-based applications.\n * Supports both vertical (default) and horizontal orientations.\n */\nexport const Toolbar = ({\n children,\n orientation = 'vertical',\n focusMode = ToolbarFocusMode.Arrows,\n draggable = false,\n onItemDragStart,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n pt,\n}: ToolbarProps) => {\n const { rootRef, onKeyDown } = useToolbarKeyboardNavigation(orientation, focusMode);\n const { messages } = useCratisComponentsConfig();\n const resolvedAriaLabel = ariaLabel ?? messages?.toolbar?.label ?? 'Tools';\n\n return (\n <ToolbarDragContext.Provider value={{ draggable, onItemDragStart }}>\n <div\n {...pt?.root}\n ref={rootRef}\n onKeyDown={event => { pt?.root?.onKeyDown?.(event); if (!event.isPropagationStopped()) onKeyDown(event); }}\n role='toolbar'\n aria-orientation={orientation}\n aria-label={ariaLabelledBy ? undefined : resolvedAriaLabel}\n aria-labelledby={ariaLabelledBy}\n className={[\n 'toolbar cratis:inline-flex',\n orientation === 'horizontal' ? 'cratis:flex-row' : 'cratis:flex-col',\n 'cratis:items-center cratis:gap-1 cratis:p-2 cratis:rounded-2xl',\n pt?.root?.className,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-cratis-part='root'\n data-orientation={orientation}\n >\n {children}\n </div>\n </ToolbarDragContext.Provider>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;AAsDO,MAAM,OAAO,GAAG,CAAC,EACpB,QAAQ,EACR,WAAW,GAAG,UAAU,EACxB,SAAS,GAAG,gBAAgB,CAAC,MAAM,EACnC,SAAS,GAAG,KAAK,EACjB,eAAe,EACf,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,EAAE,GACS,KAAI;AACf,IAAA,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,4BAA4B,CAAC,WAAW,EAAE,SAAS,CAAC;AACnF,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,yBAAyB,EAAE;IAChD,MAAM,iBAAiB,GAAG,SAAS,IAAI,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO;IAE1E,QACIA,IAAC,kBAAkB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,YAC9DA,GAAA,CAAA,KAAA,EAAA,EAAA,GACQ,EAAE,EAAE,IAAI,EACZ,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,KAAK,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC1G,IAAI,EAAC,SAAS,EAAA,kBAAA,EACI,WAAW,EAAA,YAAA,EACjB,cAAc,GAAG,SAAS,GAAG,iBAAiB,EAAA,iBAAA,EACzC,cAAc,EAC/B,SAAS,EAAE;gBACP,4BAA4B;gBAC5B,WAAW,KAAK,YAAY,GAAG,iBAAiB,GAAG,iBAAiB;gBACpE,gEAAgE;gBAChE,EAAE,EAAE,IAAI,EAAE,SAAS;gBACnB,SAAS;AACZ;iBACI,MAAM,CAAC,OAAO;AACd,iBAAA,IAAI,CAAC,GAAG,CAAC,EAAA,kBAAA,EACG,MAAM,EAAA,kBAAA,EACL,WAAW,EAAA,QAAA,EAE5B,QAAQ,EAAA,CACP,EAAA,CACoB;AAEtC;;"}
1
+ {"version":3,"file":"Toolbar.js","sources":["../../../Toolbar/Toolbar.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { type HTMLAttributes, type ReactNode } from 'react';\nimport { ToolbarDragContext } from './ToolbarDragContext';\nimport { ToolbarFocusMode } from '../Common/ToolbarFocusMode';\nimport { useToolbarKeyboardNavigation } from '../Common/useToolbarKeyboardNavigation';\nimport { ToolbarRovingContext } from '../Common/ToolbarRovingContext';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport type { ExactPartKeys } from '../types/ExactPartKeys';\nimport type { PartsOf } from '../types/parts';\n\n/** Stable part attributes for {@link Toolbar}. */\nexport interface ToolbarParts {\n /** Toolbar root. */\n root?: HTMLAttributes<HTMLDivElement>;\n}\n\nconst toolbarPartsMatchManifest: ExactPartKeys<ToolbarParts, PartsOf<'Toolbar'>> = true;\nvoid toolbarPartsMatchManifest;\n\n/** Props for the {@link Toolbar} component. */\nexport interface ToolbarProps {\n /** The {@link ToolbarButton} elements to render inside this toolbar group. */\n children: ReactNode;\n /** Keyboard focus behavior (default: {@link ToolbarFocusMode.Arrows}). */\n focusMode?: ToolbarFocusMode;\n /** Layout direction of the toolbar (default: 'vertical'). */\n orientation?: 'vertical' | 'horizontal';\n /** Extra class name for the toolbar root. */\n className?: string;\n /** Accessible toolbar name. Overrides the provider's `messages.toolbar.label` fallback. */\n 'aria-label'?: string;\n /** Identifies an external element that names the toolbar. Takes precedence over `aria-label`. */\n 'aria-labelledby'?: string;\n /** Stable toolbar part attributes. */\n pt?: ToolbarParts;\n /**\n * When `true`, all {@link ToolbarButton} children become draggable by default.\n * Individual buttons can still override this with their own `draggable` prop.\n */\n draggable?: boolean;\n /**\n * Callback invoked when any child toolbar item starts being dragged.\n * Receives the item's associated data and the originating drag event.\n * Only fires for items that are actually draggable.\n */\n onItemDragStart?: (data: unknown, event: React.DragEvent) => void;\n}\n\n/**\n * A toolbar container that groups icon buttons with a rounded border,\n * mimicking the style of tools panels found in canvas-based applications.\n * Supports both vertical (default) and horizontal orientations.\n */\nexport const Toolbar = ({\n children,\n orientation = 'vertical',\n focusMode = ToolbarFocusMode.Arrows,\n draggable = false,\n onItemDragStart,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n pt,\n}: ToolbarProps) => {\n const { rootRef, onKeyDown, roving } = useToolbarKeyboardNavigation(orientation, focusMode);\n const { messages } = useCratisComponentsConfig();\n const resolvedAriaLabel = ariaLabel ?? messages?.toolbar?.label ?? 'Tools';\n\n return (\n <ToolbarDragContext.Provider value={{ draggable, onItemDragStart }}>\n <div\n {...pt?.root}\n ref={rootRef}\n onKeyDown={event => { pt?.root?.onKeyDown?.(event); if (!event.isPropagationStopped()) onKeyDown(event); }}\n role='toolbar'\n aria-orientation={orientation}\n aria-label={ariaLabelledBy ? undefined : resolvedAriaLabel}\n aria-labelledby={ariaLabelledBy}\n className={[\n 'toolbar cratis:inline-flex',\n orientation === 'horizontal' ? 'cratis:flex-row' : 'cratis:flex-col',\n 'cratis:items-center cratis:gap-1 cratis:p-2 cratis:rounded-2xl',\n pt?.root?.className,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-cratis-part='root'\n data-orientation={orientation}\n >\n <ToolbarRovingContext.Provider value={roving}>\n {children}\n </ToolbarRovingContext.Provider>\n </div>\n </ToolbarDragContext.Provider>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;AAuDO,MAAM,OAAO,GAAG,CAAC,EACpB,QAAQ,EACR,WAAW,GAAG,UAAU,EACxB,SAAS,GAAG,gBAAgB,CAAC,MAAM,EACnC,SAAS,GAAG,KAAK,EACjB,eAAe,EACf,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,EAAE,GACS,KAAI;AACf,IAAA,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,4BAA4B,CAAC,WAAW,EAAE,SAAS,CAAC;AAC3F,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,yBAAyB,EAAE;IAChD,MAAM,iBAAiB,GAAG,SAAS,IAAI,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO;IAE1E,QACIA,IAAC,kBAAkB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,YAC9DA,GAAA,CAAA,KAAA,EAAA,EAAA,GACQ,EAAE,EAAE,IAAI,EACZ,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,KAAK,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC1G,IAAI,EAAC,SAAS,EAAA,kBAAA,EACI,WAAW,EAAA,YAAA,EACjB,cAAc,GAAG,SAAS,GAAG,iBAAiB,EAAA,iBAAA,EACzC,cAAc,EAC/B,SAAS,EAAE;gBACP,4BAA4B;gBAC5B,WAAW,KAAK,YAAY,GAAG,iBAAiB,GAAG,iBAAiB;gBACpE,gEAAgE;gBAChE,EAAE,EAAE,IAAI,EAAE,SAAS;gBACnB,SAAS;AACZ;iBACI,MAAM,CAAC,OAAO;iBACd,IAAI,CAAC,GAAG,CAAC,EAAA,kBAAA,EACG,MAAM,EAAA,kBAAA,EACL,WAAW,EAAA,QAAA,EAE7BA,GAAA,CAAC,oBAAoB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,MAAM,EAAA,QAAA,EACvC,QAAQ,EAAA,CACmB,EAAA,CAC9B,EAAA,CACoB;AAEtC;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,oBAAoB,EACpB,cAAc,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAKzD,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IAC/B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC/C,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IACvC,gCAAgC;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CAC3C;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,2GAA2G;IAC3G,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IAEd,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,yEAAyE;IACzE,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qCAAqC;IACrC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACpF;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,0GAYvB,kBAAkB,gCAoGpB,CAAC"}
1
+ {"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,oBAAoB,EACpB,cAAc,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAMzD,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IAC/B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC/C,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IACvC,gCAAgC;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CAC3C;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,2GAA2G;IAC3G,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IAEd,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,yEAAyE;IACzE,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qCAAqC;IACrC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACpF;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,0GAYvB,kBAAkB,gCAuGpB,CAAC"}
@@ -4,11 +4,13 @@ import { Tooltip } from '../Common/Tooltip.js';
4
4
  import { useToolbarDragContext } from './ToolbarDragContext.js';
5
5
  import { useToolbarFolderMode } from './ToolbarFolderContext.js';
6
6
  import { useToolbarItemVisibility } from './ToolbarItemVisibilityContext.js';
7
+ import { useRovingTool } from '../Common/ToolbarRovingContext.js';
7
8
 
8
9
  const ToolbarButton = ({ icon, text, title, active, onClick, tooltipPosition = 'right', draggable, data, onDragStart, className, pt, }) => {
9
10
  const dragContext = useToolbarDragContext();
10
11
  const folderMode = useToolbarFolderMode();
11
12
  const isToolbarItemVisible = useToolbarItemVisibility();
13
+ const rovingTool = useRovingTool(pt?.root?.tabIndex, pt?.root?.onFocus);
12
14
  const isListMode = folderMode === 'list';
13
15
  const isDraggable = draggable ?? dragContext.draggable;
14
16
  const handleDragStart = (event) => {
@@ -22,11 +24,11 @@ const ToolbarButton = ({ icon, text, title, active, onClick, tooltipPosition = '
22
24
  const hasText = typeof text === 'string' && text.length > 0;
23
25
  const resolvedIcon = icon !== undefined && icon !== null && (typeof icon !== 'string' || icon.length > 0) ? icon : null;
24
26
  if (isListMode) {
25
- return (jsxs("button", { "aria-pressed": active, ...pt?.root, type: 'button', "aria-label": title, onClick: onClick, draggable: isDraggable, onDragStart: isDraggable ? handleDragStart : undefined, className: `toolbar-button toolbar-button--list cratis:h-10 cratis:px-3 cratis:w-full cratis:flex cratis:items-center cratis:justify-start cratis:gap-2 cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`, "data-cratis-part": 'button', "data-active": active || undefined, "data-selected": active || undefined, children: [resolvedIcon !== null && (jsx("span", { ...pt?.icon, className: pt?.icon?.className, "data-cratis-part": 'icon', children: jsx(IconDisplay, { icon: resolvedIcon, className: 'cratis:text-lg cratis:flex-shrink-0' }) })), jsx("span", { ...pt?.label, className: `toolbar-button__label ${pt?.label?.className ?? ''}`, "data-cratis-part": 'label', children: title })] }));
27
+ return (jsxs("button", { "aria-pressed": active, ...pt?.root, ...rovingTool, type: 'button', "aria-label": title, onClick: onClick, draggable: isDraggable, onDragStart: isDraggable ? handleDragStart : undefined, className: `toolbar-button toolbar-button--list cratis:h-10 cratis:px-3 cratis:w-full cratis:flex cratis:items-center cratis:justify-start cratis:gap-2 cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`, "data-cratis-part": 'button', "data-active": active || undefined, "data-selected": active || undefined, children: [resolvedIcon !== null && (jsx("span", { ...pt?.icon, className: pt?.icon?.className, "data-cratis-part": 'icon', children: jsx(IconDisplay, { icon: resolvedIcon, className: 'cratis:text-lg cratis:flex-shrink-0' }) })), jsx("span", { ...pt?.label, className: `toolbar-button__label ${pt?.label?.className ?? ''}`, "data-cratis-part": 'label', children: title })] }));
26
28
  }
27
29
  const buttonSizeClass = hasText ? 'cratis:h-10 cratis:px-3 cratis:min-w-[4rem]' : 'cratis:w-10 cratis:h-10';
28
30
  const buttonContent = hasText ? (jsx("span", { ...pt?.label, className: `toolbar-button__text ${pt?.label?.className ?? ''}`, "data-cratis-part": 'label', children: text })) : resolvedIcon === null ? null : (jsx("span", { ...pt?.icon, className: pt?.icon?.className, "data-cratis-part": 'icon', children: jsx(IconDisplay, { icon: resolvedIcon, className: 'cratis:text-lg' }) }));
29
- return (jsx(Tooltip, { content: title, position: tooltipPosition, disabled: !isToolbarItemVisible, children: jsx("button", { "aria-pressed": active, ...pt?.root, type: 'button', "aria-label": title, onClick: onClick, draggable: isDraggable, onDragStart: isDraggable ? handleDragStart : undefined, className: `toolbar-button ${buttonSizeClass} cratis:flex cratis:items-center cratis:justify-center cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`, "data-cratis-part": 'button', "data-active": active || undefined, "data-selected": active || undefined, children: buttonContent }) }));
31
+ return (jsx(Tooltip, { content: title, position: tooltipPosition, disabled: !isToolbarItemVisible, children: jsx("button", { "aria-pressed": active, ...pt?.root, ...rovingTool, type: 'button', "aria-label": title, onClick: onClick, draggable: isDraggable, onDragStart: isDraggable ? handleDragStart : undefined, className: `toolbar-button ${buttonSizeClass} cratis:flex cratis:items-center cratis:justify-center cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`, "data-cratis-part": 'button', "data-active": active || undefined, "data-selected": active || undefined, children: buttonContent }) }));
30
32
  };
31
33
 
32
34
  export { ToolbarButton };