@ai-matrx/design-system 0.21.4 → 0.21.5

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 (37) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/data-table/copy-helpers.d.cts +1 -1
  3. package/dist/data-table/copy-helpers.d.ts +1 -1
  4. package/dist/data-table/filter-engine.d.cts +1 -1
  5. package/dist/data-table/filter-engine.d.ts +1 -1
  6. package/dist/data-table/host.d.cts +1 -1
  7. package/dist/data-table/host.d.ts +1 -1
  8. package/dist/data-table/index.cjs +75 -22
  9. package/dist/data-table/index.cjs.map +1 -1
  10. package/dist/data-table/index.d.cts +10 -3
  11. package/dist/data-table/index.d.ts +10 -3
  12. package/dist/data-table/index.js +75 -22
  13. package/dist/data-table/index.js.map +1 -1
  14. package/dist/data-table/infer-filter.cjs +16 -0
  15. package/dist/data-table/infer-filter.cjs.map +1 -1
  16. package/dist/data-table/infer-filter.d.cts +1 -1
  17. package/dist/data-table/infer-filter.d.ts +1 -1
  18. package/dist/data-table/infer-filter.js +16 -0
  19. package/dist/data-table/infer-filter.js.map +1 -1
  20. package/dist/data-table/layered-filters.d.cts +1 -1
  21. package/dist/data-table/layered-filters.d.ts +1 -1
  22. package/dist/data-table/query-control.cjs +19 -0
  23. package/dist/data-table/query-control.cjs.map +1 -1
  24. package/dist/data-table/query-control.d.cts +1 -1
  25. package/dist/data-table/query-control.d.ts +1 -1
  26. package/dist/data-table/query-control.js +19 -0
  27. package/dist/data-table/query-control.js.map +1 -1
  28. package/dist/data-table/types.cjs.map +1 -1
  29. package/dist/data-table/types.d.cts +1 -1
  30. package/dist/data-table/types.d.ts +1 -1
  31. package/dist/data-table/url-state.d.cts +1 -1
  32. package/dist/data-table/url-state.d.ts +1 -1
  33. package/dist/data-table/xlsx.d.cts +1 -1
  34. package/dist/data-table/xlsx.d.ts +1 -1
  35. package/dist/{types-CbGNfo7r.d.ts → types-Dpl8OW_m.d.ts} +17 -1
  36. package/dist/{types-DRusLYrU.d.cts → types-DsmrqJHN.d.cts} +17 -1
  37. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.21.5
4
+
5
+ Shared compact favorite and pin columns: 40px default width, semantic sort and boolean filter menus, exact accessor inference and explicit opt-out. Existing custom cells and permission-aware toggles remain intact.
6
+
3
7
  ## 0.21.3
4
8
 
