@ai-matrx/design-system 0.27.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -0
- package/dist/data-table/copy-helpers.d.cts +1 -1
- package/dist/data-table/copy-helpers.d.ts +1 -1
- package/dist/data-table/filter-engine.d.cts +1 -1
- package/dist/data-table/filter-engine.d.ts +1 -1
- package/dist/data-table/host.d.cts +1 -1
- package/dist/data-table/host.d.ts +1 -1
- package/dist/data-table/index.cjs +39 -7
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.d.cts +3 -3
- package/dist/data-table/index.d.ts +3 -3
- package/dist/data-table/index.js +39 -7
- package/dist/data-table/index.js.map +1 -1
- package/dist/data-table/infer-filter.d.cts +1 -1
- package/dist/data-table/infer-filter.d.ts +1 -1
- package/dist/data-table/layered-filters.d.cts +1 -1
- package/dist/data-table/layered-filters.d.ts +1 -1
- package/dist/data-table/query-control.d.cts +1 -1
- package/dist/data-table/query-control.d.ts +1 -1
- package/dist/data-table/spreadsheet.cjs +37 -6
- package/dist/data-table/spreadsheet.cjs.map +1 -1
- package/dist/data-table/spreadsheet.d.cts +35 -1
- package/dist/data-table/spreadsheet.d.ts +35 -1
- package/dist/data-table/spreadsheet.js +37 -6
- package/dist/data-table/spreadsheet.js.map +1 -1
- package/dist/data-table/types.cjs.map +1 -1
- package/dist/data-table/types.d.cts +2 -2
- package/dist/data-table/types.d.ts +2 -2
- package/dist/data-table/url-state.d.cts +1 -1
- package/dist/data-table/url-state.d.ts +1 -1
- package/dist/data-table/xlsx.d.cts +1 -1
- package/dist/data-table/xlsx.d.ts +1 -1
- package/dist/index.cjs +13 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/{types-D9JBR6ZU.d.ts → types-CFmCZXVn.d.ts} +24 -1
- package/dist/{types-jQddSUnj.d.cts → types-CYkwg9jR.d.cts} +24 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,82 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.30.0 — 2026-09-21
|
|
4
|
+
|
|
5
|
+
**"Set as my default" had not picked an organization for anybody since
|
|
6
|
+
2026-09-19, and went on saying it would.**
|
|
7
|
+
|
|
8
|
+
The owner deleted the durable-default rung from the platform's org resolver on
|
|
9
|
+
2026-09-19 — *"a default organization is at most a per-client DISPLAY
|
|
10
|
+
preference; the org picker may show it and nothing else may read it"* — and
|
|
11
|
+
nobody changed this switch's words. It still read **Set as my default**, with
|
|
12
|
+
*"Next startup opens Acme"* and *"Auto-select this at startup"* underneath.
|
|
13
|
+
|
|
14
|
+
Crew D2 met that on 2026-09-21 and reported it as a persistence bug: the
|
|
15
|
+
selection gone on a fresh browser profile *"with no persistence despite a 'Set
|
|
16
|
+
as my default' toggle implying it should stick"*. Measured on production, the
|
|
17
|
+
selection persists perfectly on the machine that made it — across navigation, a
|
|
18
|
+
fresh tab, the record's own URL and a reload, restored from the apex cookie even
|
|
19
|
+
with the browser cache emptied. What was broken was the sentence.
|
|
20
|
+
|
|
21
|
+
So the switch says what it does — **Keep it at the top** — and it now DOES
|
|
22
|
+
something, which it never did: the starred organization is drawn **first** in
|
|
23
|
+
the list, every other row left in the host's order. With ninety organizations
|
|
24
|
+
in the picker, the one you work in every day was somewhere in the middle of it.
|
|
25
|
+
That is what a star is for in Slack and in Linear.
|
|
26
|
+
|
|
27
|
+
A clause holds the line: no sentence on that control may contain *startup*,
|
|
28
|
+
*next time*, *automatic*, *auto-select* or *by default* again.
|
|
29
|
+
|
|
30
|
+
## 0.29.0 — 2026-09-21
|
|
31
|
+
|
|
32
|
+
**A paste of fifty spreadsheet rows stopped throwing forty-six of them away.**
|
|
33
|
+
|
|
34
|
+
Real-data crew C copied fifty US airports out of a spreadsheet and pasted them
|
|
35
|
+
into a table that held four rows. Four rows were written, and the other
|
|
36
|
+
forty-six came back as *"46 landed past the edge of the table and were
|
|
37
|
+
ignored"* — an honest sentence about a useless outcome. The grid is the one
|
|
38
|
+
thing that knows which rows they were, and it was counting them and dropping
|
|
39
|
+
them.
|
|
40
|
+
|
|
41
|
+
It still does not create rows: the table owns the gestures and the consumer
|
|
42
|
+
owns the writes, and that boundary is what keeps every table's persistence its
|
|
43
|
+
own. So it hands the rows over instead. `spreadsheet.onPastePlan` is the new
|
|
44
|
+
half of the contract:
|
|
45
|
+
|
|
46
|
+
* absent — byte-for-byte the paste that existed before, screened and applied;
|
|
47
|
+
* present — the table computes the plan, applies **nothing**, and hands over
|
|
48
|
+
`accepted` (the cells it would write, already screened by `validateCell`),
|
|
49
|
+
`refusals` (each with the row it belongs to, which they did not carry before,
|
|
50
|
+
and the sentence that says why), `overflow` (the rows past the last row,
|
|
51
|
+
whole, in the grid's current column order) and `pastRightEdge` (cells with no
|
|
52
|
+
column to hold them — those there will never be a home for). `apply()` writes
|
|
53
|
+
the accepted cells exactly as an unconfirmed paste would.
|
|
54
|
+
|
|
55
|
+
That is what lets a surface show a person what is about to be written before it
|
|
56
|
+
is written, and what lets one that knows how to make a row make the other
|
|
57
|
+
forty-six.
|
|
58
|
+
|
|
59
|
+
## 0.28.0 — 2026-09-21
|
|
60
|
+
|
|
61
|
+
**Two organizations with the same name were indistinguishable in the picker.**
|
|
62
|
+
|
|
63
|
+
Real-data crews made duplicates while working — two called "Kessler Lab for
|
|
64
|
+
Applied Microbial Ecology", two called "Wraithmoor Regional Museum of Art &
|
|
65
|
+
Craft" — and reported that a person had no way of knowing which one they were
|
|
66
|
+
about to work in: identical name, identical abbreviation tile, nothing else on
|
|
67
|
+
the row. The list drew the name and nothing else, so there was nothing for it
|
|
68
|
+
to draw.
|
|
69
|
+
|
|
70
|
+
`OrganizationPickerOrganization.distinguisher` is the address — the host's slug,
|
|
71
|
+
or whatever else tells two of them apart — and the picker draws it ONLY on rows
|
|
72
|
+
whose name another row in the same list also carries. That is what Slack does
|
|
73
|
+
with a workspace URL and Google with an account's email, and only where it
|
|
74
|
+
settles the question: a list of distinct names is unchanged, because a second
|
|
75
|
+
line under every row is noise a person learns to skip.
|
|
76
|
+
|
|
77
|
+
**Consumer action:** pass `distinguisher` from whatever your host has (in
|
|
78
|
+
matrx-frontend it is the organization's slug). Omit it and nothing changes.
|
|
79
|
+
|
|
3
80
|
## 0.27.0 — 2026-09-20
|
|
4
81
|
|
|
5
82
|
**Released so the app can have what landed on main after 0.26.0 and had no
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AgentPayloadInput } from './copy-types.cjs';
|
|
2
|
-
import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-
|
|
2
|
+
import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-CYkwg9jR.cjs';
|
|
3
3
|
import '../content-transfer.cjs';
|
|
4
4
|
import 'react';
|
|
5
5
|
import '@ai-matrx/kit/content-transfer';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AgentPayloadInput } from './copy-types.js';
|
|
2
|
-
import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-
|
|
2
|
+
import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-CFmCZXVn.js';
|
|
3
3
|
import '../content-transfer.js';
|
|
4
4
|
import 'react';
|
|
5
5
|
import '@ai-matrx/kit/content-transfer';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MatrxColumnDef, C as ColumnFiltersState, S as SortState, L as LayeredFilterRule, T as TableSearchMatchMode, a as ColumnFilterValue } from '../types-
|
|
1
|
+
import { M as MatrxColumnDef, C as ColumnFiltersState, S as SortState, L as LayeredFilterRule, T as TableSearchMatchMode, a as ColumnFilterValue } from '../types-CYkwg9jR.cjs';
|
|
2
2
|
import '../content-transfer.cjs';
|
|
3
3
|
import 'react';
|
|
4
4
|
import '@ai-matrx/kit/content-transfer';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MatrxColumnDef, C as ColumnFiltersState, S as SortState, L as LayeredFilterRule, T as TableSearchMatchMode, a as ColumnFilterValue } from '../types-
|
|
1
|
+
import { M as MatrxColumnDef, C as ColumnFiltersState, S as SortState, L as LayeredFilterRule, T as TableSearchMatchMode, a as ColumnFilterValue } from '../types-CFmCZXVn.js';
|
|
2
2
|
import '../content-transfer.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
import '@ai-matrx/kit/content-transfer';
|
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { ComponentType, ReactNode, MouseEventHandler } from 'react';
|
|
3
3
|
import { CopyControlProps } from './copy-types.cjs';
|
|
4
4
|
export { AgentPayloadInput, AiCustomSource, AiVariant, CopyExportConfig } from './copy-types.cjs';
|
|
5
|
-
import { b as TableSavedViewsProps, c as MatrxDataTableDensity, d as MatrxDataTableRecordControls } from '../types-
|
|
5
|
+
import { b as TableSavedViewsProps, c as MatrxDataTableDensity, d as MatrxDataTableRecordControls } from '../types-CYkwg9jR.cjs';
|
|
6
6
|
import { MatrxTableMenuTarget, MatrxTableMenuPayload } from './menu-targets.cjs';
|
|
7
7
|
import '../content-transfer.cjs';
|
|
8
8
|
import '@ai-matrx/kit/content-transfer';
|
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { ComponentType, ReactNode, MouseEventHandler } from 'react';
|
|
3
3
|
import { CopyControlProps } from './copy-types.js';
|
|
4
4
|
export { AgentPayloadInput, AiCustomSource, AiVariant, CopyExportConfig } from './copy-types.js';
|
|
5
|
-
import { b as TableSavedViewsProps, c as MatrxDataTableDensity, d as MatrxDataTableRecordControls } from '../types-
|
|
5
|
+
import { b as TableSavedViewsProps, c as MatrxDataTableDensity, d as MatrxDataTableRecordControls } from '../types-CFmCZXVn.js';
|
|
6
6
|
import { MatrxTableMenuTarget, MatrxTableMenuPayload } from './menu-targets.js';
|
|
7
7
|
import '../content-transfer.js';
|
|
8
8
|
import '@ai-matrx/kit/content-transfer';
|
|
@@ -8482,7 +8482,7 @@ function useSpreadsheetGrid(options) {
|
|
|
8482
8482
|
} catch {
|
|
8483
8483
|
reason = void 0;
|
|
8484
8484
|
}
|
|
8485
|
-
if (reason) refusals.push({ columnId: patch.columnId, reason });
|
|
8485
|
+
if (reason) refusals.push({ rowId: patch.rowId, columnId: patch.columnId, reason });
|
|
8486
8486
|
else accepted.push(patch);
|
|
8487
8487
|
}
|
|
8488
8488
|
return { accepted, refusals };
|
|
@@ -8561,6 +8561,7 @@ function useSpreadsheetGrid(options) {
|
|
|
8561
8561
|
if (rowId === void 0 || columnId2 === void 0) continue;
|
|
8562
8562
|
if (!current.isColumnWritable(columnId2)) {
|
|
8563
8563
|
skipped.push({
|
|
8564
|
+
rowId,
|
|
8564
8565
|
columnId: columnId2,
|
|
8565
8566
|
reason: current.columnRefusal?.(columnId2) ?? `${columnId2} cannot be cleared.`
|
|
8566
8567
|
});
|
|
@@ -8724,18 +8725,33 @@ function useSpreadsheetGrid(options) {
|
|
|
8724
8725
|
if (startRow === -1 || startCol === -1) return;
|
|
8725
8726
|
const patches = [];
|
|
8726
8727
|
const skipped = [];
|
|
8727
|
-
let
|
|
8728
|
+
let pastRightEdge = 0;
|
|
8729
|
+
const overflow = [];
|
|
8728
8730
|
for (let r = 0; r < block.length; r += 1) {
|
|
8729
8731
|
const line = block[r] ?? [];
|
|
8732
|
+
const rowId = rowIds[startRow + r];
|
|
8733
|
+
if (rowId === void 0) {
|
|
8734
|
+
const beyond = {};
|
|
8735
|
+
for (let c = 0; c < line.length; c += 1) {
|
|
8736
|
+
const columnId2 = columnIds[startCol + c];
|
|
8737
|
+
if (columnId2 === void 0) {
|
|
8738
|
+
pastRightEdge += 1;
|
|
8739
|
+
continue;
|
|
8740
|
+
}
|
|
8741
|
+
beyond[columnId2] = line[c] ?? "";
|
|
8742
|
+
}
|
|
8743
|
+
overflow.push(beyond);
|
|
8744
|
+
continue;
|
|
8745
|
+
}
|
|
8730
8746
|
for (let c = 0; c < line.length; c += 1) {
|
|
8731
|
-
const rowId = rowIds[startRow + r];
|
|
8732
8747
|
const columnId2 = columnIds[startCol + c];
|
|
8733
|
-
if (
|
|
8734
|
-
|
|
8748
|
+
if (columnId2 === void 0) {
|
|
8749
|
+
pastRightEdge += 1;
|
|
8735
8750
|
continue;
|
|
8736
8751
|
}
|
|
8737
8752
|
if (!current.isColumnWritable(columnId2)) {
|
|
8738
8753
|
skipped.push({
|
|
8754
|
+
rowId,
|
|
8739
8755
|
columnId: columnId2,
|
|
8740
8756
|
reason: current.columnRefusal?.(columnId2) ?? `${columnId2} cannot take a pasted value.`
|
|
8741
8757
|
});
|
|
@@ -8745,9 +8761,24 @@ function useSpreadsheetGrid(options) {
|
|
|
8745
8761
|
}
|
|
8746
8762
|
}
|
|
8747
8763
|
const screened = screenPatches(patches);
|
|
8764
|
+
const refusals = [...skipped, ...screened.refusals];
|
|
8765
|
+
if (current.onPastePlan) {
|
|
8766
|
+
const accepted = screened.accepted;
|
|
8767
|
+
current.onPastePlan({
|
|
8768
|
+
accepted,
|
|
8769
|
+
refusals,
|
|
8770
|
+
overflow,
|
|
8771
|
+
pastRightEdge,
|
|
8772
|
+
apply: async () => {
|
|
8773
|
+
await applyPatches(accepted, "paste", "Pasted");
|
|
8774
|
+
}
|
|
8775
|
+
});
|
|
8776
|
+
return;
|
|
8777
|
+
}
|
|
8748
8778
|
void applyPatches(screened.accepted, "paste", "Pasted");
|
|
8779
|
+
const outside = pastRightEdge + overflow.reduce((n2, row) => n2 + Object.keys(row).length, 0);
|
|
8749
8780
|
const tail = outside > 0 ? ` ${outside} landed past the edge of the table and were ignored.` : "";
|
|
8750
|
-
announceSkips(
|
|
8781
|
+
announceSkips(refusals, `Pasted ${screened.accepted.length} cells.${tail}`);
|
|
8751
8782
|
},
|
|
8752
8783
|
[range, rowIds, columnIds, applyPatches, announceSkips, screenPatches]
|
|
8753
8784
|
);
|
|
@@ -13172,7 +13203,8 @@ function MatrxDataTableCore({
|
|
|
13172
13203
|
...spreadsheet.paste === void 0 ? {} : { paste: spreadsheet.paste },
|
|
13173
13204
|
notify: spreadsheet.notify ?? ((message) => toast.success(message)),
|
|
13174
13205
|
onEditRequest: (address, seed) => requestCellEditRef.current(address, seed),
|
|
13175
|
-
...spreadsheet.validateCell ? { validateCell: spreadsheet.validateCell } : {}
|
|
13206
|
+
...spreadsheet.validateCell ? { validateCell: spreadsheet.validateCell } : {},
|
|
13207
|
+
...spreadsheet.onPastePlan ? { onPastePlan: spreadsheet.onPastePlan } : {}
|
|
13176
13208
|
} : null
|
|
13177
13209
|
);
|
|
13178
13210
|
const sheetRef = (0, import_react21.useRef)(sheet);
|