@ai-matrx/design-system 0.32.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/content-transfer.cjs +3 -1
  3. package/dist/content-transfer.cjs.map +1 -1
  4. package/dist/content-transfer.js +3 -1
  5. package/dist/content-transfer.js.map +1 -1
  6. package/dist/data-table/copy-helpers.d.cts +1 -1
  7. package/dist/data-table/copy-helpers.d.ts +1 -1
  8. package/dist/data-table/data-row-inspector.cjs +3 -1
  9. package/dist/data-table/data-row-inspector.cjs.map +1 -1
  10. package/dist/data-table/data-row-inspector.js +3 -1
  11. package/dist/data-table/data-row-inspector.js.map +1 -1
  12. package/dist/data-table/data-row-window.cjs +3 -1
  13. package/dist/data-table/data-row-window.cjs.map +1 -1
  14. package/dist/data-table/data-row-window.js +3 -1
  15. package/dist/data-table/data-row-window.js.map +1 -1
  16. package/dist/data-table/filter-engine.d.cts +1 -1
  17. package/dist/data-table/filter-engine.d.ts +1 -1
  18. package/dist/data-table/host.d.cts +1 -1
  19. package/dist/data-table/host.d.ts +1 -1
  20. package/dist/data-table/index.cjs +95 -34
  21. package/dist/data-table/index.cjs.map +1 -1
  22. package/dist/data-table/index.d.cts +2 -2
  23. package/dist/data-table/index.d.ts +2 -2
  24. package/dist/data-table/index.js +95 -34
  25. package/dist/data-table/index.js.map +1 -1
  26. package/dist/data-table/infer-filter.d.cts +1 -1
  27. package/dist/data-table/infer-filter.d.ts +1 -1
  28. package/dist/data-table/layered-filters.d.cts +1 -1
  29. package/dist/data-table/layered-filters.d.ts +1 -1
  30. package/dist/data-table/query-control.d.cts +1 -1
  31. package/dist/data-table/query-control.d.ts +1 -1
  32. package/dist/data-table/types.cjs.map +1 -1
  33. package/dist/data-table/types.d.cts +1 -1
  34. package/dist/data-table/types.d.ts +1 -1
  35. package/dist/data-table/url-state.d.cts +1 -1
  36. package/dist/data-table/url-state.d.ts +1 -1
  37. package/dist/data-table/xlsx.d.cts +1 -1
  38. package/dist/data-table/xlsx.d.ts +1 -1
  39. package/dist/index.cjs +33 -4
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +28 -0
  42. package/dist/index.d.ts +28 -0
  43. package/dist/index.js +33 -4
  44. package/dist/index.js.map +1 -1
  45. package/dist/{types-CFmCZXVn.d.ts → types-Cxm5XK0L.d.ts} +25 -7
  46. package/dist/{types-CYkwg9jR.d.cts → types-kiV-CAuZ.d.cts} +25 -7
  47. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,67 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.35.0 — 2026-09-22