5
9
  Automatic changed-only republish (docs/metadata drift since the last tag — see
@@ -1,5 +1,5 @@
1
1
  import { AgentPayloadInput } from './copy-types.cjs';
2
- import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-DRusLYrU.cjs';
2
+ import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-DsmrqJHN.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-CbGNfo7r.js';
2
+ import { g as MatrxDataTableCopyConfig, M as MatrxColumnDef } from '../types-Dpl8OW_m.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-DRusLYrU.cjs';
1
+ import { M as MatrxColumnDef, C as ColumnFiltersState, S as SortState, L as LayeredFilterRule, T as TableSearchMatchMode, a as ColumnFilterValue } from '../types-DsmrqJHN.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-CbGNfo7r.js';
1
+ import { M as MatrxColumnDef, C as ColumnFiltersState, S as SortState, L as LayeredFilterRule, T as TableSearchMatchMode, a as ColumnFilterValue } from '../types-Dpl8OW_m.js';
2
2
  import '../content-transfer.js';
3
3
  import 'react';
4
4
  import '@ai-matrx/kit/content-transfer';
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { ComponentType, ReactNode, MouseEventHandler } from 'react';
3
- import { b as TableSavedViewsProps, c as MatrxDataTableRecordControls, d as MatrxDataTableDensity } from '../types-DRusLYrU.cjs';
3
+ import { b as TableSavedViewsProps, c as MatrxDataTableRecordControls, d as MatrxDataTableDensity } from '../types-DsmrqJHN.cjs';
4
4
  import { CopyControlProps } from './copy-types.cjs';
5
5
  export { AgentPayloadInput, AiCustomSource, AiVariant, CopyExportConfig } from './copy-types.cjs';
6
6
  import '../content-transfer.cjs';
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { ComponentType, ReactNode, MouseEventHandler } from 'react';
3
- import { b as TableSavedViewsProps, c as MatrxDataTableRecordControls, d as MatrxDataTableDensity } from '../types-CbGNfo7r.js';
3
+ import { b as TableSavedViewsProps, c as MatrxDataTableRecordControls, d as MatrxDataTableDensity } from '../types-Dpl8OW_m.js';
4
4
  import { CopyControlProps } from './copy-types.js';
5
5
  export { AgentPayloadInput, AiCustomSource, AiVariant, CopyExportConfig } from './copy-types.js';
6
6
  import '../content-transfer.js';
@@ -48,6 +48,7 @@ __export(data_table_exports, {
48
48
  downloadTableAsXlsx: () => downloadTableAsXlsx,
49
49
  filterKindLabel: () => filterKindLabel,
50
50
  parseTableViewSnapshot: () => parseTableViewSnapshot,
51
+ resolveColumnMarker: () => resolveColumnMarker,
51
52
  resolveFilterKind: () => resolveFilterKind,
52
53
  rowsToCsvFromColumns: () => rowsToCsvFromColumns,
53
54
  rowsToMarkdownTable: () => rowsToMarkdownTable,
@@ -5774,6 +5775,34 @@ var CommandShortcut = ({
5774
5775
  };
5775
5776
  CommandShortcut.displayName = "CommandShortcut";
5776
5777
 
5778
+ // src/data-table/column-marker.ts
5779
+ var MARKER_ACCESSORS = {
5780
+ favorite: "favorite",
5781
+ is_favorite: "favorite",
5782
+ favourite: "favorite",
5783
+ is_favourite: "favorite",
5784
+ pinned: "pin",
5785
+ is_pinned: "pin"
5786
+ };
5787
+ function resolveColumnMarker(column) {
5788
+ if (column.marker === false) return void 0;
5789
+ if (column.marker) return column.marker;
5790
+ return column.accessorKey ? MARKER_ACCESSORS[column.accessorKey] : void 0;
5791
+ }
5792
+ function markerCopy(marker) {
5793
+ return marker === "favorite" ? {
5794
+ label: "Favorites",
5795
+ lowerLabel: "favorites",
5796
+ onlyLabel: "Favorites only",
5797
+ notLabel: "Not favorites"
5798
+ } : {
5799
+ label: "Pins",
5800
+ lowerLabel: "pins",
5801
+ onlyLabel: "Pins only",
5802
+ notLabel: "Not pinned"
5803
+ };
5804
+ }
5805
+
5777
5806
  // src/data-table/ColumnHeaderCell.tsx
5778
5807
  var import_jsx_runtime31 = require("react/jsx-runtime");
5779
5808
  var HeaderButton = (0, import_react13.forwardRef)(({ dragDescription, "aria-describedby": tooltipDescription, ...props }, ref) => {
@@ -5806,6 +5835,7 @@ function ColumnHeaderCell({
5806
5835
  align = "left",
5807
5836
  className,
5808
5837
  compact = false,
5838
+ marker,
5809
5839
  filterApplyLabel,
5810
5840
  filterShowCancel = false,
5811
5841
  filterFooterHint,
@@ -5857,7 +5887,9 @@ function ColumnHeaderCell({
5857
5887
  if (deferredFilter) setDraftFilter(next);
5858
5888
  else onFilterChange(next);
5859
5889
  };
5860
- const menuLabel = labelText ? `Sort or filter ${labelText}` : "Sort or filter column";
5890
+ const markerLabels = marker ? markerCopy(marker) : void 0;
5891
+ const accessibleLabel = markerLabels?.label ?? labelText;
5892
+ const menuLabel = accessibleLabel ? `Sort or filter ${accessibleLabel}` : "Sort or filter column";
5861
5893
  const menuContent = /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
5862
5894
  PopoverContent,
5863
5895
  {
@@ -5886,7 +5918,7 @@ function ColumnHeaderCell({
5886
5918
  onClick: onSortAsc,
5887
5919
  children: [
5888
5920
  /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ArrowUp, { className: "h-3.5 w-3.5" }),
5889
- "Sort ascending"
5921
+ markerLabels ? `${markerLabels.label} last` : "Sort ascending"
5890
5922
  ]
5891
5923
  }
5892
5924
  ),
@@ -5899,7 +5931,7 @@ function ColumnHeaderCell({
5899
5931
  onClick: onSortDesc,
5900
5932
  children: [
5901
5933
  /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ArrowDown, { className: "h-3.5 w-3.5" }),
5902
- "Sort descending"
5934
+ markerLabels ? `${markerLabels.label} first` : "Sort descending"
5903
5935
  ]
5904
5936
  }
5905
5937
  ),
@@ -5912,7 +5944,7 @@ function ColumnHeaderCell({
5912
5944
  onClick: onClearSort,
5913
5945
  children: [
5914
5946
  /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ListX, { className: "h-3.5 w-3.5" }),
5915
- "Clear sort"
5947
+ markerLabels ? `Clear ${markerLabels.lowerLabel} sort` : "Clear sort"
5916
5948
  ]
5917
5949
  }
5918
5950
  ) : null
@@ -5931,6 +5963,13 @@ function ColumnHeaderCell({
5931
5963
  },
5932
5964
  selectOptions,
5933
5965
  selectSingle,
5966
+ ...markerLabels ? {
5967
+ booleanLabels: {
5968
+ all: "All",
5969
+ true: markerLabels.onlyLabel,
5970
+ false: markerLabels.notLabel
5971
+ }
5972
+ } : {},
5934
5973
  allowNullModes
5935
5974
  }
5936
5975
  ) : null,
@@ -6146,7 +6185,8 @@ function FilterBody({
6146
6185
  onChange,
6147
6186
  selectOptions,
6148
6187
  selectSingle = false,
6149
- allowNullModes = false
6188
+ allowNullModes = false,
6189
+ booleanLabels
6150
6190
  }) {
6151
6191
  if (kind === "text") {
6152
6192
  const text = value?.kind === "text" ? value.value : "";
@@ -6233,9 +6273,9 @@ function FilterBody({
6233
6273
  children: [
6234
6274
  /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectValue, {}) }),
6235
6275
  /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(SelectContent, { children: [
6236
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectItem, { value: "__all__", children: "All" }),
6237
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectItem, { value: "true", children: "Yes" }),
6238
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectItem, { value: "false", children: "No" })
6276
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectItem, { value: "__all__", children: booleanLabels?.all ?? "All" }),
6277
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectItem, { value: "true", children: booleanLabels?.true ?? "Yes" }),
6278
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SelectItem, { value: "false", children: booleanLabels?.false ?? "No" })
6239
6279
  ] })
6240
6280
  ]
6241
6281
  }
