@loj-lang/rdsl-runtime 0.5.0 → 0.6.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 (125) hide show
  1. package/dist/components/Badge.d.ts +2 -1
  2. package/dist/components/Badge.d.ts.map +1 -1
  3. package/dist/components/Badge.js +2 -2
  4. package/dist/components/ConfirmDialog.d.ts +6 -1
  5. package/dist/components/ConfirmDialog.d.ts.map +1 -1
  6. package/dist/components/ConfirmDialog.js +35 -6
  7. package/dist/components/DataTable.d.ts +35 -2
  8. package/dist/components/DataTable.d.ts.map +1 -1
  9. package/dist/components/DataTable.js +64 -38
  10. package/dist/components/DropdownButton.d.ts +11 -0
  11. package/dist/components/DropdownButton.d.ts.map +1 -0
  12. package/dist/components/DropdownButton.js +9 -0
  13. package/dist/components/ErrorBoundary.d.ts +18 -0
  14. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  15. package/dist/components/ErrorBoundary.js +19 -0
  16. package/dist/components/ErrorState.d.ts +6 -0
  17. package/dist/components/ErrorState.d.ts.map +1 -0
  18. package/dist/components/ErrorState.js +25 -0
  19. package/dist/components/FilterBar.d.ts +2 -0
  20. package/dist/components/FilterBar.d.ts.map +1 -1
  21. package/dist/components/FilterBar.js +3 -2
  22. package/dist/components/FormField.d.ts +7 -2
  23. package/dist/components/FormField.d.ts.map +1 -1
  24. package/dist/components/FormField.js +16 -5
  25. package/dist/components/GroupedDataTable.d.ts.map +1 -1
  26. package/dist/components/GroupedDataTable.js +40 -59
  27. package/dist/components/Pagination.js +1 -1
  28. package/dist/components/PivotDataTable.d.ts.map +1 -1
  29. package/dist/components/PivotDataTable.js +42 -65
  30. package/dist/components/Tag.d.ts +2 -1
  31. package/dist/components/Tag.d.ts.map +1 -1
  32. package/dist/components/Tag.js +2 -2
  33. package/dist/components/WorkflowSummary.js +6 -6
  34. package/dist/components/readFormatting.d.ts +2 -0
  35. package/dist/components/readFormatting.d.ts.map +1 -0
  36. package/dist/components/readFormatting.js +1 -0
  37. package/dist/derivations.d.ts +3 -0
  38. package/dist/derivations.d.ts.map +1 -0
  39. package/dist/derivations.js +1 -0
  40. package/dist/hooks/browserStorage.d.ts +3 -0
  41. package/dist/hooks/browserStorage.d.ts.map +1 -0
  42. package/dist/hooks/browserStorage.js +1 -0
  43. package/dist/hooks/deleteConfirmation.d.ts +20 -0
  44. package/dist/hooks/deleteConfirmation.d.ts.map +1 -0
  45. package/dist/hooks/deleteConfirmation.js +21 -0
  46. package/dist/hooks/exportDownload.d.ts +16 -0
  47. package/dist/hooks/exportDownload.d.ts.map +1 -0
  48. package/dist/hooks/exportDownload.js +55 -0
  49. package/dist/hooks/formDerivations.d.ts +7 -0
  50. package/dist/hooks/formDerivations.d.ts.map +1 -0
  51. package/dist/hooks/formDerivations.js +23 -0
  52. package/dist/hooks/formSeeds.d.ts +12 -0
  53. package/dist/hooks/formSeeds.d.ts.map +1 -0
  54. package/dist/hooks/formSeeds.js +26 -0
  55. package/dist/hooks/navigation.d.ts +37 -0
  56. package/dist/hooks/navigation.d.ts.map +1 -1
  57. package/dist/hooks/navigation.js +107 -70
  58. package/dist/hooks/readModelStore.d.ts +29 -0
  59. package/dist/hooks/readModelStore.d.ts.map +1 -0
  60. package/dist/hooks/readModelStore.js +135 -0
  61. package/dist/hooks/recordScopedWorkflow.d.ts +13 -0
  62. package/dist/hooks/recordScopedWorkflow.d.ts.map +1 -0
  63. package/dist/hooks/recordScopedWorkflow.js +40 -0
  64. package/dist/hooks/resourceClient.d.ts +39 -0
  65. package/dist/hooks/resourceClient.d.ts.map +1 -1
  66. package/dist/hooks/resourceClient.js +205 -71
  67. package/dist/hooks/resourceErrors.d.ts +13 -0
  68. package/dist/hooks/resourceErrors.d.ts.map +1 -0
  69. package/dist/hooks/resourceErrors.js +140 -0
  70. package/dist/hooks/resourceRowActions.d.ts +17 -0
  71. package/dist/hooks/resourceRowActions.d.ts.map +1 -0
  72. package/dist/hooks/resourceRowActions.js +48 -0
  73. package/dist/hooks/resourceStore.d.ts +2 -24
  74. package/dist/hooks/resourceStore.d.ts.map +1 -1
  75. package/dist/hooks/resourceStore.js +1 -164
  76. package/dist/hooks/resourceTarget.d.ts +1 -1
  77. package/dist/hooks/resourceTarget.d.ts.map +1 -1
  78. package/dist/hooks/resourceTarget.js +1 -22
  79. package/dist/hooks/serverListStore.d.ts +3 -0
  80. package/dist/hooks/serverListStore.d.ts.map +1 -0
  81. package/dist/hooks/serverListStore.js +1 -0
  82. package/dist/hooks/sessionCaches.d.ts +6 -0
  83. package/dist/hooks/sessionCaches.d.ts.map +1 -0
  84. package/dist/hooks/sessionCaches.js +14 -0
  85. package/dist/hooks/transitionedSetter.d.ts +2 -0
  86. package/dist/hooks/transitionedSetter.d.ts.map +1 -0
  87. package/dist/hooks/transitionedSetter.js +9 -0
  88. package/dist/hooks/useAuth.d.ts +18 -0
  89. package/dist/hooks/useAuth.d.ts.map +1 -1
  90. package/dist/hooks/useAuth.js +30 -0
  91. package/dist/hooks/useCollectionView.d.ts +2 -8
  92. package/dist/hooks/useCollectionView.d.ts.map +1 -1
  93. package/dist/hooks/useCollectionView.js +8 -36
  94. package/dist/hooks/useDocumentMetadata.d.ts.map +1 -1
  95. package/dist/hooks/useDocumentMetadata.js +57 -0
  96. package/dist/hooks/useGroupedCollectionView.d.ts +2 -7
  97. package/dist/hooks/useGroupedCollectionView.d.ts.map +1 -1
  98. package/dist/hooks/useGroupedCollectionView.js +8 -52
  99. package/dist/hooks/useI18n.d.ts +21 -0
  100. package/dist/hooks/useI18n.d.ts.map +1 -0
  101. package/dist/hooks/useI18n.js +86 -0
  102. package/dist/hooks/useReadModel.d.ts +15 -0
  103. package/dist/hooks/useReadModel.d.ts.map +1 -1
  104. package/dist/hooks/useReadModel.js +127 -40
  105. package/dist/hooks/useResource.d.ts +7 -0
  106. package/dist/hooks/useResource.d.ts.map +1 -1
  107. package/dist/hooks/useResource.js +159 -3
  108. package/dist/hooks/useStoredState.d.ts +15 -0
  109. package/dist/hooks/useStoredState.d.ts.map +1 -0
  110. package/dist/hooks/useStoredState.js +28 -0
  111. package/dist/hooks/useToast.d.ts.map +1 -1
  112. package/dist/hooks/useToast.js +1 -1
  113. package/dist/hooks/workflowTransition.d.ts +21 -0
  114. package/dist/hooks/workflowTransition.d.ts.map +1 -0
  115. package/dist/hooks/workflowTransition.js +54 -0
  116. package/dist/index.d.ts +35 -9
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +21 -5
  119. package/dist/policies/can.d.ts +2 -14
  120. package/dist/policies/can.d.ts.map +1 -1
  121. package/dist/policies/can.js +1 -160
  122. package/dist/workflow.d.ts +3 -0
  123. package/dist/workflow.d.ts.map +1 -0
  124. package/dist/workflow.js +1 -0
  125. package/package.json +142 -26
