@cratis/components 4.20.0 → 4.21.1

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 (146) hide show
  1. package/MIGRATION.md +3 -3
  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 +9 -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/Common/ActionMenubar.d.ts.map +1 -1
  12. package/dist/esm/Common/ActionMenubar.js +11 -6
  13. package/dist/esm/Common/ActionMenubar.js.map +1 -1
  14. package/dist/esm/Common/ToolbarFocusMode.d.ts +9 -1
  15. package/dist/esm/Common/ToolbarFocusMode.d.ts.map +1 -1
  16. package/dist/esm/Common/ToolbarFocusMode.js +1 -0
  17. package/dist/esm/Common/ToolbarFocusMode.js.map +1 -1
  18. package/dist/esm/Common/ToolbarRovingContext.d.ts +39 -0
  19. package/dist/esm/Common/ToolbarRovingContext.d.ts.map +1 -0
  20. package/dist/esm/Common/ToolbarRovingContext.js +40 -0
  21. package/dist/esm/Common/ToolbarRovingContext.js.map +1 -0
  22. package/dist/esm/Common/useToolbarKeyboardNavigation.d.ts +2 -0
  23. package/dist/esm/Common/useToolbarKeyboardNavigation.d.ts.map +1 -1
  24. package/dist/esm/Common/useToolbarKeyboardNavigation.js +164 -15
  25. package/dist/esm/Common/useToolbarKeyboardNavigation.js.map +1 -1
  26. package/dist/esm/DataTables/DataTableBody.d.ts +22 -0
  27. package/dist/esm/DataTables/DataTableBody.d.ts.map +1 -0
  28. package/dist/esm/DataTables/DataTableBody.js +10 -0
  29. package/dist/esm/DataTables/DataTableBody.js.map +1 -0
  30. package/dist/esm/DataTables/DataTableCore.d.ts +25 -47
  31. package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
  32. package/dist/esm/DataTables/DataTableCore.js +50 -273
  33. package/dist/esm/DataTables/DataTableCore.js.map +1 -1
  34. package/dist/esm/DataTables/DataTableHeaderCell.d.ts +25 -0
  35. package/dist/esm/DataTables/DataTableHeaderCell.d.ts.map +1 -0
  36. package/dist/esm/DataTables/DataTableHeaderCell.js +26 -0
  37. package/dist/esm/DataTables/DataTableHeaderCell.js.map +1 -0
  38. package/dist/esm/DataTables/DataTableMessageOverrides.d.ts +12 -0
  39. package/dist/esm/DataTables/DataTableMessageOverrides.d.ts.map +1 -0
  40. package/dist/esm/DataTables/DataTableMessageOverrides.js +4 -0
  41. package/dist/esm/DataTables/DataTableMessageOverrides.js.map +1 -0
  42. package/dist/esm/DataTables/DataTableMessages.d.ts +12 -0
  43. package/dist/esm/DataTables/DataTableMessages.d.ts.map +1 -0
  44. package/dist/esm/DataTables/DataTableMessages.js +4 -0
  45. package/dist/esm/DataTables/DataTableMessages.js.map +1 -0
  46. package/dist/esm/DataTables/DataTableParts.d.ts +40 -0
  47. package/dist/esm/DataTables/DataTableParts.d.ts.map +1 -0
  48. package/dist/esm/DataTables/DataTableParts.js +4 -0
  49. package/dist/esm/DataTables/DataTableParts.js.map +1 -0
  50. package/dist/esm/DataTables/DataTableRow.d.ts +22 -0
  51. package/dist/esm/DataTables/DataTableRow.d.ts.map +1 -0
  52. package/dist/esm/DataTables/DataTableRow.js +25 -0
  53. package/dist/esm/DataTables/DataTableRow.js.map +1 -0
  54. package/dist/esm/DataTables/DataTableRowClickEvent.d.ts +8 -0
  55. package/dist/esm/DataTables/DataTableRowClickEvent.d.ts.map +1 -0
  56. package/dist/esm/DataTables/DataTableRowClickEvent.js +4 -0
  57. package/dist/esm/DataTables/DataTableRowClickEvent.js.map +1 -0
  58. package/dist/esm/DataTables/DataTableRowProcessing.d.ts +11 -0
  59. package/dist/esm/DataTables/DataTableRowProcessing.d.ts.map +1 -0
  60. package/dist/esm/DataTables/DataTableRowProcessing.js +8 -0
  61. package/dist/esm/DataTables/DataTableRowProcessing.js.map +1 -0
  62. package/dist/esm/DataTables/DataTableSearch.d.ts +13 -0
  63. package/dist/esm/DataTables/DataTableSearch.d.ts.map +1 -0
  64. package/dist/esm/DataTables/DataTableSearch.js +7 -0
  65. package/dist/esm/DataTables/DataTableSearch.js.map +1 -0
  66. package/dist/esm/DataTables/DataTableSort.d.ts +9 -0
  67. package/dist/esm/DataTables/DataTableSort.d.ts.map +1 -0
  68. package/dist/esm/DataTables/DataTableSort.js +4 -0
  69. package/dist/esm/DataTables/DataTableSort.js.map +1 -0
  70. package/dist/esm/DataTables/DataTableSortDirection.d.ts +8 -0
  71. package/dist/esm/DataTables/DataTableSortDirection.d.ts.map +1 -0
  72. package/dist/esm/DataTables/DataTableSortDirection.js +8 -0
  73. package/dist/esm/DataTables/DataTableSortDirection.js.map +1 -0
  74. package/dist/esm/DataTables/DataTableState.d.ts +18 -0
  75. package/dist/esm/DataTables/DataTableState.d.ts.map +1 -0
  76. package/dist/esm/DataTables/DataTableState.js +4 -0
  77. package/dist/esm/DataTables/DataTableState.js.map +1 -0
  78. package/dist/esm/DataTables/DataTableStateProps.d.ts +20 -0
  79. package/dist/esm/DataTables/DataTableStateProps.d.ts.map +1 -0
  80. package/dist/esm/DataTables/DataTableStateProps.js +4 -0
  81. package/dist/esm/DataTables/DataTableStateProps.js.map +1 -0
  82. package/dist/esm/DataTables/ProcessedRow.d.ts +8 -0
  83. package/dist/esm/DataTables/ProcessedRow.d.ts.map +1 -0
  84. package/dist/esm/DataTables/ProcessedRow.js +4 -0
  85. package/dist/esm/DataTables/ProcessedRow.js.map +1 -0
  86. package/dist/esm/DataTables/RowProcessingState.d.ts +17 -0
  87. package/dist/esm/DataTables/RowProcessingState.d.ts.map +1 -0
  88. package/dist/esm/DataTables/RowProcessingState.js +4 -0
  89. package/dist/esm/DataTables/RowProcessingState.js.map +1 -0
  90. package/dist/esm/DataTables/RowSelection.d.ts +19 -0
  91. package/dist/esm/DataTables/RowSelection.d.ts.map +1 -0
  92. package/dist/esm/DataTables/RowSelection.js +4 -0
  93. package/dist/esm/DataTables/RowSelection.js.map +1 -0
  94. package/dist/esm/DataTables/RowSelectionSource.d.ts +16 -0
  95. package/dist/esm/DataTables/RowSelectionSource.d.ts.map +1 -0
  96. package/dist/esm/DataTables/RowSelectionSource.js +4 -0
  97. package/dist/esm/DataTables/RowSelectionSource.js.map +1 -0
  98. package/dist/esm/DataTables/classNames.d.ts +7 -0
  99. package/dist/esm/DataTables/classNames.d.ts.map +1 -0
  100. package/dist/esm/DataTables/classNames.js +4 -0
  101. package/dist/esm/DataTables/classNames.js.map +1 -0
  102. package/dist/esm/DataTables/index.d.ts +3 -0
  103. package/dist/esm/DataTables/index.d.ts.map +1 -1
  104. package/dist/esm/DataTables/index.js +2 -0
  105. package/dist/esm/DataTables/index.js.map +1 -1
  106. package/dist/esm/DataTables/matchesFilterEntry.d.ts +15 -0
  107. package/dist/esm/DataTables/matchesFilterEntry.d.ts.map +1 -0
  108. package/dist/esm/DataTables/matchesFilterEntry.js +70 -0
  109. package/dist/esm/DataTables/matchesFilterEntry.js.map +1 -0
  110. package/dist/esm/DataTables/processRows.d.ts +10 -0
  111. package/dist/esm/DataTables/processRows.d.ts.map +1 -0
  112. package/dist/esm/DataTables/processRows.js +42 -0
  113. package/dist/esm/DataTables/processRows.js.map +1 -0
  114. package/dist/esm/DataTables/useControllableState.d.ts +10 -0
  115. package/dist/esm/DataTables/useControllableState.d.ts.map +1 -0
  116. package/dist/esm/DataTables/useControllableState.js +15 -0
  117. package/dist/esm/DataTables/useControllableState.js.map +1 -0
  118. package/dist/esm/DataTables/useDataTableMessages.d.ts +9 -0
  119. package/dist/esm/DataTables/useDataTableMessages.d.ts.map +1 -0
  120. package/dist/esm/DataTables/useDataTableMessages.js +33 -0
  121. package/dist/esm/DataTables/useDataTableMessages.js.map +1 -0
  122. package/dist/esm/DataTables/useDataTableState.d.ts +10 -0
  123. package/dist/esm/DataTables/useDataTableState.d.ts.map +1 -0
  124. package/dist/esm/DataTables/useDataTableState.js +19 -0
  125. package/dist/esm/DataTables/useDataTableState.js.map +1 -0
  126. package/dist/esm/DataTables/useRowSelection.d.ts +9 -0
  127. package/dist/esm/DataTables/useRowSelection.d.ts.map +1 -0
  128. package/dist/esm/DataTables/useRowSelection.js +87 -0
  129. package/dist/esm/DataTables/useRowSelection.js.map +1 -0
  130. package/dist/esm/DataTables/valueAtPath.d.ts +10 -0
  131. package/dist/esm/DataTables/valueAtPath.d.ts.map +1 -0
  132. package/dist/esm/DataTables/valueAtPath.js +18 -0
  133. package/dist/esm/DataTables/valueAtPath.js.map +1 -0
  134. package/dist/esm/Toolbar/Toolbar.d.ts.map +1 -1
  135. package/dist/esm/Toolbar/Toolbar.js +3 -2
  136. package/dist/esm/Toolbar/Toolbar.js.map +1 -1
  137. package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -1
  138. package/dist/esm/Toolbar/ToolbarButton.js +4 -2
  139. package/dist/esm/Toolbar/ToolbarButton.js.map +1 -1
  140. package/dist/esm/Toolbar/ToolbarFanOutItem.d.ts.map +1 -1
  141. package/dist/esm/Toolbar/ToolbarFanOutItem.js +10 -2
  142. package/dist/esm/Toolbar/ToolbarFanOutItem.js.map +1 -1
  143. package/dist/esm/Toolbar/ToolbarFolder.d.ts.map +1 -1
  144. package/dist/esm/Toolbar/ToolbarFolder.js +10 -2
  145. package/dist/esm/Toolbar/ToolbarFolder.js.map +1 -1
  146. package/package.json +5 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowSelectionSource.js","sourceRoot":"","sources":["../../../DataTables/RowSelectionSource.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\n/** What `useRowSelection` selects from. */\nexport interface RowSelectionSource<TData> {\n /** The loaded rows. */\n data: TData[];\n /** The rows currently visible after filtering. */\n visibleRows: TData[];\n /** The row property used as identity. */\n dataKey?: string;\n /** The single selected row. */\n selection?: TData | null;\n /** The multiple selected rows. */\n selectedItems?: TData[];\n /** Receives the next multiple selection. */\n onSelectedItemsChange?: (items: TData[]) => void;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Joins the class names that are set.
3
+ * @param values Class names, some possibly undefined.
4
+ * @returns The space-separated class names.
5
+ */
6
+ export declare const classNames: (...values: Array<string | undefined>) => string;
7
+ //# sourceMappingURL=classNames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.d.ts","sourceRoot":"","sources":["../../../DataTables/classNames.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,UAAU,cAAe,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,WAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ const classNames = (...values) => values.filter(Boolean).join(' ');
2
+
3
+ export { classNames };
4
+ //# sourceMappingURL=classNames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classNames.js","sources":["../../../DataTables/classNames.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/**\n * Joins the class names that are set.\n * @param values Class names, some possibly undefined.\n * @returns The space-separated class names.\n */\nexport const classNames = (...values: Array<string | undefined>) =>\n values.filter(Boolean).join(' ');\n"],"names":[],"mappings":"MAQa,UAAU,GAAG,CAAC,GAAG,MAAiC,KAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG;;"}
@@ -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,15 @@
1
+ import { type DataTableFilterConstraint, type DataTableFilterEntry } from './DataTableFilterMeta.js';
2
+ /**
3
+ * The first constraint of a filter entry, which is what the column filter menu edits.
4
+ * @param entry The filter entry, if any.
5
+ * @returns Its first constraint, or undefined.
6
+ */
7
+ export declare const firstConstraint: (entry: DataTableFilterEntry | undefined) => DataTableFilterConstraint | undefined;
8
+ /**
9
+ * Whether a value satisfies a filter entry, combining its constraints with the entry's operator.
10
+ * @param value The row value.
11
+ * @param entry The filter entry.
12
+ * @returns True when the value matches.
13
+ */
14
+ export declare const matchesFilterEntry: (value: unknown, entry: DataTableFilterEntry) => boolean;
15
+ //# sourceMappingURL=matchesFilterEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchesFilterEntry.d.ts","sourceRoot":"","sources":["../../../DataTables/matchesFilterEntry.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EAC5B,MAAM,0BAAuB,CAAC;AAW/B;;;;GAIG;AACH,eAAO,MAAM,eAAe,UACjB,oBAAoB,GAAG,SAAS,KACxC,yBAAyB,GAAG,SACmC,CAAC;AA0DnE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,OAAO,SAAS,oBAAoB,YAU7E,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { DataTableFilterMatchMode } from './DataTableFilterMeta.js';
2
+ import { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry.js';
3
+
4
+ const dateNumber = (value) => {
5
+ const date = value instanceof Date ? new Date(value.getTime()) : new Date(String(value));
6
+ return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);
7
+ };
8
+ const firstConstraint = (entry) => entry && 'constraints' in entry ? entry.constraints[0] : entry;
9
+ const builtInMatches = (value, constraint) => {
10
+ const filter = constraint.value;
11
+ const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;
12
+ if (filter === null || filter === undefined || filter === '')
13
+ return true;
14
+ const valueText = String(value ?? '').toLocaleLowerCase();
15
+ const filterText = String(filter).toLocaleLowerCase();
16
+ const valueNumber = typeof value === 'number' ? value : Number(value);
17
+ const filterNumber = typeof filter === 'number' ? filter : Number(filter);
18
+ switch (mode) {
19
+ case DataTableFilterMatchMode.StartsWith:
20
+ return valueText.startsWith(filterText);
21
+ case DataTableFilterMatchMode.Contains:
22
+ return valueText.includes(filterText);
23
+ case DataTableFilterMatchMode.NotContains:
24
+ return !valueText.includes(filterText);
25
+ case DataTableFilterMatchMode.EndsWith:
26
+ return valueText.endsWith(filterText);
27
+ case DataTableFilterMatchMode.Equals:
28
+ return Object.is(value, filter) || valueText === filterText;
29
+ case DataTableFilterMatchMode.NotEquals:
30
+ return !(Object.is(value, filter) || valueText === filterText);
31
+ case DataTableFilterMatchMode.In:
32
+ return Array.isArray(filter) && filter.some((item) => Object.is(item, value));
33
+ case DataTableFilterMatchMode.Between:
34
+ return (Array.isArray(filter) &&
35
+ filter.length >= 2 &&
36
+ valueNumber >= Number(filter[0]) &&
37
+ valueNumber <= Number(filter[1]));
38
+ case DataTableFilterMatchMode.LessThan:
39
+ return valueNumber < filterNumber;
40
+ case DataTableFilterMatchMode.LessThanOrEqual:
41
+ return valueNumber <= filterNumber;
42
+ case DataTableFilterMatchMode.GreaterThan:
43
+ return valueNumber > filterNumber;
44
+ case DataTableFilterMatchMode.GreaterThanOrEqual:
45
+ return valueNumber >= filterNumber;
46
+ case DataTableFilterMatchMode.DateIs:
47
+ return dateNumber(value) === dateNumber(filter);
48
+ case DataTableFilterMatchMode.DateIsNot:
49
+ return dateNumber(value) !== dateNumber(filter);
50
+ case DataTableFilterMatchMode.DateBefore:
51
+ return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);
52
+ case DataTableFilterMatchMode.DateAfter:
53
+ return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);
54
+ default:
55
+ return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;
56
+ }
57
+ };
58
+ const matchesFilterEntry = (value, entry) => {
59
+ if (!('constraints' in entry))
60
+ return builtInMatches(value, entry);
61
+ if (entry.constraints.length === 0)
62
+ return true;
63
+ const matches = entry.constraints.map((constraint) => builtInMatches(value, constraint));
64
+ return entry.operator?.toLowerCase() === 'or'
65
+ ? matches.some(Boolean)
66
+ : matches.every(Boolean);
67
+ };
68
+
69
+ export { firstConstraint, matchesFilterEntry };
70
+ //# sourceMappingURL=matchesFilterEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchesFilterEntry.js","sources":["../../../DataTables/matchesFilterEntry.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 {\n DataTableFilterMatchMode,\n type DataTableFilterConstraint,\n type DataTableFilterEntry,\n} from './DataTableFilterMeta';\nimport { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry';\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\n/**\n * The first constraint of a filter entry, which is what the column filter menu edits.\n * @param entry The filter entry, if any.\n * @returns Its first constraint, or undefined.\n */\nexport const 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\n/**\n * Whether a value satisfies a filter entry, combining its constraints with the entry's operator.\n * @param value The row value.\n * @param entry The filter entry.\n * @returns True when the value matches.\n */\nexport const 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"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ProcessedRow } from './ProcessedRow.js';
2
+ import type { RowProcessingState } from './RowProcessingState.js';
3
+ /**
4
+ * Filters and sorts loaded rows by the table's state, or keeps them as given when row processing is off.
5
+ * @param data The loaded rows.
6
+ * @param state The filter, search and sort state.
7
+ * @returns The rows to render, each with its loaded-page index.
8
+ */
9
+ export declare const processRows: <TData extends object>(data: TData[], { filters, globalFilter, globalFilterFields, sort, rowProcessing, }: RowProcessingState) => ProcessedRow<TData>[];
10
+ //# sourceMappingURL=processRows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processRows.d.ts","sourceRoot":"","sources":["../../../DataTables/processRows.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAa/D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,SAAS,MAAM,QACtC,KAAK,EAAE,uEAOV,kBAAkB,KACtB,YAAY,CAAC,KAAK,CAAC,EA6BrB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { DataTableRowProcessing } from './DataTableRowProcessing.js';
2
+ import { matchesFilterEntry } from './matchesFilterEntry.js';
3
+ import { valueAtPath } from './valueAtPath.js';
4
+
5
+ const compareValues = (left, right) => {
6
+ if (typeof left === 'number' && typeof right === 'number')
7
+ return left - right;
8
+ if (left instanceof Date && right instanceof Date)
9
+ return left.getTime() - right.getTime();
10
+ return String(left ?? '').localeCompare(String(right ?? ''), undefined, {
11
+ numeric: true,
12
+ sensitivity: 'base',
13
+ });
14
+ };
15
+ const processRows = (data, { filters, globalFilter, globalFilterFields, sort, rowProcessing, }) => {
16
+ if (rowProcessing === DataTableRowProcessing.None) {
17
+ return data.map((row, loadedIndex) => ({ row, loadedIndex }));
18
+ }
19
+ const term = globalFilter.trim().toLocaleLowerCase();
20
+ const rows = data
21
+ .map((row, loadedIndex) => ({ row, loadedIndex }))
22
+ .filter(({ row }) => {
23
+ const rowValues = row;
24
+ const matchesColumns = Object.entries(filters).every(([field, entry]) => matchesFilterEntry(valueAtPath(rowValues, field), entry));
25
+ if (!matchesColumns)
26
+ return false;
27
+ if (!term || !globalFilterFields?.length)
28
+ return true;
29
+ return globalFilterFields.some((field) => String(valueAtPath(rowValues, field) ?? '')
30
+ .toLocaleLowerCase()
31
+ .includes(term));
32
+ });
33
+ if (!sort)
34
+ return rows;
35
+ return [...rows].sort((left, right) => {
36
+ const comparison = compareValues(valueAtPath(left.row, sort.field), valueAtPath(right.row, sort.field));
37
+ return sort.direction === 'ascending' ? comparison : -comparison;
38
+ });
39
+ };
40
+
41
+ export { processRows };
42
+ //# sourceMappingURL=processRows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processRows.js","sources":["../../../DataTables/processRows.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 { DataTableRowProcessing } from './DataTableRowProcessing';\nimport { matchesFilterEntry } from './matchesFilterEntry';\nimport type { ProcessedRow } from './ProcessedRow';\nimport type { RowProcessingState } from './RowProcessingState';\nimport { valueAtPath } from './valueAtPath';\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\n/**\n * Filters and sorts loaded rows by the table's state, or keeps them as given when row processing is off.\n * @param data The loaded rows.\n * @param state The filter, search and sort state.\n * @returns The rows to render, each with its loaded-page index.\n */\nexport const processRows = <TData extends object>(\n data: TData[],\n {\n filters,\n globalFilter,\n globalFilterFields,\n sort,\n rowProcessing,\n }: RowProcessingState,\n): ProcessedRow<TData>[] => {\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};\n"],"names":[],"mappings":";;;;AASA,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,KAAc,KAAY;IAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,GAAG,KAAK;AAC9E,IAAA,IAAI,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI;QAC7C,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;AAC3C,IAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE;AACpE,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,WAAW,EAAE,MAAM;AACtB,KAAA,CAAC;AACN,CAAC;AAQM,MAAM,WAAW,GAAG,CACvB,IAAa,EACb,EACI,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,IAAI,EACJ,aAAa,GACI,KACE;AACvB,IAAA,IAAI,aAAa,KAAK,sBAAsB,CAAC,IAAI,EAAE;AAC/C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE;IACA,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE;IACpD,MAAM,IAAI,GAAG;AACR,SAAA,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;AAChD,SAAA,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAI;QAChB,MAAM,SAAS,GAAG,GAA8B;AAChD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAChE,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAC3D;AACD,QAAA,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,KAAK;AACjC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACrD,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,KACjC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE;AACrC,aAAA,iBAAiB;AACjB,aAAA,QAAQ,CAAC,IAAI,CAAC,CACtB;AACL,IAAA,CAAC,CAAC;AAEN,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AACtB,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;QAClC,MAAM,UAAU,GAAG,aAAa,CAC5B,WAAW,CAAC,IAAI,CAAC,GAA8B,EAAE,IAAI,CAAC,KAAK,CAAC,EAC5D,WAAW,CAAC,KAAK,CAAC,GAA8B,EAAE,IAAI,CAAC,KAAK,CAAC,CAChE;AACD,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,GAAG,UAAU,GAAG,CAAC,UAAU;AACpE,IAAA,CAAC,CAAC;AACN;;"}
@@ -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;;"}
@@ -0,0 +1,9 @@
1
+ import type { DataTableMessageOverrides } from './DataTableMessageOverrides.js';
2
+ import type { DataTableMessages } from './DataTableMessages.js';
3
+ /**
4
+ * Resolves each table message from its prop, then the provider's `dataTable` messages, then the default.
5
+ * @param overrides The messages passed as props.
6
+ * @returns The messages to show.
7
+ */
8
+ export declare const useDataTableMessages: (overrides: DataTableMessageOverrides) => DataTableMessages;
9
+ //# sourceMappingURL=useDataTableMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataTableMessages.d.ts","sourceRoot":"","sources":["../../../DataTables/useDataTableMessages.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,cAClB,yBAAyB,KACrC,iBA2BF,CAAC"}
@@ -0,0 +1,33 @@
1
+ import 'react/jsx-runtime';
2
+ import 'react';
3
+ import 'react-aria-components/I18nProvider';
4
+ import 'ts-deepmerge';
5
+ import 'react-dom';
6
+ import { useCratisComponentsConfig } from '../configuration/CratisComponentsContext.js';
7
+ import '../Notifications/toast.js';
8
+ import '../renderer/RendererContext.js';
9
+
10
+ const useDataTableMessages = (overrides) => {
11
+ const { messages } = useCratisComponentsConfig();
12
+ const dataTableMessages = messages?.dataTable;
13
+ return {
14
+ resolvedSelectionAriaLabel: overrides.selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row',
15
+ resolvedSelectAllAriaLabel: overrides.selectAllAriaLabel ??
16
+ dataTableMessages?.selectAllRows ??
17
+ 'Select all rows',
18
+ resolvedGlobalSearchPlaceholder: overrides.globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…',
19
+ resolvedGlobalSearchAriaLabel: overrides.globalSearchAriaLabel ??
20
+ dataTableMessages?.searchAriaLabel ??
21
+ 'Search table',
22
+ resolvedLoadingMessage: overrides.loadingMessage ?? dataTableMessages?.loading ?? 'Loading…',
23
+ resolvedFailureMessage: overrides.failureMessage ??
24
+ dataTableMessages?.failed ??
25
+ 'Could not load data.',
26
+ resolvedUnauthorizedMessage: overrides.unauthorizedMessage ??
27
+ dataTableMessages?.unauthorized ??
28
+ 'You are not authorized to view this data.',
29
+ };
30
+ };
31
+
32
+ export { useDataTableMessages };
33
+ //# sourceMappingURL=useDataTableMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataTableMessages.js","sources":["../../../DataTables/useDataTableMessages.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 { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport type { DataTableMessageOverrides } from './DataTableMessageOverrides';\nimport type { DataTableMessages } from './DataTableMessages';\n\n/**\n * Resolves each table message from its prop, then the provider's `dataTable` messages, then the default.\n * @param overrides The messages passed as props.\n * @returns The messages to show.\n */\nexport const useDataTableMessages = (\n overrides: DataTableMessageOverrides,\n): DataTableMessages => {\n const { messages } = useCratisComponentsConfig();\n const dataTableMessages = messages?.dataTable;\n return {\n resolvedSelectionAriaLabel:\n overrides.selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row',\n resolvedSelectAllAriaLabel:\n overrides.selectAllAriaLabel ??\n dataTableMessages?.selectAllRows ??\n 'Select all rows',\n resolvedGlobalSearchPlaceholder:\n overrides.globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…',\n resolvedGlobalSearchAriaLabel:\n overrides.globalSearchAriaLabel ??\n dataTableMessages?.searchAriaLabel ??\n 'Search table',\n resolvedLoadingMessage:\n overrides.loadingMessage ?? dataTableMessages?.loading ?? 'Loading…',\n resolvedFailureMessage:\n overrides.failureMessage ??\n dataTableMessages?.failed ??\n 'Could not load data.',\n resolvedUnauthorizedMessage:\n overrides.unauthorizedMessage ??\n dataTableMessages?.unauthorized ??\n 'You are not authorized to view this data.',\n };\n};\n"],"names":[],"mappings":";;;;;;;;;AAYO,MAAM,oBAAoB,GAAG,CAChC,SAAoC,KACjB;AACnB,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,yBAAyB,EAAE;AAChD,IAAA,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS;IAC7C,OAAO;QACH,0BAA0B,EACtB,SAAS,CAAC,kBAAkB,IAAI,iBAAiB,EAAE,SAAS,IAAI,YAAY;QAChF,0BAA0B,EACtB,SAAS,CAAC,kBAAkB;AAC5B,YAAA,iBAAiB,EAAE,aAAa;YAChC,iBAAiB;QACrB,+BAA+B,EAC3B,SAAS,CAAC,uBAAuB,IAAI,iBAAiB,EAAE,MAAM,IAAI,SAAS;QAC/E,6BAA6B,EACzB,SAAS,CAAC,qBAAqB;AAC/B,YAAA,iBAAiB,EAAE,eAAe;YAClC,cAAc;QAClB,sBAAsB,EAClB,SAAS,CAAC,cAAc,IAAI,iBAAiB,EAAE,OAAO,IAAI,UAAU;QACxE,sBAAsB,EAClB,SAAS,CAAC,cAAc;AACxB,YAAA,iBAAiB,EAAE,MAAM;YACzB,sBAAsB;QAC1B,2BAA2B,EACvB,SAAS,CAAC,mBAAmB;AAC7B,YAAA,iBAAiB,EAAE,YAAY;YAC/B,2CAA2C;KAClD;AACL;;"}
@@ -0,0 +1,10 @@
1
+ import type { DataTableState } from './DataTableState.js';
2
+ import type { DataTableStateProps } from './DataTableStateProps.js';
3
+ /**
4
+ * The table's filter, search and sort state, each controlled by its prop when set and kept by the
5
+ * table otherwise. Every change is reported through its callback in both modes.
6
+ * @param props The state props of the table.
7
+ * @returns The current state and its setters.
8
+ */
9
+ export declare const useDataTableState: ({ defaultFilters, filters: filtersProp, onFilter, globalFilter: globalFilterProp, onGlobalFilterChange, sort: sortProp, onSortChange, }: DataTableStateProps) => DataTableState;
10
+ //# sourceMappingURL=useDataTableState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataTableState.d.ts","sourceRoot":"","sources":["../../../DataTables/useDataTableState.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAAuB,CAAC;AAGjE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,4IAQ3B,mBAAmB,KAAG,cA0BxB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { useControllableState } from './useControllableState.js';
2
+
3
+ const useDataTableState = ({ defaultFilters, filters: filtersProp, onFilter, globalFilter: globalFilterProp, onGlobalFilterChange, sort: sortProp, onSortChange, }) => {
4
+ const [filters, setFilters] = useControllableState(filtersProp, defaultFilters ?? {}, onFilter);
5
+ const [globalFilter, setGlobalFilter] = useControllableState(globalFilterProp, '', onGlobalFilterChange);
6
+ const [sort, setSort] = useControllableState(sortProp, null, onSortChange);
7
+ const updateFilter = (field, constraint) => {
8
+ const next = { ...filters };
9
+ if (constraint)
10
+ next[field] = constraint;
11
+ else
12
+ delete next[field];
13
+ setFilters(next);
14
+ };
15
+ return { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort };
16
+ };
17
+
18
+ export { useDataTableState };
19
+ //# sourceMappingURL=useDataTableState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataTableState.js","sources":["../../../DataTables/useDataTableState.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 type {\n DataTableFilterConstraint,\n DataTableFilterMeta,\n} from './DataTableFilterMeta';\nimport type { DataTableSort } from './DataTableSort';\nimport type { DataTableState } from './DataTableState';\nimport type { DataTableStateProps } from './DataTableStateProps';\nimport { useControllableState } from './useControllableState';\n\n/**\n * The table's filter, search and sort state, each controlled by its prop when set and kept by the\n * table otherwise. Every change is reported through its callback in both modes.\n * @param props The state props of the table.\n * @returns The current state and its setters.\n */\nexport const useDataTableState = ({\n defaultFilters,\n filters: filtersProp,\n onFilter,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n sort: sortProp,\n onSortChange,\n}: DataTableStateProps): DataTableState => {\n const [filters, setFilters] = useControllableState<DataTableFilterMeta>(\n filtersProp,\n defaultFilters ?? {},\n onFilter,\n );\n const [globalFilter, setGlobalFilter] = useControllableState(\n globalFilterProp,\n '',\n onGlobalFilterChange,\n );\n const [sort, setSort] = useControllableState<DataTableSort | null>(\n sortProp,\n null,\n onSortChange,\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 return { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort };\n};\n"],"names":[],"mappings":";;AAkBO,MAAM,iBAAiB,GAAG,CAAC,EAC9B,cAAc,EACd,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,YAAY,EAAE,gBAAgB,EAC9B,oBAAoB,EACpB,IAAI,EAAE,QAAQ,EACd,YAAY,GACM,KAAoB;AACtC,IAAA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,oBAAoB,CAC9C,WAAW,EACX,cAAc,IAAI,EAAE,EACpB,QAAQ,CACX;AACD,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,oBAAoB,CACxD,gBAAgB,EAChB,EAAE,EACF,oBAAoB,CACvB;AACD,IAAA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,oBAAoB,CACxC,QAAQ,EACR,IAAI,EACJ,YAAY,CACf;AACD,IAAA,MAAM,YAAY,GAAG,CACjB,KAAa,EACb,UAAiD,KACjD;AACA,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE;AAC3B,QAAA,IAAI,UAAU;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU;;AACnC,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC;AACpB,IAAA,CAAC;AACD,IAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;AAClF;;"}
@@ -0,0 +1,9 @@
1
+ import type { RowSelection } from './RowSelection.js';
2
+ import type { RowSelectionSource } from './RowSelectionSource.js';
3
+ /**
4
+ * Single and multiple row selection by data key, or by object identity without one.
5
+ * @param source The rows and the selection to work with.
6
+ * @returns The selection state and actions.
7
+ */
8
+ export declare const useRowSelection: <TData extends object>({ data, visibleRows, dataKey, selection, selectedItems, onSelectedItemsChange, }: RowSelectionSource<TData>) => RowSelection<TData>;
9
+ //# sourceMappingURL=useRowSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRowSelection.d.ts","sourceRoot":"","sources":["../../../DataTables/useRowSelection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAG/D;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,SAAS,MAAM,oFAOjD,kBAAkB,CAAC,KAAK,CAAC,KAAG,YAAY,CAAC,KAAK,CAiGhD,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { useMemo, useRef, useEffect } from 'react';
2
+ import { valueAtPath } from './valueAtPath.js';
3
+
4
+ const useRowSelection = ({ data, visibleRows, dataKey, selection, selectedItems, onSelectedItemsChange, }) => {
5
+ const dataKeyIdentity = (row) => String(valueAtPath(row, dataKey));
6
+ const dataKeyCounts = useMemo(() => {
7
+ const counts = new Map();
8
+ if (!dataKey)
9
+ return counts;
10
+ for (const row of data) {
11
+ const identity = String(valueAtPath(row, dataKey));
12
+ counts.set(identity, (counts.get(identity) ?? 0) + 1);
13
+ }
14
+ return counts;
15
+ }, [data, dataKey]);
16
+ const firstLoadedIndexByDataKey = useMemo(() => {
17
+ const indices = new Map();
18
+ if (!dataKey)
19
+ return indices;
20
+ data.forEach((row, loadedIndex) => {
21
+ const identity = String(valueAtPath(row, dataKey));
22
+ if (!indices.has(identity))
23
+ indices.set(identity, loadedIndex);
24
+ });
25
+ return indices;
26
+ }, [data, dataKey]);
27
+ const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;
28
+ const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;
29
+ const isSelectedRow = (row, loadedIndex) => {
30
+ if (!selection)
31
+ return false;
32
+ if (!dataKey)
33
+ return loadedIndex === selectedLoadedIndex;
34
+ const identity = dataKeyIdentity(row);
35
+ if (identity !== selectedDataKey)
36
+ return false;
37
+ if ((dataKeyCounts.get(identity) ?? 0) <= 1)
38
+ return true;
39
+ if (selectedLoadedIndex >= 0)
40
+ return loadedIndex === selectedLoadedIndex;
41
+ return loadedIndex === firstLoadedIndexByDataKey.get(identity);
42
+ };
43
+ const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);
44
+ const isRowSelected = (row) => dataKey
45
+ ? selectedItemsList.some((selected) => dataKeyIdentity(selected) === dataKeyIdentity(row))
46
+ : selectedItemsList.includes(row);
47
+ const toggleRowSelection = (row) => {
48
+ const next = isRowSelected(row)
49
+ ? selectedItemsList.filter((selected) => dataKey
50
+ ? dataKeyIdentity(selected) !== dataKeyIdentity(row)
51
+ : selected !== row)
52
+ : [...selectedItemsList, row];
53
+ onSelectedItemsChange?.(next);
54
+ };
55
+ const isVisibleRow = (row) => dataKey
56
+ ? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))
57
+ : visibleRows.includes(row);
58
+ const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;
59
+ const allFilteredRowsSelected = visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;
60
+ const someFilteredRowsSelected = selectedVisibleCount > 0 && !allFilteredRowsSelected;
61
+ const selectAllRef = useRef(null);
62
+ useEffect(() => {
63
+ if (selectAllRef.current) {
64
+ selectAllRef.current.indeterminate = someFilteredRowsSelected;
65
+ }
66
+ }, [someFilteredRowsSelected]);
67
+ const toggleSelectAll = () => {
68
+ if (allFilteredRowsSelected) {
69
+ onSelectedItemsChange?.(selectedItemsList.filter((selected) => !isVisibleRow(selected)));
70
+ return;
71
+ }
72
+ const additions = visibleRows.filter((row) => !isRowSelected(row));
73
+ onSelectedItemsChange?.([...selectedItemsList, ...additions]);
74
+ };
75
+ return {
76
+ dataKeyIdentity,
77
+ isSelectedRow,
78
+ isRowSelected,
79
+ toggleRowSelection,
80
+ allFilteredRowsSelected,
81
+ selectAllRef,
82
+ toggleSelectAll,
83
+ };
84
+ };
85
+
86
+ export { useRowSelection };
87
+ //# sourceMappingURL=useRowSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRowSelection.js","sources":["../../../DataTables/useRowSelection.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 { useEffect, useMemo, useRef } from 'react';\nimport type { RowSelection } from './RowSelection';\nimport type { RowSelectionSource } from './RowSelectionSource';\nimport { valueAtPath } from './valueAtPath';\n\n/**\n * Single and multiple row selection by data key, or by object identity without one.\n * @param source The rows and the selection to work with.\n * @returns The selection state and actions.\n */\nexport const useRowSelection = <TData extends object>({\n data,\n visibleRows,\n dataKey,\n selection,\n selectedItems,\n onSelectedItemsChange,\n}: RowSelectionSource<TData>): RowSelection<TData> => {\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 isVisibleRow = (row: TData) =>\n dataKey\n ? visibleRows.some(\n (visible) => dataKeyIdentity(visible) === dataKeyIdentity(row),\n )\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 = 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 return {\n dataKeyIdentity,\n isSelectedRow,\n isRowSelected,\n toggleRowSelection,\n allFilteredRowsSelected,\n selectAllRef,\n toggleSelectAll,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** A value read from a row, with functions turned into their text. */
2
+ export type CellValue = string | number | boolean | bigint | symbol | Date | object | null | undefined;
3
+ /**
4
+ * Reads a dotted property path from a row, only through the row's own properties.
5
+ * @param row The row.
6
+ * @param path The dotted path, such as `address.city`.
7
+ * @returns The value, or undefined when any segment is missing.
8
+ */
9
+ export declare const valueAtPath: (row: Record<string, unknown>, path: string | undefined) => CellValue;
10
+ //# sourceMappingURL=valueAtPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valueAtPath.d.ts","sourceRoot":"","sources":["../../../DataTables/valueAtPath.ts"],"names":[],"mappings":"AAGA,sEAAsE;AACtE,MAAM,MAAM,SAAS,GACjB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAKnF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,GAAG,SAAS,KACzB,SAUF,CAAC"}
@@ -0,0 +1,18 @@
1
+ const asCellValue = (value) => typeof value === 'function' ? String(value) : value;
2
+ const valueAtPath = (row, path) => {
3
+ if (!path)
4
+ return undefined;
5
+ let current = row;
6
+ for (const segment of path.split('.')) {
7
+ if (current === null || typeof current !== 'object')
8
+ return undefined;
9
+ const record = current;
10
+ if (!Object.hasOwn(record, segment))
11
+ return undefined;
12
+ current = asCellValue(record[segment]);
13
+ }
14
+ return current;
15
+ };
16
+
17
+ export { valueAtPath };
18
+ //# sourceMappingURL=valueAtPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valueAtPath.js","sources":["../../../DataTables/valueAtPath.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/** A value read from a row, with functions turned into their text. */\nexport type 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\n/**\n * Reads a dotted property path from a row, only through the row's own properties.\n * @param row The row.\n * @param path The dotted path, such as `address.city`.\n * @returns The value, or undefined when any segment is missing.\n */\nexport const 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"],"names":[],"mappings":"AAOA,MAAM,WAAW,GAAG,CAAC,KAAc,KAC/B,OAAO,KAAK,KAAK,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAI,KAAmB;MAQzD,WAAW,GAAG,CACvB,GAA4B,EAC5B,IAAwB,KACb;AACX,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS;IAC3B,IAAI,OAAO,GAAc,GAAG;IAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACnC,QAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAS;QACrE,MAAM,MAAM,GAAG,OAAkC;QACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAAE,YAAA,OAAO,SAAS;QACrD,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C;AACA,IAAA,OAAO,OAAO;AAClB;;"}
@@ -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 };