@ai-matrx/design-system 0.86.334 → 0.86.336

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 (79) hide show
  1. package/CHANGELOG.md +28 -68
  2. package/dist/carousel.cjs.map +1 -1
  3. package/dist/carousel.js +4 -4
  4. package/dist/{chunk-MFUNGDHO.js → chunk-B24DLFWR.js} +2 -2
  5. package/dist/{chunk-CSSD6NS4.js → chunk-DQUCOMAC.js} +2 -2
  6. package/dist/chunk-L5OACQXS.js +409 -0
  7. package/dist/chunk-L5OACQXS.js.map +1 -0
  8. package/dist/{chunk-6YZMGSQY.js → chunk-M34WPTPX.js} +2 -2
  9. package/dist/{chunk-7NEVJKDZ.js → chunk-MAMZGJJ3.js} +36 -7
  10. package/dist/chunk-MAMZGJJ3.js.map +1 -0
  11. package/dist/{chunk-VV6WZTH5.js → chunk-PBDQZPKV.js} +2 -2
  12. package/dist/{chunk-E4GS5QH7.js → chunk-Q2HWDJED.js} +2 -2
  13. package/dist/{chunk-ZOQ2XKXF.js → chunk-QOEKPR37.js} +5 -5
  14. package/dist/chunk-QOEKPR37.js.map +1 -0
  15. package/dist/{chunk-MEJVHDYJ.js → chunk-RGJPHRU3.js} +2 -2
  16. package/dist/{chunk-3MQMVPKO.js → chunk-VQ3G6AFN.js} +4 -4
  17. package/dist/{chunk-677JS6TX.js → chunk-WZC3K7SO.js} +75 -158
  18. package/dist/chunk-WZC3K7SO.js.map +1 -0
  19. package/dist/clipboard-fallback-dialog.cjs.map +1 -1
  20. package/dist/clipboard-fallback-dialog.js +1 -1
  21. package/dist/controls.cjs +4 -4
  22. package/dist/controls.cjs.map +1 -1
  23. package/dist/controls.css +6 -0
  24. package/dist/controls.js +4 -4
  25. package/dist/data-table/data-row-inspector.cjs.map +1 -1
  26. package/dist/data-table/data-row-inspector.js +4 -4
  27. package/dist/data-table/data-row-window.cjs.map +1 -1
  28. package/dist/data-table/data-row-window.js +5 -5
  29. package/dist/data-table/index.cjs +4 -4
  30. package/dist/data-table/index.cjs.map +1 -1
  31. package/dist/data-table/index.js +7 -7
  32. package/dist/data-table/pagination.cjs +4 -4
  33. package/dist/data-table/pagination.cjs.map +1 -1
  34. package/dist/data-table/pagination.js +2 -2
  35. package/dist/data-table/uuid-cell.cjs.map +1 -1
  36. package/dist/data-table/uuid-cell.js +2 -2
  37. package/dist/desktop.cjs.map +1 -1
  38. package/dist/desktop.js +9 -8
  39. package/dist/desktop.js.map +1 -1
  40. package/dist/index.cjs +1508 -1187
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +7 -3
  43. package/dist/index.d.ts +7 -3
  44. package/dist/index.js +24 -23
  45. package/dist/index.js.map +1 -1
  46. package/dist/item.cjs +646 -372
  47. package/dist/item.cjs.map +1 -1
  48. package/dist/item.d.cts +1 -3
  49. package/dist/item.d.ts +1 -3
  50. package/dist/item.js +26 -34
  51. package/dist/item.js.map +1 -1
  52. package/dist/lite-table.cjs.map +1 -1
  53. package/dist/lite-table.js +1 -1
  54. package/dist/menu-look.cjs +521 -36
  55. package/dist/menu-look.cjs.map +1 -1
  56. package/dist/menu-look.css +96 -1
  57. package/dist/menu-look.d.cts +320 -37
  58. package/dist/menu-look.d.ts +320 -37
  59. package/dist/menu-look.js +60 -121
  60. package/dist/menu-look.js.map +1 -1
  61. package/dist/record-list.cjs +533 -253
  62. package/dist/record-list.cjs.map +1 -1
  63. package/dist/record-list.js +4 -2
  64. package/dist/record-list.js.map +1 -1
  65. package/dist/settings.cjs.map +1 -1
  66. package/dist/settings.js +2 -2
  67. package/dist/writing-field.cjs.map +1 -1
  68. package/dist/writing-field.js +2 -2
  69. package/package.json +2 -2
  70. package/dist/chunk-677JS6TX.js.map +0 -1
  71. package/dist/chunk-7NEVJKDZ.js.map +0 -1
  72. package/dist/chunk-ZOQ2XKXF.js.map +0 -1
  73. /package/dist/{chunk-MFUNGDHO.js.map → chunk-B24DLFWR.js.map} +0 -0
  74. /package/dist/{chunk-CSSD6NS4.js.map → chunk-DQUCOMAC.js.map} +0 -0
  75. /package/dist/{chunk-6YZMGSQY.js.map → chunk-M34WPTPX.js.map} +0 -0
  76. /package/dist/{chunk-VV6WZTH5.js.map → chunk-PBDQZPKV.js.map} +0 -0
  77. /package/dist/{chunk-E4GS5QH7.js.map → chunk-Q2HWDJED.js.map} +0 -0
  78. /package/dist/{chunk-MEJVHDYJ.js.map → chunk-RGJPHRU3.js.map} +0 -0
  79. /package/dist/{chunk-3MQMVPKO.js.map → chunk-VQ3G6AFN.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,8 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.86.336
4
+
5
+ UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
+ Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/design-system/src`.
7
+
8
+ ## 0.86.335
9
+
10
+ - **Select `hint` never truncates** (vault review, 2026-10-23): in the menu and on the trigger the label truncates and the option's `hint` (a short id) stays whole, so two long same-named options stay told apart (`data-select-hint`). Proof: `src/controls/select-search-hint.test.tsx`. Consumer action: none.
11
+
3
12
  ## 0.86.334
4
13
 
5
- - **Select `hint` and `searchAt`** (2026-10-23): an option's `hint` is muted text after its label in the menu and on the trigger (what tells two same-named options apart: a short id, an owner); `searchAt` puts a search row at the top of the menu once there are at least that many options (matches label, hint and group; "No match" when nothing does). Proof: `src/controls/select-search-hint.test.tsx`. Consumer action: none.
14
+ No separate release note was written for this version; no consumer action known.
6
15
 
7
16
  ## 0.86.333
8
17
 
@@ -21,30 +30,20 @@ has no shipped-source changes outside tests, fixtures and docs). No consumer act
21
30
 
22
31
  ## 0.86.331
23
32
 
24
- SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
25
- so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
26
- Diff: `git diff 12937415f7 00cdf507e0 -- apps/shared/design-system/src`
27
-
28
- Changed shipped source files (1):
29
- - `apps/shared/design-system/src/controls/controls.tsx`
33
+ - **Select `hint` and `searchAt`** (2026-10-23): an option's `hint` is muted text after its label in the menu and on the trigger (what tells two same-named options apart: a short id, an owner); `searchAt` puts a search row at the top of the menu once there are at least that many options (matches label, hint and group; "No match" when nothing does). Proof: `src/controls/select-search-hint.test.tsx`. Consumer action: none.
30
34
 
31
35
  ## 0.86.330
32
36
 
33
37
  - **menu-look: one left edge, no gutter** (Arman, 2026-10-23). `MenuLookRowBody` draws no icon column for a row without a glyph (it used to reserve an empty 16px slot). New `current` on `MenuLookItem` / `MenuLookRowBody`: `data-current`, medium-weight label and a check at the row's END (`cm-current`). New `MenuLookSearch`: the menu's own sticky header-row search, text on the rows' 12px edge. `MenuLookCheckboxItem` keeps its column on and off. Consumer action: drop any invisible check/placeholder glyph used to align rows, and mark the current row with `current`.
34
38
  - **item: `ProductSidebarTop` has one search door.** Removed `search.pool` (place search) and `matchSidebarPlaces`; `search` remains only for a list's own filter. Consumer action: a sidebar whose top row carries a search icon passes no `search`.
35
39
 
36
-
37
-
38
40
  ## 0.86.329
39
41
 
40
42
  - **New light entry `./tap-shortcut` (2026-10-23, FB5).** `formatTapShortcut`, `parseShortcut` and `TapShortcut` with no React, for plain helpers; `./tap-target` re-exports the same three. Consumer action: none.
41
43
 
42
- - **Tile `dashed` and `hoverStyle="fill"`** (2026-10-23): the Tile migration had dropped AddTile's dashed border and the desktop `ListRow`'s pointer fill (`hover:bg-fill-secondary`). Both return as named Tile options: `dashed` (the "add another" tile) and `hoverStyle="fill"` (the desktop secondary fill, the accent outside the desktop look); `AddTile` and `ListRow` use them. Proof: `media-option.test.tsx`, `mac-table-parity.test.tsx`, `tile-named-options.test.tsx`. Consumer action: none.
43
-
44
44
  ## 0.86.328
45
45
 
46
46
  - **Tile `dashed` and `hoverStyle="fill"`** (2026-10-23): the Tile migration had dropped AddTile's dashed border and the desktop `ListRow`'s pointer fill (`hover:bg-fill-secondary`). Both return as named Tile options: `dashed` (the "add another" tile) and `hoverStyle="fill"` (the desktop secondary fill, the accent outside the desktop look); `AddTile` and `ListRow` use them. Proof: `media-option.test.tsx`, `mac-table-parity.test.tsx`, `tile-named-options.test.tsx`. Consumer action: none.
47
- - **Tile named options** (vault 0.1.33 review, 2026-10-23): `selectedStyle="primary"` (the open item of a master list: solid primary, every ink on it, hover too), `tooltip` (the native `title`; `title` stays the visible LABEL), `level` 1|2|3 (nesting: an icon-less child's title starts under its parent's), `fit` (sizes to its content, never shrinks or truncates the title: a code), `oneLine` (the secondary line is one line), `endInset="control"` (room for a control laid over the row's end). Proof: `src/controls/tile-named-options.test.tsx`. Consumer action: a Tile that passed a tooltip string as `title` moves it to `tooltip`; never put `data-surface="primary"` on a quiet Tile (use `selectedStyle="primary"`); replace `pl-*`/`pr-*` on a Tile (its padding is locked) with `level` / `endInset`.
48
47
 
49
48
  ## 0.86.327
50
49
 
@@ -52,7 +51,6 @@ Changed shipped source files (1):
52
51
  - **menu-look: one left edge, no gutter** (Arman, 2026-10-23). `MenuLookRowBody` draws no icon column for a row without a glyph (it used to reserve an empty 16px slot). New `current` on `MenuLookItem` / `MenuLookRowBody`: `data-current`, medium-weight label and a check at the row's END (`cm-current`). New `MenuLookSearch`: the menu's own sticky header-row search, text on the rows' 12px edge. `MenuLookCheckboxItem` keeps its column on and off. Consumer action: drop any invisible check/placeholder glyph used to align rows, and mark the current row with `current`.
53
52
  - **item: `ProductSidebarTop` has one search door.** Removed `search.pool` (place search) and `matchSidebarPlaces`; `search` remains only for a list's own filter. Consumer action: a sidebar whose top row carries a search icon passes no `search`.
54
53
 
55
-
56
54
  ## 0.86.326
57
55
 
58
56
  SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
@@ -362,14 +360,12 @@ Changed shipped source files (3):
362
360
  - **Swipe deck: a finish and an empty screen worthy of the deck (Arman, 2026-10-22).** The end is the deck's own screen: a mark that draws itself (a ring filled by the score on a quiz), the headline (the group's pick, the score, or All done), "12 of 12 answered", a bar of how the answers split with chips that filter the list (Right / Wrong on a graded deck, else by answer), and every answer to look over — a row takes that answer back and returns to its card (undoable), a miss shows the right answer. `endActions` puts the host's way on (Back to brand) under it. No items is its own screen (fanned cards, `empty: {title, line, action}`), never a zero tally. `renderEnd` still replaces the end entirely; a host using it for an EmptyState should drop it for `endActions`. Guard: `src/swipe-deck/end-screens.test.tsx`. Consumer action: none (optional: drop `renderEnd`, pass `endActions` and `empty`).
363
361
  - **A peek never leaves the screen vertically.** `PeekCard`'s height (fit, fixed and loading) is capped by `--matrx-peek-room`, which `PeekHoverCard` and `PeekPopover` set from the popper's available height; a card with no room above or below its trigger shrinks and scrolls inside instead of losing its title off the top. Consumer action: none.
364
362
 
365
-
366
363
  - **`ProductSidebarTop` (`./item`) — the top of every product sidebar** (Arman 2026-10-22): optional modes slot, Search, New, the chosen related places (`›`, a place with `children` opens a flyout), "More" (every other place, extra `moreGroups`, "Edit sidebar…"). Extracted from the conversation sidebar's top; `SidebarPlacesChooser` is the dialog's "Above More" section, `SidebarEditDialog` the dialog's chrome; `splitSidebarPlaces` / `matchSidebarPlaces` the pure halves. Which places sit above More is the host's layered knob. Consumer action: none (additive).
367
364
 
368
365
  ## 0.86.294
369
366
 
370
367
  - **A peek never leaves the screen vertically.** `PeekCard`'s height (fit, fixed and loading) is capped by `--matrx-peek-room`, which `PeekHoverCard` and `PeekPopover` set from the popper's available height; a card with no room above or below its trigger shrinks and scrolls inside instead of losing its title off the top. Consumer action: none.
371
368
 
372
-
373
369
  - **`ProductSidebarTop` (`./item`) — the top of every product sidebar** (Arman 2026-10-22): optional modes slot, Search, New, the chosen related places (`›`, a place with `children` opens a flyout), "More" (every other place, extra `moreGroups`, "Edit sidebar…"). Extracted from the conversation sidebar's top; `SidebarPlacesChooser` is the dialog's "Above More" section, `SidebarEditDialog` the dialog's chrome; `splitSidebarPlaces` / `matchSidebarPlaces` the pure halves. Which places sit above More is the host's layered knob. Consumer action: none (additive).
374
370
 
375
371
  ## 0.86.293
@@ -833,7 +829,6 @@ Changed shipped source files (1):
833
829
 
834
830
  - `SiteIcon` uses the package's pulse motion while loading, so a host without Tailwind animation utilities gets the same loading feedback. Formula consumer guards follow kit/Airtable's blank `YEAR` / `MONTH` / `DAY` result (`null`); nonempty invalid dates still refuse. Consumer action: none.
835
831
 
836
-
837
832
  - **`SiteIcon` — a website's own icon.** `<SiteIcon site={urlOrHost} iconUrl? fallback? size? className? />` (root export and `@ai-matrx/design-system/site-icon`) reserves its box, shimmers while loading, and tries the caller's icon URL, then Google's favicon service (a 16px answer is Google's default globe and falls through), then DuckDuckGo's (a 48px answer is its default). The generic glyph (a globe by default) shows only when no real icon exists. Also exports `siteHostname`. Use it for every site / URL / domain / source avatar instead of a hand-placed Globe or Link. Consumer action: none.
838
833
 
839
834
  - **`TextInputDialog` takes `allowEmpty`.** An "(optional)" note no longer leaves Confirm disabled until something is typed: with `allowEmpty` the button is enabled on an empty value and submits `""`. Default false, so every existing caller is unchanged.
@@ -1796,7 +1791,6 @@ Changed shipped source files (2):
1796
1791
 
1797
1792
  - `MatrxDataTable` (spreadsheet mode): a double-click edits the cell when it has an editor, and opens the row (`onRowOpen`) from a cell that cannot be edited or from the row's margin; a double-click inside an editor or control stays theirs. A single click still only selects.
1798
1793
 
1799
-
1800
1794
  ## 0.86.158
1801
1795
 
1802
1796
  SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
@@ -1870,7 +1864,6 @@ Changed shipped source files (4):
1870
1864
  - **`Field` / `SearchField` `filled`: the leading search of a home page** — a 48px capsule with no frame, the `--muted` fill, a 16px value and a 20px glyph; on focus it turns `--card` with a soft lift (Google Docs / Drive home search). One per page. Consumer action: none; opt in with `<SearchField filled />`.
1871
1865
  - **The pill-inset guard sees a border-drawn busy spinner.** An element with `role="status"` / `"progressbar"` inside a pill is ink by its box (its rings are absolute, so the walker skipped them and every pill whose icon became a spinner read "44px left vs 20px right"). Proof: `pill-inset-guard.test.tsx` (red before).
1872
1866
 
1873
-
1874
1867
  ## 0.86.149
1875
1868
 
1876
1869
  SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
@@ -2705,20 +2698,10 @@ Automatic changed-only republish (docs/metadata drift since the last tag — see
2705
2698
  No source changes intended and no consumer action required.
2706
2699
 
2707
2700
  ## 0.86.27
2708
- ### Unreleased
2709
2701
 
2710
- - New entry `@ai-matrx/design-system/carousel`: `Carousel`, THE slide strip. `mode="viewer"` swipes (scroll-snap),
2711
- steps with arrows and Left/Right/Home/End, shows dots, a counter and a thumbnail strip, in 1:1, 4:5, 9:16 or
2712
- 16:9 with no layout shift. `mode="editor"` adds add / duplicate / delete / reorder (drag a thumbnail or
2713
- move earlier/later) / edit / version history / export. The host draws every slide through `renderSlide`
2714
- (images, text-on-image social slides, presentation slides) and owns storage: edits leave through
2715
- `onSlidesChange`, a slide update also leaves through `onSlideChange` with the previous version
2716
- (`pushVersion` keeps a bounded newest-first list), export is a callback. Pure slide logic is exported
2717
- (`moveSlide`, `insertSlide`, `duplicateSlide`, `removeSlide`, `replaceSlide`, `pushVersion`).
2718
-
2719
- `Carousel` wraps itself in its own `TooltipProvider`, so its controls render in any host root.
2720
-
2721
- **Consumer action:** none; replace any hand-built multi-image grid or unused Embla wrapper with `<Carousel>`.
2702
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
2703
+ `git diff npm/design-system/v0.86.26..npm/design-system/v0.86.27 -- apps/shared/design-system`).
2704
+ No source changes intended and no consumer action required.
2722
2705
 
2723
2706
  ## 0.86.27
2724
2707
 
@@ -3088,27 +3071,13 @@ No source changes intended and no consumer action required.
3088
3071
 
3089
3072
  ## 0.80.0
3090
3073
 
3091
- Desktop standard, HIG review fixes, at the design-system level so every screen inherits them:
3092
-
3093
- - `DataTable` is a CSS grid with column kinds (`Column.kind`: flex, text, numeric, status, date,
3094
- action; inferred from `numeric`/`width` when absent). Only the flex column truncates; numbers,
3095
- ids, statuses, dates and actions fit their content and are never cut ("PID 1…" is gone); spare
3096
- width goes to the flex column up to its content, then is shared by every column; sideways scroll
3097
- only when the fitted columns exceed the width. One row density (`h-row-table`, 28 px) for every
3098
- row and header; headers never wrap. New exports `columnKind`, `ColumnKind`.
3099
- - `Page` notices sit in a foot bar in the layout flow (never floating over content); `Notices` is an
3100
- in-flow stack. Page rhythm on the HIG scale (20 px margins and section gaps; no reserved header or
3101
- section-title bands).
3102
- - Dialogs from the desktop entry are macOS sheets (`DialogContent`, `DialogHeader`, `DialogTitle`,
3103
- `DialogDescription`, `DialogFooter` from `./sheet`).
3104
- - Dark mode: green is the dark systemGreen (never amber/lime); a selected row uses the accent at
3105
- selected-row strength; status dots are desaturated. Light selection is one step deeper than the
3106
- tint.
3107
- - `StateView kind="empty"` draws a standard empty glyph and a quiet title; `Sparkline` axis labels
3108
- sit outside the plot (never over the line); field placeholders are always the system font.
3109
-
3110
- **Consumer action:** remove any `className` that positioned a `Notices` stack absolutely
3111
- (`top-*`, `bottom-*`); place it in its container's flow instead.
3074
+ No layout shift, dialogs included (Arman, 2026-10-07).
3075
+
3076
+ - **`NoticeSlot`** (new): the message slot of a dialog or sheet, a fixed-height box that is always there, so an error appearing in it or leaving moves nothing around it. A longer banner is clipped to the slot, never grown.
3077
+ - **Lint `desktop/no-shifting-notice`**: a `Dialog` / `DialogContent` / `AlertDialogContent` is no longer a home for a Banner (it grew the dialog); `NoticeSlot` is.
3078
+ - **`Page` / `Notices`**: notices that render nothing leave no box and no scroll room (the stack is hidden while empty); the scroll room at the page's foot is exactly the stack's measured height (less the foot padding the page already has), so a tall stack never covers the last rows. `Notices` takes `onHeight`.
3079
+
3080
+ **Consumer action:** a Banner / ErrorBanner directly inside a dialog now fails the lint; put it in `<NoticeSlot>`.
3112
3081
 
3113
3082
  ## 0.79.5
3114
3083
 
@@ -3274,7 +3243,6 @@ No source changes intended and no consumer action required.
3274
3243
 
3275
3244
  - `DataRowInspector` (the detail panel and row window's View tab) labels each field by its column's own name when the table has one, else through kit's `displayLabel` (`spineStatus` -> `Spine Status`, `createdAt` -> `Created At`), never the raw key. New optional `labelForField(key)`; `MatrxDataTable` passes its column headers.
3276
3245
 
3277
-
3278
3246
  ## 0.72.3
3279
3247
 
3280
3248
  Automatic changed-only republish (docs/metadata drift since the last tag — see
@@ -4473,7 +4441,6 @@ No source changes intended and no consumer action required.
4473
4441
  Frontend, Dashboard, Records Grid and desktop callers are migrated without changing writes.
4474
4442
  Guards: `TableIconActions.test.tsx`, edit-actions, layout-look, density and row-cost tests.
4475
4443
 
4476
-
4477
4444
  - **Custom fields on every list (lane 7 STANDARD-TABLES W5).** `MatrxDataTable` takes `rowToken`
4478
4445
  (the registry token of its rows); the host port `useCustomFieldColumns(token, organizationIds)` —
4479
4446
  a hook bound once — answers that token's custom-field columns for the rows' own organizations
@@ -5035,16 +5002,14 @@ Automatic changed-only republish (docs/metadata drift since the last tag — see
5035
5002
  No source changes intended and no consumer action required.
5036
5003
 
5037
5004
  ## Unreleased
5005
+ ### lane RENDER-3 (2026-09-27): the table's toolbar, column headers, footer and pager draw only when what they show changed
5038
5006
 
5039
- - **New light entry `./tap-shortcut` (2026-10-23, FB5).** `formatTapShortcut`, `parseShortcut` and `TapShortcut` with no React, for plain helpers; `./tap-target` re-exports the same three. Consumer action: none.
5040
- - **Loaders and SimpleTooltip are owned here (one-canonical, packages-copies lane, 2026-10-21).** New root exports `LoadingSpinner`, `MatrxMiniLoader`, `SuspenseLoader`, `ShimmerText` (+ `useShimmerSweep`, `SHIMMER_STYLE`), `SimpleTooltip`, `AdvancedTooltip`; internal `WorkflowIcon` glyph (no icon-library dependency, C19). Each was a copy in `@ai-matrx/rich-content` (`utils/lifted/`) and matrx-frontend. Consumer action: import the named exports from `@ai-matrx/design-system` and delete the host copy (`SuspenseLoader`, `MatrxMiniLoader`, `LoadingSpinner` were default exports in the host).
5041
-
5042
- - **No page-wide `:has()` (review 6b, 2026-10-21).** `SidebarMenuItem` pads its button through a child-only `:has()` (was `group-has-*`, a universal subject); the key-window highlight in `desktop.css` and `MessageList` reads `:not([data-window-active] *)` instead of `:root:not(:has([data-window-active]))`. Each made one DOM insertion restyle the whole phone notes page (114 ms against 8 ms). A list outside every window now highlights on focus even while a floating window exists elsewhere.
5043
- - **Every tooltip is a tooltip again — and every native `title` is one too** (Arman, 2026-09-28: "we've lost all of our tooltips… all we have are these shitty browser ones"). Three defects, one surface:
5044
- 1. *No tooltip animated since 0.10.0.* `.matrx-motion-popper`'s open rules keyed on `data-state="open"`, which Radix Tooltip never emits (`delayed-open` / `instant-open`), so every tooltip popped in still. The open rules now match all three.
5045
- 2. *The surface was the browser's.* White, thin grey border, 12px dark text — indistinguishable from macOS's own `title` box. `TooltipContent` now wears `.matrx-tooltip`: a dark, high-contrast chip in both themes (Linear / GitHub / Vercel), re-scoping `--popover`, `--foreground`, `--muted-foreground` and `--border` inside it so rich content stays legible. New tokens `--matrx-tooltip`, `--matrx-tooltip-foreground`, `--matrx-tooltip-muted-foreground`, `--matrx-tooltip-border`, `--matrx-tooltip-shadow` re-brand every tooltip at once.
5046
- 3. *Half the controls on a page used `title=`.* `TooltipProvider` now installs THE TITLE TAKEOVER (`title-tooltips.ts`, exported as `acquireTitleTooltips`): while any provider is mounted, hovering (mouse/pen) or keyboard-focusing an element with a `title` lifts the attribute for as long as it is held and shows the same chip instead; the `title` is restored on leave. A `TooltipTrigger` (now stamped `data-matrx-tooltip-trigger`) keeps its own tooltip and never gets a second. `data-title-side` on an element or ancestor picks the side; `data-native-title` opts a subtree out; `<TooltipProvider titleTooltips={false}>` opts a provider out. It never draws a tooltip that only repeats text already readable in full inside the element (an expanded sidebar row), and still draws it when that text is hidden or truncated.
5047
- Proof: `title-tooltips.test.tsx` (every case red on 0.49.19). Consumer action: none required — a host that already mounts `TooltipProvider` gets all three. A host test asserting `bg-popover`'s computed color on a tooltip reads the chip's token now.
5007
+ - **`MatrxDataTable` memoises its own chrome** (`MatrxTableChrome`): the toolbar row, the `<thead>`, the `<tfoot>` and the pager are each drawn again only when a value they read changed — every prop and table value each part reads, directly and through the handlers it hands out, compared by value where the table re-derives them (columns key by key, widths, the frozen band, the column window, the header filters' options). Measured before on /data-v2 (native grid, published 0.47.2): one cell edit rendered 7,815 components, ~7.5k of them this chrome, on each of the table's ~10 renders per edit. jsdom guard (records-ui `one-cell-edit-redraws-one-row.test.tsx`, merged grid): toolbar 2,012 → 0, header 3,080 → 0, footer + pager 1,180 → 0.
5008
+ - **Handlers the kept chrome hands out act on the table as it is now** (`chromeLatest`): the toolbar's copy of "the view" (human, JSON, agent text, sheet rows, "Filter & sort before copying") copies the rows after the last edit; select-all, "Show more" and applying a saved view read the latest rows.
5009
+ - **dnd-kit's options are module values** (pointer sensor, accessibility, measuring). Written inline they were new objects on every render, so the drag context moved every render and redrew every column header (each is a draggable and a drop zone).
5010
+ - **Stable identities for what the chrome holds:** a controlled query with no layered filters reads one empty list; `useTableNotice().notify` is one object per host; `useCopySubsetVariant()` returns one function.
5011
+ - **A toolbar copy config that BUILDS its menu from the rows while drawing** (`references`, `aiVariants`, `aiCustom` or `export` declared with parameters) still redraws the toolbar with the rows; one declared with no parameter cannot read them and never does.
5012
+ - **Consumer action:** a host that hands `toolbar`, `columns`, `query`, `footerRows`, `columnState`, `grouping` or `copy` must pass a NEW object when what it shows changes (inline objects already are — the chrome then redraws on every render, as before). A host that wants the saving holds them still; `footerRows` is the footer's signal — a host whose footer cells read state from elsewhere passes a new `footerRows` array when that state changes.
5048
5013
 
5049
5014
  ## 0.49.19
5050
5015
  ### Unreleased
@@ -5202,7 +5167,6 @@ No source changes intended and no consumer action required.
5202
5167
 
5203
5168
  - The adaptive `BottomSheet` has no 60dvh minimum (it keeps the 90dvh maximum): a two-action sheet was mostly empty and hosts overrode it with `min-h-0`. Proof: `bottom-sheet.test.tsx`, red on the old class.
5204
5169
 
5205
-
5206
5170
  ### (2026-09-27 — an empty table)
5207
5171
 
5208
5172
  - **An empty table (nothing searched or filtered) draws no pager** — "0-0 of 0" and a disabled pager said nothing the empty state did not. A search or filter that matched nothing keeps its footer (it still says what was searched).
@@ -5353,7 +5317,6 @@ No source changes intended and no consumer action required.
5353
5317
  - Checkbox rows (sections, columns, "Only selected rows") sit beside their labels at checkbox size (`.matrx-alchemy-check`); the text-input rule no longer styles checkboxes into 36px boxes stacked above their labels.
5354
5318
  - Proof: `src/content-transfer/sections-workspace.test.tsx` (red before, green after). Needs `@ai-matrx/kit` with the rebundled core.
5355
5319
 
5356
-
5357
5320
  ## 0.46.4
5358
5321
 
5359
5322
  Automatic changed-only republish (docs/metadata drift since the last tag — see
@@ -6183,7 +6146,6 @@ None. Every new prop is optional and every default is today's behavior. `MatrxCo
6183
6146
  ignored when the column already supplies `cell`; a consumer's own renderer can ask for the same
6184
6147
  text with the exported `formatColumnValue(col, value)` instead of writing a second money formatter.
6185
6148
 
6186
-
6187
6149
  ## 0.21.14 — 2026-09-19
6188
6150
 
6189
6151
  Alchemy renders the kit's new `queued` transfer outcome (`@ai-matrx/kit` 0.16.0): a write that was
@@ -6504,7 +6466,6 @@ Alchemy adopts approved Portal sample B: 22px artwork with a tighter optical cro
6504
6466
 
6505
6467
  Update `@ai-matrx/design-system`; no host styling or prop changes.
6506
6468
 
6507
-
6508
6469
  ## 0.19.5 — 2026-09-13
6509
6470
 
6510
6471
  Data-table append receipts remain visible after terminal loads and across remote response or error states. Footer containment now keeps the 44px action controls and 20px action glyphs visible without mobile clipping.
@@ -6925,7 +6886,6 @@ sources into `controlled-append`; the table cannot infer an endpoint or cursor.
6925
6886
  Use `@ai-matrx/data/react` `usePaginatedData` or an equivalent receipt, key every
6926
6887
  source-affecting input, and pass the application-resolved scrolling preference.
6927
6888
 
6928
-
6929
6889
  ## 0.14.3 — 2026-09-11
6930
6890
 
6931
6891
  `ConfirmDialog` now renders its accessible description through Radix's