@@ -1,67 +1,48 @@
1
1
  import React from 'react';
2
- function formatValue(value, format) {
3
- if (value === null || value === undefined || value === '')
4
- return '—';
5
- if (format !== 'date')
6
- return String(value);
7
- const date = new Date(String(value));
8
- return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleString();
9
- }
10
- function nextSortState(current, field) {
11
- if (!current || current.field !== field) {
12
- return { field, direction: 'asc' };
13
- }
14
- if (current.direction === 'asc') {
15
- return { field, direction: 'desc' };
16
- }
17
- return null;
18
- }
2
+ import { nextTableSortState } from '../../../runtime-core/dist/tableUi.js';
3
+ import { formatDataTableValue, resolveDataTableActionIntent } from './DataTable.js';
19
4
  export function GroupedDataTable({ columns, groupBy, groups, loading = false, sort = null, onSortChange, actions = [], selectedRowId = null, onSelectRow, selectionName = 'rdsl-grouped-table-selection', }) {
20
5
  const groupColumns = columns.filter((column) => groupBy.includes(column.key));
21
6
  const rowColumns = columns.filter((column) => !groupBy.includes(column.key));
22
7
  const hasSelection = Boolean(onSelectRow);
23
- return (React.createElement("div", { className: "rdsl-grouped-data-table" },
24
- loading ? React.createElement("div", { className: "rdsl-empty" }, "Loading...") : null,
25
- !loading && groups.length === 0 ? React.createElement("div", { className: "rdsl-empty" }, "No records") : null,
26
- !loading
27
- ? groups.map((group) => {
28
- const firstRow = group.rows[0];
29
- return (React.createElement("section", { key: group.id, className: "rdsl-grouped-data-table-group" },
30
- React.createElement("div", { className: "rdsl-grouped-data-table-summary" }, groupColumns.map((column) => {
31
- const value = group.values[column.key];
32
- return (React.createElement("div", { key: column.key, className: "rdsl-grouped-data-table-summary-item" },
33
- React.createElement("strong", null, column.label),
34
- React.createElement("span", null, column.render ? column.render(value, firstRow) : formatValue(value, column.format))));
35
- })),
36
- React.createElement("table", null,
37
- React.createElement("thead", null,
38
- React.createElement("tr", null,
39
- hasSelection ? React.createElement("th", null, "Select") : null,
40
- rowColumns.map((column) => {
41
- const sortable = Boolean(column.sortable && onSortChange);
42
- const activeSort = sort?.field === column.key ? sort.direction : null;
43
- return (React.createElement("th", { key: column.key }, sortable ? (React.createElement("button", { type: "button", className: "rdsl-table-sort", onClick: () => onSortChange?.(nextSortState(sort, column.key)) },
44
- column.label,
45
- activeSort ? ` ${activeSort === 'asc' ? '↑' : '↓'}` : '')) : (column.label)));
46
- }),
47
- actions.length > 0 ? React.createElement("th", null, "Actions") : null)),
48
- React.createElement("tbody", null, group.rows.map((record) => (React.createElement("tr", { key: record.id },
49
- hasSelection ? (React.createElement("td", null,
50
- React.createElement("input", { type: "radio", name: selectionName, checked: selectedRowId === String(record.id), onChange: () => onSelectRow?.(record) }))) : null,
8
+ return (React.createElement("div", null,
9
+ loading ? React.createElement("div", null, "Loading...") : null,
10
+ !loading && groups.length === 0 ? React.createElement("div", null, "No records") : null,
11
+ groups.map((group) => {
12
+ const firstRow = group.rows[0];
13
+ return (React.createElement("section", { key: group.id },
14
+ React.createElement("div", null, groupColumns.map((column) => {
15
+ const value = group.values[column.key];
16
+ return (React.createElement("div", { key: column.key },
17
+ React.createElement("strong", null, column.label),
18
+ React.createElement("span", null, column.render ? column.render(value, firstRow) : formatDataTableValue(value, column.format, column.enumKeyPrefix, column.enumLabels))));
19
+ })),
20
+ React.createElement("table", null,
21
+ React.createElement("thead", null,
22
+ React.createElement("tr", null,
23
+ hasSelection ? React.createElement("th", null, "Select") : null,
51
24
  rowColumns.map((column) => {
52
- const value = record[column.key];
53
- return (React.createElement("td", { key: column.key }, column.render ? column.render(value, record) : formatValue(value, column.format)));
25
+ const sortable = Boolean(column.sortable && onSortChange);
26
+ const activeSort = sort?.field === column.key ? sort.direction : null;
27
+ return (React.createElement("th", { key: column.key }, sortable ? (React.createElement("button", { type: "button", onClick: () => onSortChange?.(nextTableSortState(sort, column.key)) },
28
+ column.label,
29
+ activeSort ? ` ${activeSort === 'asc' ? '↑' : '↓'}` : '')) : (column.label)));
54
30
  }),
55
- actions.length > 0 ? (React.createElement("td", null,
56
- React.createElement("div", { className: "rdsl-table-actions" }, actions.map((action) => {
57
- const className = action.variant === 'danger'
58
- ? 'rdsl-btn rdsl-btn-danger'
59
- : 'rdsl-btn rdsl-btn-secondary';
60
- if (action.href) {
61
- return (React.createElement("a", { key: action.label, className: className, href: action.href(record) }, action.label));
62
- }
63
- return (React.createElement("button", { key: action.label, type: "button", className: className, onClick: () => action.onClick?.(record) }, action.label));
64
- })))) : null)))))));
65
- })
66
- : null));
31
+ actions.length > 0 ? React.createElement("th", null, "Actions") : null)),
32
+ React.createElement("tbody", null, group.rows.map((record) => (React.createElement("tr", { key: record.id },
33
+ hasSelection ? (React.createElement("td", null,
34
+ React.createElement("input", { type: "radio", name: selectionName, checked: selectedRowId === String(record.id), onChange: () => onSelectRow?.(record) }))) : null,
35
+ rowColumns.map((column) => {
36
+ const value = record[column.key];
37
+ return (React.createElement("td", { key: column.key }, column.render ? column.render(value, record) : formatDataTableValue(value, column.format, column.enumKeyPrefix, column.enumLabels)));
38
+ }),
39
+ actions.length > 0 ? (React.createElement("td", null,
40
+ React.createElement("div", null, actions.map((action) => {
41
+ const intent = resolveDataTableActionIntent(action);
42
+ if (action.href) {
43
+ return (React.createElement("a", { key: action.label, "data-intent": intent, href: action.href(record) }, action.label));
44
+ }
45
+ return (React.createElement("button", { key: action.label, type: "button", "data-intent": intent, onClick: () => action.onClick?.(record) }, action.label));
46
+ })))) : null)))))));
47
+ })));
67
48
  }