@@ -8335,6 +8375,7 @@ var SELECT_CARDINALITY_CAP = 24;
8335
8375
  function resolveFilterKind(col, sampleRows) {
8336
8376
  if (col.filter === false) return null;
8337
8377
  if (col.filter && col.filter !== "auto") return col.filter;
8378
+ if (resolveColumnMarker(col)) return "boolean";
8338
8379
  const values = sampleRows.slice(0, 200).map((row) => getCellValue(row, col)).filter((v) => v != null);
8339
8380
  if (values.length === 0) return "text";
8340
8381
  if (values.every((v) => typeof v === "boolean")) return "boolean";
@@ -8400,6 +8441,9 @@ function resolveQueryFilterMeta(column, rows, controlled) {
8400
8441
  };
8401
8442
  }
8402
8443
  if (column.filter === false) return { kind: null, options: [] };
8444
+ if (resolveColumnMarker(column) && (column.filter === void 0 || column.filter === "auto")) {
8445
+ return { kind: "boolean", options: [] };
8446
+ }
8403
8447
  const declared = column.filter;
8404
8448
  const kind = declared && declared !== "auto" ? declared : column.filterOptions?.length ? "select" : "text";
8405
8449
  return {
@@ -10641,6 +10685,10 @@ function MatrxDataTableCore({
10641
10685
  const defaultSortDirection = col.defaultSortDirection ?? "asc";
10642
10686
  const isColumnDragShadow = columnDragPreview?.draggedId === id && columnDragPreview.targetId !== null;
10643
10687
  const columnResizable = resizableColumns && col.resizable !== false;
10688
+ const marker = resolveColumnMarker(col);
10689
+ const compact = col.compact || marker !== void 0;
10690
+ const width = marker && col.width === void 0 ? 40 : col.width;
10691
+ const minWidth = marker && col.minWidth === void 0 ? 40 : col.minWidth;
10644
10692
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
10645
10693
  "th",
10646
10694
  {
@@ -10652,7 +10700,7 @@ function MatrxDataTableCore({
10652
10700
  // ICON COLUMN (MatrxColumnDef.compact): a 40px star
10653
10701
  // column cannot honor `width: 40` while paying 16px of
10654
10702
  // padding for a 14px glyph.
10655
- col.compact ? "px-1" : "px-2",
10703
+ compact ? "px-1" : "px-2",
10656
10704
  // An intentional mobile column set (see
10657
10705
  // MatrxColumnDef.mobileHidden). CSS, not a JS
10658
10706
  // breakpoint — no hydration mismatch, and the column
@@ -10663,13 +10711,13 @@ function MatrxDataTableCore({
10663
10711
  // it, a crowded table crushes a declared 190px column to a
10664
10712
  // few characters wide instead of using the canonical
10665
10713
  // horizontal-scroll surface.
10666
- (col.width !== void 0 || columnResizable) && "sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)]",
10714
+ (width !== void 0 || columnResizable) && "sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)]",
10667
10715
  col.headerClassName,
10668
10716
  isColumnDragShadow && "bg-primary/10 shadow-[inset_2px_0_0_var(--primary),inset_-2px_0_0_var(--primary)]",
10669
10717
  col.align === "center" && "text-center",
10670
10718
  col.align === "right" && "text-right"
10671
10719
  ),
10672
- style: columnWidthVar(col.width, effectiveColumnWidths[id], id, columnResizable),
10720
+ style: columnWidthVar(width, effectiveColumnWidths[id], id, columnResizable),
10673
10721
  children: [
10674
10722
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ColumnHeaderDropZone, { id, enabled: reorderableColumns, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
10675
10723
  ColumnHeaderCell,
@@ -10704,7 +10752,8 @@ function MatrxDataTableCore({
10704
10752
  allowNegation: filterUi?.allowNegation,
10705
10753
  allowNullModes: filterUi?.allowNullModes,
10706
10754
  align: col.align,
10707
- compact: col.compact,
10755
+ compact,
10756
+ marker,
10708
10757
  reorderColumn: reorderableColumns ? { id, label: headerLabel } : void 0
10709
10758
  }
10710
10759
  ) }),
@@ -10714,12 +10763,12 @@ function MatrxDataTableCore({
10714
10763
  columnId: id,
10715
10764
  label: headerLabel,
10716
10765
  tableRef,
10717
- minWidth: col.minWidth,
10766
+ minWidth,
10718
10767
  maxWidth: col.maxWidth,
10719
10768
  onResizeStart: captureResizeGestureSnapshot,
10720
10769
  onResizeCancel: clearResizeGestureSnapshot,
10721
- onResizeCommit: (columnId2, width) => commitColumnWidths(
10722
- { ...effectiveColumnWidths, [columnId2]: width },
10770
+ onResizeCommit: (columnId2, width2) => commitColumnWidths(
10771
+ { ...effectiveColumnWidths, [columnId2]: width2 },
10723
10772
  true
10724
10773
  )
10725
10774
  }
@@ -10749,7 +10798,7 @@ function MatrxDataTableCore({
10749
10798
  {
10750
10799
  className: cn(
10751
10800
  "py-2",
10752
- col.compact ? "px-1" : "px-2",
10801
+ col.compact || resolveColumnMarker(col) !== void 0 ? "px-1" : "px-2",
10753
10802
  col.mobileHidden && "max-sm:hidden"
10754
10803
  ),
10755
10804
  children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Skeleton, { className: "h-5 w-full" })
@@ -10835,19 +10884,19 @@ function MatrxDataTableCore({
10835
10884
  "data-matrx-column-drag-shadow": isColumnDragShadow ? "true" : void 0,
10836
10885
  className: cn(
10837
10886
  "py-1.5 align-middle lg:py-0.5",
10838
- col.compact ? "px-1" : "px-2",
10887
+ col.compact || resolveColumnMarker(col) !== void 0 ? "px-1" : "px-2",
10839
10888
  // nowrap (NOT truncate — truncate clips the cell and
10840
10889
  // defeats w-max, killing the horizontal scroll).
10841
10890
  "max-sm:whitespace-nowrap",
10842
10891
  col.mobileHidden && "max-sm:hidden",
10843
- (col.width !== void 0 || resizableColumns && col.resizable !== false) && "sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)] sm:max-w-[var(--matrx-col-w)]",
10892
+ ((resolveColumnMarker(col) && col.width === void 0 ? 40 : col.width) !== void 0 || resizableColumns && col.resizable !== false) && "sm:w-[var(--matrx-col-w)] sm:min-w-[var(--matrx-col-w)] sm:max-w-[var(--matrx-col-w)]",
10844
10893
  col.className,
10845
10894
  isColumnDragShadow && "bg-primary/10 shadow-[inset_2px_0_0_var(--primary),inset_-2px_0_0_var(--primary)]",
10846
10895
  col.align === "center" && "text-center",
10847
10896
  col.align === "right" && "text-right"
10848
10897
  ),
10849
10898
  style: columnWidthVar(
10850
- col.width,
10899
+ resolveColumnMarker(col) && col.width === void 0 ? 40 : col.width,
10851
10900
  effectiveColumnWidths[columnId(col)],
10852
10901
  columnId(col),
10853
10902
  resizableColumns && col.resizable !== false
@@ -10979,13 +11028,13 @@ function MatrxDataTableCore({
10979
11028
  {
10980
11029
  className: cn(
10981
11030
  "px-2 py-2 align-middle",
10982
- column.compact && "px-1",
11031
+ (column.compact || resolveColumnMarker(column) !== void 0) && "px-1",
10983
11032
  column.className,
10984
11033
  column.align === "center" && "text-center",
10985
11034
  column.align === "right" && "text-right"
10986
11035
  ),
10987
11036
  style: columnWidthVar(
10988
- column.width,
11037
+ resolveColumnMarker(column) && column.width === void 0 ? 40 : column.width,
10989
11038
  effectiveColumnWidths[columnId(column)],
10990
11039
  columnId(column),
10991
11040
  resizableColumns && column.resizable !== false
@@ -11577,7 +11626,11 @@ function normalizeColumnWidthsForColumns(widths, columns) {
11577
11626
  return Object.fromEntries(
11578
11627
  Object.entries(normalized).map(([id, width]) => {
11579
11628
  const column = byId.get(id);
11580
- const bounds = resolveColumnResizeBounds(column?.minWidth, column?.maxWidth);
11629
+ const marker = column ? resolveColumnMarker(column) : void 0;
11630
+ const bounds = resolveColumnResizeBounds(
11631
+ marker && column?.minWidth === void 0 ? 40 : column?.minWidth,
11632
+ column?.maxWidth
11633
+ );
11581
11634
  return [id, clampColumnWidth(width, bounds)];
11582
11635
  })
11583
11636
  );