4
+
5
+ **A popover may now be sized by its CONTENT, because a fixed width cannot be right for a
6
+ name nobody chose the length of.** (lane FIX-14.)
7
+
8
+ `PopoverContent` was `w-72` for everyone, so every surface showing content of unknown
9
+ length pasted its own width over it — and `@ai-matrx/records-ui`'s relation picker pasted
10
+ `w-64`, which is how the one control whose job is to show the name you are about to create
11
+ came to read `Create “Marisol Okonkwo — 418 Calle Pu`, cut mid-word.
12
+
13
+ * New `sizing` prop. `"fixed"` (default) is exactly the old `w-72` — nothing moves for any
14
+ existing caller. `"content"` grows to its content between an honest floor and an honest
15
+ ceiling: at least the trigger's width and at least 20rem (the width Airtable's and
16
+ Notion's link-record pickers settle on), at most 28rem, and never wider than the viewport
17
+ less a 1rem gutter each side. The floor is clamped by the same gutter, so on a very
18
+ narrow screen the ceiling still wins.
19
+ * **Consumer action:** a popover whose body shows a record title, a person's name, or any
20
+ other value the system did not choose passes `sizing="content"` and removes its own
21
+ `w-*` class. Content beyond the ceiling truncates with an ellipsis and a `title` — that
22
+ part belongs to the caller.
23
+
24
+ Measured headlessly at 1600×1000 and at 375 wide on the records-ui harness against the live
25
+ store: the picker's popover is 408px and shows the whole name on the desktop viewport, and
26
+ 343px with a real `text-overflow: ellipsis` on the phone, inside the viewport both times.
27
+ Suite: 103 files / 1114 tests green, `tsc --noEmit` clean.
28
+
29
+ ## 0.34.0 — 2026-09-21
30
+
31
+ **The release gate was red on main, and the red was a stale expectation.**
32
+
33
+ 0.33.0's tag could not publish: `default-copy-regressions.test.tsx` required a
34
+ JSON-`null` cell to copy as the literal word `null` in HTML and CSV, and
35
+ `@ai-matrx/kit` 0.16.1 had just stopped doing that on purpose — a host
36
+ normalises a missing cell to `null` so the row keeps its shape, and a row
37
+ copied out of this very table arrived in Sheets carrying `null` as TEXT in its
38
+ empty columns (observed live 2026-09-15). The same test's workbook leg had
39
+ always expected an empty cell, so it was asserting two answers for one value.
40
+ Both clauses now expect empty, with a clause that no copied cell may contain
41
+ the word again. No product code changed in this release beyond 0.33.0's
42
+ contents.
43
+
44
+ ## 0.33.0 — 2026-09-21
45
+
46
+ **The organization picker stops negating the matches one click below it, and a
47
+ frozen column stops showing the rows sliding under it.**
48
+
49
+ - `OrganizationPicker` — when every match for a search is a test organization,
50
+ the picker used to say *"Nothing matches “X” outside the test organizations
51
+ below."* `isTestFixture` rows are query-filtered, so those rows below **are**
52
+ matches for X: the sentence opened by denying the thing sitting one click
53
+ away, and a person who reads "nothing matches" retypes their search instead
54
+ of clicking. It now says what is true and carries the click that reveals
55
+ them — *"1 match for “vis” is in your test organizations — show them"* — and
56
+ reads "listed below" once open. Two clauses in
57
+ `src/organization-picker.test.tsx` hold the wording.
58
+ - `MatrxDataTable` frozen columns are painted **opaque**, with the paint taken
59
+ from the semantic surface tokens rather than a literal colour, so a frozen
60
+ column matches its theme instead of being a hardcoded swatch and the
61
+ scrolled rows no longer show through it.
62
+
63
+ Additive: no API changed.
64
+
3
65
  ## 0.32.0 — 2026-09-21
4
66
 
5
67
  **The organization picker stopped being a filing cabinet.**
@@ -597,6 +597,7 @@ var PopoverContent = React7.forwardRef(
597
597
  sideOffset = 4,
598
598
  container,
599
599
  animated = true,
600
+ sizing = "fixed",
600
601
  ...props
601
602
  }, ref) => {
602
603
  const portalContainer = usePortalContainer(container);
@@ -613,7 +614,8 @@ var PopoverContent = React7.forwardRef(
613
614
  // z, DOM portal order decides, so a dialog opened FROM a popover stacks
614
615
  // above it, and a popover opened from a dialog still stacks above the
615
616
  // dialog. z-[10001] buried dialogs behind fullscreen popovers.
616
- "z-[10000] w-72 max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none",
617
+ "z-[10000] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none",
618
+ sizing === "content" ? "w-auto min-w-[min(max(var(--radix-popover-trigger-width),20rem),calc(100vw-2rem))] max-w-[min(28rem,calc(100vw-2rem))]" : "w-72",
617
619
  animated && MOTION_POPPER,
618
620
  className
619
621
  ),