@@ -5,7 +5,7 @@ function clampPage(page, total) {
5
5
  export function Pagination({ current, total, onChange }) {
6
6
  const totalPages = Math.max(total, 1);
7
7
  const currentPage = clampPage(current, totalPages);
8
- return (React.createElement("nav", { className: "rdsl-pagination", "aria-label": "Pagination" },
8
+ return (React.createElement("nav", { "aria-label": "Pagination" },
9
9
  React.createElement("button", { type: "button", disabled: currentPage <= 1, onClick: () => onChange(currentPage - 1) }, "Previous"),
10
10
  Array.from({ length: totalPages }, (_, index) => index + 1).map((page) => (React.createElement("button", { key: page, type: "button", "aria-current": page === currentPage ? 'page' : undefined, disabled: page === currentPage, onClick: () => onChange(page) }, page))),
11
11
  React.createElement("button", { type: "button", disabled: currentPage >= totalPages, onClick: () => onChange(currentPage + 1) }, "Next")));
@@ -1 +1 @@
1
- {"version":3,"file":"PivotDataTable.d.ts","sourceRoot":"","sources":["../../src/components/PivotDataTable.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,EAAE,CAAC;CACX;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC3D,OAAO,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0BD,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,EACvD,OAAO,EACP,OAAO,EACP,OAAO,EACP,MAAM,EACN,OAAe,EACf,OAAY,EACZ,aAAoB,EACpB,WAAW,EACX,aAA4C,GAC7C,EAAE,mBAAmB,CAAC,CAAC,CAAC,eA+GxB"}
1
+ {"version":3,"file":"PivotDataTable.d.ts","sourceRoot":"","sources":["../../src/components/PivotDataTable.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,EAAE,CAAC;CACX;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC3D,OAAO,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,EACvD,OAAO,EACP,OAAO,EACP,OAAO,EACP,MAAM,EACN,OAAe,EACf,OAAY,EACZ,aAAoB,EACpB,WAAW,EACX,aAA4C,GAC7C,EAAE,mBAAmB,CAAC,CAAC,CAAC,eA2GxB"}
@@ -1,72 +1,49 @@
1
1
  import React from 'react';
2
- function formatValue(value, format) {
3
- if (value === null || value === undefined || value === '')
4
- return '—';
5
- if (format !== 'date')
6
- return String(value);
7
- const date = new Date(String(value));
8
- return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleString();
9
- }
10
- function collectPivotValues(groups, pivotBy) {
11
- const values = [];
12
- for (const group of groups) {
13
- for (const row of group.rows) {
14
- const value = row[pivotBy];
15
- const key = value == null ? '—' : String(value);
16
- if (!values.includes(key)) {
17
- values.push(key);
18
- }
19
- }
20
- }
21
- return values;
22
- }
2
+ import { collectPivotValues } from '../../../runtime-core/dist/tableUi.js';
3
+ import { formatDataTableValue, resolveDataTableActionIntent } from './DataTable.js';
23
4
  export function PivotDataTable({ columns, groupBy, pivotBy, groups, loading = false, actions = [], selectedRowId = null, onSelectRow, selectionName = 'rdsl-pivot-table-selection', }) {
24
5
  const groupColumns = columns.filter((column) => groupBy.includes(column.key));
25
6
  const pivotColumns = columns.filter((column) => !groupBy.includes(column.key) && column.key !== pivotBy);
26
7
  const pivotValues = React.useMemo(() => collectPivotValues(groups, pivotBy), [groups, pivotBy]);
27
8
  const hasSelection = Boolean(onSelectRow);
28
- return (React.createElement("div", { className: "rdsl-pivot-data-table" },
29
- loading ? React.createElement("div", { className: "rdsl-empty" }, "Loading...") : null,
30
- !loading && groups.length === 0 ? React.createElement("div", { className: "rdsl-empty" }, "No records") : null,
31
- !loading
32
- ? groups.map((group) => {
33
- const firstRow = group.rows[0];
34
- return (React.createElement("section", { key: group.id, className: "rdsl-pivot-data-table-group" },
35
- React.createElement("div", { className: "rdsl-pivot-data-table-summary" }, groupColumns.map((column) => {
36
- const value = group.values[column.key];
37
- return (React.createElement("div", { key: column.key, className: "rdsl-pivot-data-table-summary-item" },
38
- React.createElement("strong", null, column.label),
39
- React.createElement("span", null, column.render ? column.render(value, firstRow) : formatValue(value, column.format))));
40
- })),
41
- React.createElement("table", null,
42
- React.createElement("thead", null,
43
- React.createElement("tr", null, pivotValues.map((value) => (React.createElement("th", { key: value }, value))))),
44
- React.createElement("tbody", null,
45
- React.createElement("tr", null, pivotValues.map((value) => {
46
- const rows = group.rows.filter((row) => {
47
- const rowValue = row[pivotBy];
48
- return (rowValue == null ? '—' : String(rowValue)) === value;
49
- });
50
- return (React.createElement("td", { key: value }, rows.length === 0 ? (React.createElement("div", { className: "rdsl-empty" }, "\u2014")) : (React.createElement("div", { className: "rdsl-pivot-data-table-cell" }, rows.map((record) => (React.createElement("div", { key: record.id, className: "rdsl-pivot-data-table-entry" },
51
- hasSelection ? (React.createElement("label", { className: "rdsl-pivot-data-table-entry-field" },
52
- React.createElement("strong", null, "Select"),
53
- React.createElement("input", { type: "radio", name: selectionName, checked: selectedRowId === String(record.id), onChange: () => onSelectRow?.(record) }))) : null,
54
- pivotColumns.map((column) => {
55
- const columnValue = record[column.key];
56
- return (React.createElement("div", { key: column.key, className: "rdsl-pivot-data-table-entry-field" },
57
- React.createElement("strong", null, column.label),
58
- React.createElement("span", null, column.render ? column.render(columnValue, record) : formatValue(columnValue, column.format))));
59
- }),
60
- actions.length > 0 ? (React.createElement("div", { className: "rdsl-table-actions" }, actions.map((action) => {
61
- const className = action.variant === 'danger'
62
- ? 'rdsl-btn rdsl-btn-danger'
63
- : 'rdsl-btn rdsl-btn-secondary';
64
- if (action.href) {
65
- return (React.createElement("a", { key: action.label, className: className, href: action.href(record) }, action.label));
66
- }
67
- return (React.createElement("button", { key: action.label, type: "button", className: className, onClick: () => action.onClick?.(record) }, action.label));
68
- }))) : null)))))));
69
- }))))));
70
- })
71
- : null));
9
+ return (React.createElement("div", null,
10
+ loading ? React.createElement("div", null, "Loading...") : null,
11
+ !loading && groups.length === 0 ? React.createElement("div", null, "No records") : null,
12
+ groups.map((group) => {
13
+ const firstRow = group.rows[0];
14
+ return (React.createElement("section", { key: group.id },
15
+ React.createElement("div", null, groupColumns.map((column) => {
16
+ const value = group.values[column.key];
17
+ return (React.createElement("div", { key: column.key },
18
+ React.createElement("strong", null, column.label),
19
+ React.createElement("span", null, column.render ? column.render(value, firstRow) : formatDataTableValue(value, column.format, column.enumKeyPrefix, column.enumLabels))));
20
+ })),
21
+ React.createElement("table", null,
22
+ React.createElement("thead", null,
23
+ React.createElement("tr", null, pivotValues.map((value) => (React.createElement("th", { key: value }, value))))),
24
+ React.createElement("tbody", null,
25
+ React.createElement("tr", null, pivotValues.map((value) => {
26
+ const rows = group.rows.filter((row) => {
27
+ const rowValue = row[pivotBy];
28
+ return (rowValue == null ? '—' : String(rowValue)) === value;
29
+ });
30
+ return (React.createElement("td", { key: value }, rows.length === 0 ? (React.createElement("div", null, "\u2014")) : (React.createElement("div", null, rows.map((record) => (React.createElement("div", { key: record.id },
31
+ hasSelection ? (React.createElement("label", null,
32
+ React.createElement("strong", null, "Select"),
33
+ React.createElement("input", { type: "radio", name: selectionName, checked: selectedRowId === String(record.id), onChange: () => onSelectRow?.(record) }))) : null,
34
+ pivotColumns.map((column) => {
35
+ const columnValue = record[column.key];
36
+ return (React.createElement("div", { key: column.key },
37
+ React.createElement("strong", null, column.label),
38
+ React.createElement("span", null, column.render ? column.render(columnValue, record) : formatDataTableValue(columnValue, column.format, column.enumKeyPrefix, column.enumLabels))));
39
+ }),
40
+ actions.length > 0 ? (React.createElement("div", null, actions.map((action) => {
41
+ const intent = resolveDataTableActionIntent(action);
42
+ if (action.href) {
43
+ return (React.createElement("a", { key: action.label, "data-intent": intent, href: action.href(record) }, action.label));
44
+ }
45
+ return (React.createElement("button", { key: action.label, type: "button", "data-intent": intent, onClick: () => action.onClick?.(record) }, action.label));
46
+ }))) : null)))))));
47
+ }))))));
48
+ })));
72
49
  }
@@ -1,6 +1,7 @@
1
1
  export interface TagProps {
2
2
  value: string;
3
3
  colors: Record<string, string>;
4
+ displayValue?: string;
4
5
  }
5
- export declare function Tag({ value, colors }: TagProps): JSX.Element;
6
+ export declare function Tag({ value, colors, displayValue }: TagProps): JSX.Element;
6
7
  //# sourceMappingURL=Tag.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["../../src/components/Tag.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,eAO9C"}
1
+ {"version":3,"file":"Tag.d.ts","sourceRoot":"","sources":["../../src/components/Tag.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,QAAQ,eAO5D"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- export function Tag({ value, colors }) {
2
+ export function Tag({ value, colors, displayValue }) {
3
3
  const color = colors[value] ?? 'gray';
4
- return (React.createElement("span", { className: "rdsl-tag", style: { backgroundColor: color, color: 'white', padding: '0.125rem 0.5rem', borderRadius: '999px' } }, value));
4
+ return (React.createElement("span", { className: "rdsl-tag", style: { backgroundColor: color, color: 'white', padding: '0.125rem 0.5rem', borderRadius: '999px' } }, displayValue ?? value));
5
5
  }
@@ -1,16 +1,16 @@
1
1
  import React from 'react';
2
2
  export function WorkflowSummary({ stateHeading, stateLabel, currentStepName, nextStepName, steps, }) {
3
- return (React.createElement("section", { className: "rdsl-workflow-summary" },
4
- React.createElement("div", { className: "rdsl-read-actions" },
3
+ return (React.createElement("section", null,
4
+ React.createElement("div", null,
5
5
  React.createElement("strong", null, stateHeading),
6
- React.createElement("span", { className: "rdsl-btn rdsl-btn-secondary" }, stateLabel)),
7
- React.createElement("div", { className: "rdsl-read-actions" },
6
+ React.createElement("span", { "data-intent": "default" }, stateLabel)),
7
+ React.createElement("div", null,
8
8
  React.createElement("strong", null, "Current step"),
9
9
  React.createElement("span", null, currentStepName ?? '—')),
10
- nextStepName ? (React.createElement("div", { className: "rdsl-read-actions" },
10
+ nextStepName ? (React.createElement("div", null,
11
11
  React.createElement("strong", null, "Next step"),
12
12
  React.createElement("span", null, nextStepName))) : null,
13
- steps.length > 0 ? (React.createElement("ol", { className: "rdsl-related-list" }, steps.map((step) => (React.createElement("li", { key: step.name },
13
+ steps.length > 0 ? (React.createElement("ol", null, steps.map((step) => (React.createElement("li", { key: step.name },
14
14
  React.createElement("strong", null, step.name),
15
15
  ' ',
16
16
  React.createElement("span", null, step.status)))))) : null));
@@ -0,0 +1,2 @@
1
+ export { formatReadValue, resolveModelDisplayValue, } from '../../../runtime-core/dist/readFormatting.js';
2
+ //# sourceMappingURL=readFormatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readFormatting.d.ts","sourceRoot":"","sources":["../../src/components/readFormatting.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,wBAAwB,GACzB,MAAM,8CAA8C,CAAC"}
@@ -0,0 +1 @@
1
+ export { formatReadValue, resolveModelDisplayValue, } from '../../../runtime-core/dist/readFormatting.js';
@@ -0,0 +1,3 @@
1
+ export { applyDerivedListItems, applyDerivedObjectFields, nativeExprCallBuiltin, nativeExprEquals, nativeExprInList, nativeExprLike, nativeExprQuantifier, nativeExprReadPath, } from '../../runtime-core/dist/derivations.js';
2
+ export type { CompiledDerivationEntry } from '../../runtime-core/dist/derivations.js';
3
+ //# sourceMappingURL=derivations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivations.d.ts","sourceRoot":"","sources":["../src/derivations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,wCAAwC,CAAC;AAChD,YAAY,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1 @@
1
+ export { applyDerivedListItems, applyDerivedObjectFields, nativeExprCallBuiltin, nativeExprEquals, nativeExprInList, nativeExprLike, nativeExprQuantifier, nativeExprReadPath, } from '../../runtime-core/dist/derivations.js';
@@ -0,0 +1,3 @@
1
+ export { readStoredJsonValue, writeStoredJsonValue } from '../../../runtime-core/dist/browserStorage.js';
2
+ export type { BrowserStorageKind } from '../../../runtime-core/dist/browserStorage.js';
3
+ //# sourceMappingURL=browserStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/browserStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACzG,YAAY,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC"}
@@ -0,0 +1 @@
1
+ export { readStoredJsonValue, writeStoredJsonValue } from '../../../runtime-core/dist/browserStorage.js';
@@ -0,0 +1,20 @@
1
+ interface DeleteConfirmationResource {
2
+ deleteItem(id: string): Promise<unknown>;
3
+ }
4
+ export declare function useDeleteConfirmation(options: {
5
+ resource: DeleteConfirmationResource;
6
+ confirmMessage: string;
7
+ successMessage: string;
8
+ afterDelete?: () => void;
9
+ }): {
10
+ confirmState: {
11
+ open: boolean;
12
+ id?: string;
13
+ message?: string;
14
+ };
15
+ requestDelete: (id: string) => void;
16
+ confirmDelete: () => Promise<void>;
17
+ cancelDelete: () => void;
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=deleteConfirmation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteConfirmation.d.ts","sourceRoot":"","sources":["../../src/hooks/deleteConfirmation.ts"],"names":[],"mappings":"AAGA,UAAU,0BAA0B;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,0BAA0B,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B,GAAG;IACF,YAAY,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAsBA"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { useToast } from './useToast.js';
3
+ export function useDeleteConfirmation(options) {
4
+ const toast = useToast();
5
+ const [confirmState, setConfirmState] = React.useState({ open: false });
6
+ const requestDelete = React.useCallback((id) => {
7
+ setConfirmState({ open: true, id, message: options.confirmMessage });
8
+ }, [options.confirmMessage]);
9
+ const cancelDelete = React.useCallback(() => {
10
+ setConfirmState({ open: false });
11
+ }, []);
12
+ const confirmDelete = React.useCallback(async () => {
13
+ if (confirmState.id) {
14
+ await options.resource.deleteItem(confirmState.id);
15
+ toast.success(options.successMessage);
16
+ options.afterDelete?.();
17
+ }
18
+ setConfirmState({ open: false });
19
+ }, [confirmState.id, options.afterDelete, options.resource, options.successMessage, toast]);
20
+ return { confirmState, requestDelete, confirmDelete, cancelDelete };
21
+ }
@@ -0,0 +1,16 @@
1
+ import type { ResourceExportPayload, ResourceListQuery } from './resourceClient.js';
2
+ interface ExportDownloadResource {
3
+ exportList(format: string, query?: ResourceListQuery): Promise<ResourceExportPayload>;
4
+ }
5
+ export declare function useExportDownload(options: {
6
+ resource: ExportDownloadResource;
7
+ buildQuery: (format: 'csv' | 'xlsx') => ResourceListQuery;
8
+ resolveFallbackFilename: (format: 'csv' | 'xlsx') => string;
9
+ readyMessage: string;
10
+ failedMessage: string;
11
+ }): {
12
+ exportInFlight: boolean;
13
+ handleExport: (format: 'csv' | 'xlsx') => Promise<void>;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=exportDownload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportDownload.d.ts","sourceRoot":"","sources":["../../src/hooks/exportDownload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEpF,UAAU,sBAAsB;IAC9B,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACvF;AA8BD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,KAAK,iBAAiB,CAAC;IAC1D,uBAAuB,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG;IACF,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD,CA2BA"}
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { resolveDisplayableErrorMessage } from './resourceErrors.js';
3
+ import { useToast } from './useToast.js';
4
+ function downloadExportPayload(payload, format, fallbackFilename) {
5
+ if (typeof window === 'undefined') {
6
+ return;
7
+ }
8
+ const blob = new Blob([payload.bytes], {
9
+ type: payload.contentType || (format === 'xlsx'
10
+ ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
11
+ : 'text/csv; charset=utf-8'),
12
+ });
13
+ const downloadUrl = window.URL.createObjectURL(blob);
14
+ const anchor = document.createElement('a');
15
+ try {
16
+ anchor.href = downloadUrl;
17
+ anchor.download = payload.filename || fallbackFilename;
18
+ document.body.appendChild(anchor);
19
+ anchor.click();
20
+ }
21
+ finally {
22
+ if (anchor.parentNode) {
23
+ anchor.parentNode.removeChild(anchor);
24
+ }
25
+ window.URL.revokeObjectURL(downloadUrl);
26
+ }
27
+ }
28
+ export function useExportDownload(options) {
29
+ const toast = useToast();
30
+ const [exportInFlight, setExportInFlight] = React.useState(false);
31
+ const exportInFlightRef = React.useRef(false);
32
+ const handleExport = React.useCallback(async (format) => {
33
+ if (exportInFlightRef.current) {
34
+ return;
35
+ }
36
+ exportInFlightRef.current = true;
37
+ setExportInFlight(true);
38
+ try {
39
+ const exported = await options.resource.exportList(format, options.buildQuery(format));
40
+ downloadExportPayload(exported, format, options.resolveFallbackFilename(format));
41
+ toast.success(options.readyMessage);
42
+ }
43
+ catch (err) {
44
+ toast.error(resolveDisplayableErrorMessage(err, options.failedMessage));
45
+ }
46
+ finally {
47
+ exportInFlightRef.current = false;
48
+ setExportInFlight(false);
49
+ }
50
+ }, [options, toast]);
51
+ return {
52
+ exportInFlight,
53
+ handleExport,
54
+ };
55
+ }
@@ -0,0 +1,7 @@
1
+ export interface DerivedFieldSetterSpec {
2
+ name: string;
3
+ field: string;
4
+ kind: 'string' | 'number' | 'boolean';
5
+ }
6
+ export declare function buildDerivedFieldSetters<T extends object>(specs: readonly DerivedFieldSetterSpec[]): Record<string, (target: T, value: unknown) => void>;
7
+ //# sourceMappingURL=formDerivations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formDerivations.d.ts","sourceRoot":"","sources":["../../src/hooks/formDerivations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EACvD,KAAK,EAAE,SAAS,sBAAsB,EAAE,GACvC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,CAsBrD"}
@@ -0,0 +1,23 @@
1
+ export function buildDerivedFieldSetters(specs) {
2
+ return Object.fromEntries(specs.map((spec) => [
3
+ spec.name,
4
+ (target, value) => {
5
+ const record = target;
6
+ if (spec.kind === 'number') {
7
+ const parsed = Number(value);
8
+ if (!Number.isNaN(parsed)) {
9
+ record[spec.field] = parsed;
10
+ }
11
+ return;
12
+ }
13
+ if (value == null) {
14
+ return;
15
+ }
16
+ if (spec.kind === 'boolean') {
17
+ record[spec.field] = Boolean(value);
18
+ return;
19
+ }
20
+ record[spec.field] = String(value);
21
+ },
22
+ ]));
23
+ }
@@ -0,0 +1,12 @@
1
+ export interface SeedParamApplier<T extends object> {
2
+ name: string;
3
+ apply: (target: T, value: string) => void;
4
+ }
5
+ export interface SeedParamSpec {
6
+ name: string;
7
+ field: string;
8
+ kind: 'string' | 'number' | 'boolean' | 'enum';
9
+ enumValues?: readonly string[];
10
+ }
11
+ export declare function buildSeedParamAppliers<T extends object>(specs: readonly SeedParamSpec[]): Array<SeedParamApplier<T>>;
12
+ //# sourceMappingURL=formSeeds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formSeeds.d.ts","sourceRoot":"","sources":["../../src/hooks/formSeeds.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAyB5B"}
@@ -0,0 +1,26 @@
1
+ export function buildSeedParamAppliers(specs) {
2
+ return specs.map((spec) => ({
3
+ name: spec.name,
4
+ apply: (target, value) => {
5
+ const record = target;
6
+ if (spec.kind === 'number') {
7
+ const parsed = Number(value);
8
+ if (!Number.isNaN(parsed)) {
9
+ record[spec.field] = parsed;
10
+ }
11
+ return;
12
+ }
13
+ if (spec.kind === 'boolean') {
14
+ record[spec.field] = value === 'true';
15
+ return;
16
+ }
17
+ if (spec.kind === 'enum') {
18
+ if (spec.enumValues?.includes(value)) {
19
+ record[spec.field] = value;
20
+ }
21
+ return;
22
+ }
23
+ record[spec.field] = value;
24
+ },
25
+ }));
26
+ }
@@ -2,10 +2,39 @@ export declare function normalizeAppBasePath(value: string | null | undefined):
2
2
  export declare function configureAppBasePath(value: string | null | undefined): void;
3
3
  export declare function getConfiguredAppBasePath(): string;
4
4
  export declare function prefixAppBasePath(path: string): string;
5
+ export type AppHrefSearchEntry = readonly unknown[];
6
+ export declare function buildAppHrefWithSearchEntries(path: string, entries: readonly AppHrefSearchEntry[]): string;
7
+ export declare function buildResourceRecordHref(resourceName: string, recordId: string, options?: {
8
+ surface?: 'read' | 'edit' | 'workflow';
9
+ returnTo?: string | null;
10
+ }): string;
11
+ export declare function buildRelatedCollectionHref(parentResourceName: string, recordId: string, relatedPath: string, options?: {
12
+ returnTo?: string | null;
13
+ }): string;
14
+ export declare function buildRelatedCreateHref(resourceName: string, options?: {
15
+ inverseFieldName?: string | null;
16
+ parentId?: string | null;
17
+ returnTo?: string | null;
18
+ }): string;
19
+ export declare function buildWorkflowStepHref(step: {
20
+ surface?: string | null;
21
+ name?: string | null;
22
+ } | null | undefined, options: {
23
+ workflowPath: string;
24
+ readPath?: string | null;
25
+ editPath?: string | null;
26
+ returnTo?: string | null;
27
+ }): string | null;
5
28
  export declare function stripAppBasePath(pathname: string): string;
6
29
  export declare function getCurrentAppPathname(): string;
7
30
  export declare function getCurrentAppHref(): string;
31
+ export declare function navigateToAppHref(href: string | null | undefined): boolean;
8
32
  export declare function getLocationSearchParams(): URLSearchParams | null;
33
+ export declare function getCurrentReturnToNavigation<T extends string | null>(fallbackHref: T): {
34
+ searchParams: URLSearchParams | null;
35
+ returnTo: string | null;
36
+ href: string | T;
37
+ };
9
38
  export declare function shiftDateInputValue(value: string, days: number): string;
10
39
  export declare function getLocationSearchValues<T extends Record<string, string>>(defaultValues: T, options?: {
11
40
  prefix?: string;
@@ -15,6 +44,14 @@ export declare function replaceLocationSearchValues(values: Record<string, strin
15
44
  prefix?: string;
16
45
  keys?: readonly string[];
17
46
  }): void;
47
+ export declare function useLocationSearchState<T extends Record<string, string>>(defaultValues: T, options?: {
48
+ prefix?: string;
49
+ keys?: readonly string[];
50
+ }): readonly [
51
+ T,
52
+ (next: T | ((previous: T) => T)) => void,
53
+ T
54
+ ];
18
55
  export declare function sanitizeAppLocalHref(candidate: string | null | undefined): string | null;
19
56
  export declare function getSanitizedReturnTo(searchParams?: URLSearchParams | null): string | null;
20
57
  //# sourceMappingURL=navigation.d.ts.map