@ai-matrx/design-system 0.43.0 → 0.44.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 (47) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/content-transfer.cjs +39 -0
  3. package/dist/content-transfer.cjs.map +1 -1
  4. package/dist/content-transfer.js +39 -0
  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 +39 -0
  9. package/dist/data-table/data-row-inspector.cjs.map +1 -1
  10. package/dist/data-table/data-row-inspector.js +41 -2
  11. package/dist/data-table/data-row-inspector.js.map +1 -1
  12. package/dist/data-table/data-row-window.cjs +39 -0
  13. package/dist/data-table/data-row-window.cjs.map +1 -1
  14. package/dist/data-table/data-row-window.js +43 -4
  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 +59 -0
  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 +96 -37
  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 +47 -2
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +28 -1
  42. package/dist/index.d.ts +28 -1
  43. package/dist/index.js +52 -7
  44. package/dist/index.js.map +1 -1
  45. package/dist/{types-CUR8Hbt5.d.ts → types-Bzzzed5d.d.ts} +24 -1
  46. package/dist/{types-CqU57qk8.d.cts → types-cvgKRetM.d.cts} +24 -1
  47. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.44.1 (2026-09-26 — an indeterminate Progress actually sweeps)
4
+
5
+ * **Fix:** an indeterminate `Progress` (`value={null}`) carried `w-full` beside
6
+ `matrx-progress-indeterminate`. The sweep's 40% width lives in the package layer, which a host's
7
+ utilities layer outranks, so every indeterminate bar painted a solid full-width fill and never
8
+ moved (found live on matrx-frontend's video job card). The indicator now carries `w-full` only
9
+ when it is determinate.
10
+ * Test: `controls.test.tsx` "never pairs the indeterminate sweep with a full-width utility"
11
+ (RED without the change → GREEN).
12
+
13
+ **Consumer action:** none.
14
+
15
+ ## 0.44.0 (2026-09-26 — the layer the person used last is on top)
16
+
17
+ * **`announceLayerFront(element)` / `LAYER_FRONT_EVENT` (`matrx:layer-front`)** — one signal
18
+ every floating layer shares. A windowed `Dialog` (the default since 0.38.0) announces itself
19
+ when it opens and whenever the person presses or focuses inside it, and STEPS BEHIND
20
+ (`z-[999]`: above the page, below a host window manager's 1000+) when another layer announces
21
+ after it; it returns the moment the person reaches for it. An explicit `modal={false}` keeps its
22
+ fixed `z-[900]`; a blocking dialog is untouched.
23
+ * **Why:** a window opened after a windowed dialog — the agent window the Agents menu opens while
24
+ Table settings is open — sat underneath the dialog's z-10000, so its message box could not be
25
+ clicked or typed into (found live 2026-09-26, register `ai-reachable-everywhere` ARE-010).
26
+ * `onPointerDownCapture` / `onFocusCapture` passed to `DialogContent` still run.
27
+ * Tests: `dialog.test.tsx` "steps behind a layer…" and "announces itself…" (RED 2/2 without the
28
+ change → GREEN 15/15).
29
+
30
+ **Consumer action:** a host window manager calls `announceLayerFront(windowElement)` when a
31
+ window opens and when it is focused. matrx-frontend: `WindowPanel`.
32
+
3
33
  ## 0.43.0 (2026-09-26 — type-to-edit in spreadsheet mode)
4
34
 
5
35
  * **Type to edit, for every table in spreadsheet mode.** The grid's keyboard focus now lives in a
@@ -263,6 +263,15 @@ function useIsMobile() {
263
263
  return isMobile;
264
264
  }
265
265
 
266
+ // src/layer-front.ts
267
+ var LAYER_FRONT_EVENT = "matrx:layer-front";
268
+ function announceLayerFront(element) {
269
+ if (typeof document === "undefined") return;
270
+ document.dispatchEvent(
271
+ new CustomEvent(LAYER_FRONT_EVENT, { detail: { element } })
272
+ );
273
+ }
274
+
266
275
  // src/dialog.tsx
267
276
  var import_jsx_runtime5 = require("react/jsx-runtime");
268
277
  var DialogWindowedByDefaultContext = React5.createContext(false);
@@ -333,6 +342,8 @@ var DialogContent = React5.forwardRef(
333
342
  dismissOnOutsideClick = false,
334
343
  onInteractOutside,
335
344
  onEscapeKeyDown,
345
+ onPointerDownCapture,
346
+ onFocusCapture,
336
347
  style,
337
348
  ...props
338
349
  }, ref) => {
@@ -345,6 +356,24 @@ var DialogContent = React5.forwardRef(
345
356
  const [containerEl, setContainerEl] = React5.useState(
346
357
  null
347
358
  );
359
+ const stacks = windowed && windowedByDefault;
360
+ const [behind, setBehind] = React5.useState(false);
361
+ React5.useEffect(() => {
362
+ if (!stacks || !containerEl) return;
363
+ const onFront = (event) => {
364
+ const element = event.detail?.element ?? null;
365
+ if (element && (element === containerEl || containerEl.contains(element))) return;
366
+ setBehind(true);
367
+ };
368
+ document.addEventListener(LAYER_FRONT_EVENT, onFront);
369
+ announceLayerFront(containerEl);
370
+ return () => document.removeEventListener(LAYER_FRONT_EVENT, onFront);
371
+ }, [stacks, containerEl]);
372
+ const bringToFront = () => {
373
+ if (!stacks || !containerEl) return;
374
+ setBehind(false);
375
+ announceLayerFront(containerEl);
376
+ };
348
377
  const [offset, setOffset] = React5.useState({ x: 0, y: 0 });
349
378
  const dragRef = React5.useRef(null);
350
379
  const handle = React5.useMemo(() => {
@@ -403,10 +432,20 @@ var DialogContent = React5.forwardRef(
403
432
  // z=1000); staying below that boundary makes a newly focused window
404
433
  // usable without coupling the two systems.
405
434
  !isModal && !windowedByDefault && "z-[900]",
435
+ // Another layer came to the front after this window (layer-front.ts).
436
+ stacks && behind && "z-[999]",
406
437
  // Without an overlay the card needs its own separation from the page.
407
438
  windowed && "shadow-2xl ring-1 ring-border/60"
408
439
  ),
409
440
  style: windowed && (offset.x !== 0 || offset.y !== 0) ? { ...style, translate: `${offset.x}px ${offset.y}px` } : style,
441
+ onPointerDownCapture: (event) => {
442
+ onPointerDownCapture?.(event);
443
+ if (behind) bringToFront();
444
+ },
445
+ onFocusCapture: (event) => {
446
+ onFocusCapture?.(event);
447
+ if (behind) bringToFront();
448
+ },
410
449
  onInteractOutside: (event) => {
411
450
  onInteractOutside?.(event);
412
451
  if (windowed && !dismissOnOutsideClick) event.preventDefault();