@ai-matrx/design-system 0.55.0 → 0.56.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 (36) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +20 -0
  3. package/dist/data-table/copy-helpers.d.cts +1 -1
  4. package/dist/data-table/copy-helpers.d.ts +1 -1
  5. package/dist/data-table/filter-engine.d.cts +1 -1
  6. package/dist/data-table/filter-engine.d.ts +1 -1
  7. package/dist/data-table/host.d.cts +1 -1
  8. package/dist/data-table/host.d.ts +1 -1
  9. package/dist/data-table/index.cjs +2294 -2238
  10. package/dist/data-table/index.cjs.map +1 -1
  11. package/dist/data-table/index.d.cts +8 -3
  12. package/dist/data-table/index.d.ts +8 -3
  13. package/dist/data-table/index.js +2406 -2350
  14. package/dist/data-table/index.js.map +1 -1
  15. package/dist/data-table/infer-filter.d.cts +1 -1
  16. package/dist/data-table/infer-filter.d.ts +1 -1
  17. package/dist/data-table/layered-filters.d.cts +1 -1
  18. package/dist/data-table/layered-filters.d.ts +1 -1
  19. package/dist/data-table/query-control.d.cts +1 -1
  20. package/dist/data-table/query-control.d.ts +1 -1
  21. package/dist/data-table/types.cjs.map +1 -1
  22. package/dist/data-table/types.d.cts +1 -1
  23. package/dist/data-table/types.d.ts +1 -1
  24. package/dist/data-table/url-state.d.cts +1 -1
  25. package/dist/data-table/url-state.d.ts +1 -1
  26. package/dist/data-table/xlsx.d.cts +1 -1
  27. package/dist/data-table/xlsx.d.ts +1 -1
  28. package/dist/index.cjs +2 -2
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.js +2 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/{layered-filters-v-hFI3Pk.d.cts → layered-filters-CNFxkmfs.d.cts} +21 -10
  33. package/dist/{layered-filters-DlGwwJbD.d.ts → layered-filters-cXDqSLSR.d.ts} +21 -10
  34. package/dist/styles.css +46 -27
  35. package/dist/tokens.css +19 -5
  36. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { ContentTransferReference } from './content-transfer.cjs';
2
2
  import * as React from 'react';
3
- import { ReactNode } from 'react';
3
+ import { ReactNode, ComponentType, MouseEvent } from 'react';
4
4
  import { AgentPayloadInput, AiVariant, AiCustomSource, CopyExportConfig } from './data-table/copy-types.cjs';
5
5
  import { TableStyle, ChoiceColorLookup } from './data-table/table-style.cjs';
6
6
  import { F as FieldFormatConfig } from './types-JnZD8wM0.cjs';
@@ -95,6 +95,21 @@ type TableSearchMatchMode = "contains" | "whole_words";
95
95
  type CellEditType = "string" | "number" | "boolean" | "select"
96
96
  /** Free-text multi-value chips (string[] cells: tags, labels, aliases). */
97
97
  | "tags" | "date" | false;
98
+ /** The table owns action markup and geometry; hosts supply behavior and an icon component only. */
99
+ interface MatrxTableIconAction {
100
+ id: string;
101
+ icon: ComponentType<{
102
+ className?: string;
103
+ "aria-hidden"?: boolean;
104
+ }>;
105
+ label: string;
106
+ tooltip?: string;
107
+ onClick: (event: MouseEvent<HTMLButtonElement>) => void;
108
+ disabled?: boolean;
109
+ loading?: boolean;
110
+ tone?: "default" | "primary" | "destructive" | "success" | "warning";
111
+ variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link";
112
+ }
98
113
  interface MatrxColumnDef<T> {
99
114
  /** Stable id used for sort/filter state. Defaults to `accessorKey` when set. */
100
115
  id?: string;
@@ -118,6 +133,8 @@ interface MatrxColumnDef<T> {
118
133
  label?: string;
119
134
  /** Cell renderer. Defaults to stringified accessor value. */
120
135
  cell?: (row: T, index: number) => ReactNode;
136
+ /** An explicitly declared custom actions column. Arbitrary content never enters the built-in Actions column. */
137
+ customActions?: (row: T, controls: MatrxDataTableRecordControls) => ReactNode;
121
138
  /** Sortable unless explicitly false. Default true. */
122
139
  sortable?: boolean;
123
140
  /**
@@ -1629,8 +1646,8 @@ interface MatrxDataTableProps<T> {
1629
1646
  * the table owns checkbox selection and Alchemy copy for loaded rows.
1630
1647
  */
1631
1648
  selection?: false | MatrxDataTableSelectionConfig<T>;
1632
- /** Extra row actions rendered in a trailing Actions column. */
1633
- rowActions?: (row: T, controls: MatrxDataTableRecordControls) => ReactNode;
1649
+ /** Icon-only actions in the built-in Actions column. Labels are accessible names/tooltips, never button text. */
1650
+ rowActions?: (row: T, controls: MatrxDataTableRecordControls) => readonly MatrxTableIconAction[];
1634
1651
  /** Extra rows rendered in the table footer with the same columns as data rows. */
1635
1652
  footerRows?: T[];
1636
1653
  /** Optional KPIs above the toolbar and aligned totals in the canonical footer. */
@@ -1703,12 +1720,6 @@ interface MatrxDataTableProps<T> {
1703
1720
  * scrolls. A phone always scrolls: a fitted phone table is columns too narrow to read.
1704
1721
  */
1705
1722
  fitToWidth?: boolean | undefined;
1706
- /**
1707
- * WHAT THE ACTIONS HEADER OFFERS, beside its word — the table's own "add a row action" and the
1708
- * actions menu (merged-grid review 2, G4: "the ACTIONS header has no controls at all"). Drawn
1709
- * only where the Actions column is.
1710
- */
1711
- rowActionsHeader?: ReactNode;
1712
1723
  /** Highlight an index in the currently rendered page without selecting it. */
1713
1724
  highlightedIndex?: number | undefined;
1714
1725
  /** Receives the complete visible local view after local processing, before paging. Attaching after absence receives one snapshot; callback identity changes alone do not notify. */
@@ -1840,4 +1851,4 @@ declare function columnFiltersToLayeredRules(filters: ColumnFiltersState, fieldI
1840
1851
  declare function layeredFilterMatchesValue(value: unknown, rule: LayeredFilterRule): boolean;
1841
1852
  declare function layeredFilterRuleSummary(rule: LayeredFilterRule, fields: readonly LayeredFilterField[]): string;
1842
1853
 
1843
- export { type TableRankedSearchOptions as $, type AnyOfColumnSearch as A, type MatrxDataTableMobileCardControls as B, type ColumnFiltersState as C, type MatrxDataTableMultiExpandedDetailConfig as D, type MatrxDataTableQueryControl as E, type MatrxDataTableReadStatus as F, type MatrxDataTableSelectionConfig as G, type MatrxDataTableSingleExpandedDetailConfig as H, type MatrxDataTableSourceProcessing as I, type MatrxDataTableSpreadsheetConfig as J, type MatrxDataTableStyleConfig as K, type LayeredFilterRule as L, type MatrxColumnDef as M, type MatrxDataTableSummaryConfig as N, type MatrxDataTableSummaryContext as O, type MatrxDataTableSummaryMetric as P, type MatrxDataTableToolbar as Q, type MatrxDataTableUrlStateConfig as R, type SortState as S, type TableSearchMatchMode as T, type MatrxDataTableVirtualizeConfig as U, type MatrxDataTableWindowConfig as V, type MatrxTablePagination as W, type NumberFilterOp as X, type SavedTableViewTab as Y, type SortDirection as Z, type SpreadsheetSelection as _, type ColumnFilterValue as a, type TableSearchRole as a0, type TableSearchScope as a1, type TableViewQuery as a2, type TableViewTab as a3, TableViewTabs as a4, type TableViewTabsProps as a5, type TableViewTabsStore as a6, type TextFilterMode as a7, type ToolbarFacet as a8, inferTableSearchRole as a9, rankTableSearchRows as aa, resolveTableSearchScopes as ab, LAYERED_FILTER_OPERATORS as ac, LAYERED_FILTER_OPERATOR_LABELS as ad, type LayeredFilterField as ae, type LayeredFilterOperator as af, columnFiltersToLayeredRules as ag, completeLayeredFilterRules as ah, decodeLayeredFilterRules as ai, encodeLayeredFilterRules as aj, isCompleteLayeredFilterRule as ak, isLayeredFilterOperator as al, layeredFilterMatchesValue as am, layeredFilterNeedsValue as an, layeredFilterRuleSummary as ao, operatorsForLayeredField as ap, type TableSavedViewsProps as b, type MatrxDataTableDensity as c, type MatrxDataTableRecordControls as d, type MatrxDataTableQueryState as e, type ColumnFilterKind as f, type MatrxDataTableCopyConfig as g, type MatrxDataTableProps as h, type MatrxDataTableAppearance as i, type TableViewSnapshot as j, type MatrxDataTableRead as k, type ColumnMarker as l, type CellEditType as m, type CellEditsMap as n, type MatrxDataTableContextMenuConfig as o, type MatrxDataTableCoverageConfig as p, type MatrxDataTableDetailConfig as q, type MatrxDataTableDrillConfig as r, type MatrxDataTableEditConfig as s, type MatrxDataTableEmptyState as t, type MatrxDataTableExpandedDetailConfig as u, type MatrxDataTableFacetsConfig as v, type MatrxDataTableFilterUi as w, type MatrxDataTableGroupingConfig as x, type MatrxDataTableHierarchyConfig as y, type MatrxDataTableHierarchyMove as z };
1854
+ export { type SpreadsheetSelection as $, type AnyOfColumnSearch as A, type MatrxDataTableHierarchyMove as B, type ColumnFiltersState as C, type MatrxDataTableMobileCardControls as D, type MatrxDataTableMultiExpandedDetailConfig as E, type MatrxDataTableQueryControl as F, type MatrxDataTableReadStatus as G, type MatrxDataTableSelectionConfig as H, type MatrxDataTableSingleExpandedDetailConfig as I, type MatrxDataTableSourceProcessing as J, type MatrxDataTableSpreadsheetConfig as K, type LayeredFilterRule as L, type MatrxColumnDef as M, type MatrxDataTableStyleConfig as N, type MatrxDataTableSummaryConfig as O, type MatrxDataTableSummaryContext as P, type MatrxDataTableSummaryMetric as Q, type MatrxDataTableToolbar as R, type SortState as S, type TableSearchMatchMode as T, type MatrxDataTableUrlStateConfig as U, type MatrxDataTableVirtualizeConfig as V, type MatrxDataTableWindowConfig as W, type MatrxTablePagination as X, type NumberFilterOp as Y, type SavedTableViewTab as Z, type SortDirection as _, type ColumnFilterValue as a, type TableRankedSearchOptions as a0, type TableSearchRole as a1, type TableSearchScope as a2, type TableViewQuery as a3, type TableViewTab as a4, TableViewTabs as a5, type TableViewTabsProps as a6, type TableViewTabsStore as a7, type TextFilterMode as a8, type ToolbarFacet as a9, inferTableSearchRole as aa, rankTableSearchRows as ab, resolveTableSearchScopes as ac, LAYERED_FILTER_OPERATORS as ad, LAYERED_FILTER_OPERATOR_LABELS as ae, type LayeredFilterField as af, type LayeredFilterOperator as ag, columnFiltersToLayeredRules as ah, completeLayeredFilterRules as ai, decodeLayeredFilterRules as aj, encodeLayeredFilterRules as ak, isCompleteLayeredFilterRule as al, isLayeredFilterOperator as am, layeredFilterMatchesValue as an, layeredFilterNeedsValue as ao, layeredFilterRuleSummary as ap, operatorsForLayeredField as aq, type TableSavedViewsProps as b, type MatrxDataTableDensity as c, type MatrxDataTableRecordControls as d, type MatrxDataTableQueryState as e, type ColumnFilterKind as f, type MatrxDataTableCopyConfig as g, type MatrxTableIconAction as h, type MatrxDataTableProps as i, type MatrxDataTableAppearance as j, type TableViewSnapshot as k, type MatrxDataTableRead as l, type ColumnMarker as m, type CellEditType as n, type CellEditsMap as o, type MatrxDataTableContextMenuConfig as p, type MatrxDataTableCoverageConfig as q, type MatrxDataTableDetailConfig as r, type MatrxDataTableDrillConfig as s, type MatrxDataTableEditConfig as t, type MatrxDataTableEmptyState as u, type MatrxDataTableExpandedDetailConfig as v, type MatrxDataTableFacetsConfig as w, type MatrxDataTableFilterUi as x, type MatrxDataTableGroupingConfig as y, type MatrxDataTableHierarchyConfig as z };
@@ -1,6 +1,6 @@
1
1
  import { ContentTransferReference } from './content-transfer.js';
2
2
  import * as React from 'react';
3
- import { ReactNode } from 'react';
3
+ import { ReactNode, ComponentType, MouseEvent } from 'react';
4
4
  import { AgentPayloadInput, AiVariant, AiCustomSource, CopyExportConfig } from './data-table/copy-types.js';
5
5
  import { TableStyle, ChoiceColorLookup } from './data-table/table-style.js';
6
6
  import { F as FieldFormatConfig } from './types-JnZD8wM0.js';
@@ -95,6 +95,21 @@ type TableSearchMatchMode = "contains" | "whole_words";
95
95
  type CellEditType = "string" | "number" | "boolean" | "select"
96
96
  /** Free-text multi-value chips (string[] cells: tags, labels, aliases). */
97
97
  | "tags" | "date" | false;
98
+ /** The table owns action markup and geometry; hosts supply behavior and an icon component only. */
99
+ interface MatrxTableIconAction {
100
+ id: string;
101
+ icon: ComponentType<{
102
+ className?: string;
103
+ "aria-hidden"?: boolean;
104
+ }>;
105
+ label: string;
106
+ tooltip?: string;
107
+ onClick: (event: MouseEvent<HTMLButtonElement>) => void;
108
+ disabled?: boolean;
109
+ loading?: boolean;
110
+ tone?: "default" | "primary" | "destructive" | "success" | "warning";
111
+ variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link";
112
+ }
98
113
  interface MatrxColumnDef<T> {
99
114
  /** Stable id used for sort/filter state. Defaults to `accessorKey` when set. */
100
115
  id?: string;
@@ -118,6 +133,8 @@ interface MatrxColumnDef<T> {
118
133
  label?: string;
119
134
  /** Cell renderer. Defaults to stringified accessor value. */
120
135
  cell?: (row: T, index: number) => ReactNode;
136
+ /** An explicitly declared custom actions column. Arbitrary content never enters the built-in Actions column. */
137
+ customActions?: (row: T, controls: MatrxDataTableRecordControls) => ReactNode;
121
138
  /** Sortable unless explicitly false. Default true. */
122
139
  sortable?: boolean;
123
140
  /**
@@ -1629,8 +1646,8 @@ interface MatrxDataTableProps<T> {
1629
1646
  * the table owns checkbox selection and Alchemy copy for loaded rows.
1630
1647
  */
1631
1648
  selection?: false | MatrxDataTableSelectionConfig<T>;
1632
- /** Extra row actions rendered in a trailing Actions column. */
1633
- rowActions?: (row: T, controls: MatrxDataTableRecordControls) => ReactNode;
1649
+ /** Icon-only actions in the built-in Actions column. Labels are accessible names/tooltips, never button text. */
1650
+ rowActions?: (row: T, controls: MatrxDataTableRecordControls) => readonly MatrxTableIconAction[];
1634
1651
  /** Extra rows rendered in the table footer with the same columns as data rows. */
1635
1652
  footerRows?: T[];
1636
1653
  /** Optional KPIs above the toolbar and aligned totals in the canonical footer. */
@@ -1703,12 +1720,6 @@ interface MatrxDataTableProps<T> {
1703
1720
  * scrolls. A phone always scrolls: a fitted phone table is columns too narrow to read.
1704
1721
  */
1705
1722
  fitToWidth?: boolean | undefined;
1706
- /**
1707
- * WHAT THE ACTIONS HEADER OFFERS, beside its word — the table's own "add a row action" and the
1708
- * actions menu (merged-grid review 2, G4: "the ACTIONS header has no controls at all"). Drawn
1709
- * only where the Actions column is.
1710
- */
1711
- rowActionsHeader?: ReactNode;
1712
1723
  /** Highlight an index in the currently rendered page without selecting it. */
1713
1724
  highlightedIndex?: number | undefined;
1714
1725
  /** Receives the complete visible local view after local processing, before paging. Attaching after absence receives one snapshot; callback identity changes alone do not notify. */
@@ -1840,4 +1851,4 @@ declare function columnFiltersToLayeredRules(filters: ColumnFiltersState, fieldI
1840
1851
  declare function layeredFilterMatchesValue(value: unknown, rule: LayeredFilterRule): boolean;
1841
1852
  declare function layeredFilterRuleSummary(rule: LayeredFilterRule, fields: readonly LayeredFilterField[]): string;
1842
1853
 
1843
- export { type TableRankedSearchOptions as $, type AnyOfColumnSearch as A, type MatrxDataTableMobileCardControls as B, type ColumnFiltersState as C, type MatrxDataTableMultiExpandedDetailConfig as D, type MatrxDataTableQueryControl as E, type MatrxDataTableReadStatus as F, type MatrxDataTableSelectionConfig as G, type MatrxDataTableSingleExpandedDetailConfig as H, type MatrxDataTableSourceProcessing as I, type MatrxDataTableSpreadsheetConfig as J, type MatrxDataTableStyleConfig as K, type LayeredFilterRule as L, type MatrxColumnDef as M, type MatrxDataTableSummaryConfig as N, type MatrxDataTableSummaryContext as O, type MatrxDataTableSummaryMetric as P, type MatrxDataTableToolbar as Q, type MatrxDataTableUrlStateConfig as R, type SortState as S, type TableSearchMatchMode as T, type MatrxDataTableVirtualizeConfig as U, type MatrxDataTableWindowConfig as V, type MatrxTablePagination as W, type NumberFilterOp as X, type SavedTableViewTab as Y, type SortDirection as Z, type SpreadsheetSelection as _, type ColumnFilterValue as a, type TableSearchRole as a0, type TableSearchScope as a1, type TableViewQuery as a2, type TableViewTab as a3, TableViewTabs as a4, type TableViewTabsProps as a5, type TableViewTabsStore as a6, type TextFilterMode as a7, type ToolbarFacet as a8, inferTableSearchRole as a9, rankTableSearchRows as aa, resolveTableSearchScopes as ab, LAYERED_FILTER_OPERATORS as ac, LAYERED_FILTER_OPERATOR_LABELS as ad, type LayeredFilterField as ae, type LayeredFilterOperator as af, columnFiltersToLayeredRules as ag, completeLayeredFilterRules as ah, decodeLayeredFilterRules as ai, encodeLayeredFilterRules as aj, isCompleteLayeredFilterRule as ak, isLayeredFilterOperator as al, layeredFilterMatchesValue as am, layeredFilterNeedsValue as an, layeredFilterRuleSummary as ao, operatorsForLayeredField as ap, type TableSavedViewsProps as b, type MatrxDataTableDensity as c, type MatrxDataTableRecordControls as d, type MatrxDataTableQueryState as e, type ColumnFilterKind as f, type MatrxDataTableCopyConfig as g, type MatrxDataTableProps as h, type MatrxDataTableAppearance as i, type TableViewSnapshot as j, type MatrxDataTableRead as k, type ColumnMarker as l, type CellEditType as m, type CellEditsMap as n, type MatrxDataTableContextMenuConfig as o, type MatrxDataTableCoverageConfig as p, type MatrxDataTableDetailConfig as q, type MatrxDataTableDrillConfig as r, type MatrxDataTableEditConfig as s, type MatrxDataTableEmptyState as t, type MatrxDataTableExpandedDetailConfig as u, type MatrxDataTableFacetsConfig as v, type MatrxDataTableFilterUi as w, type MatrxDataTableGroupingConfig as x, type MatrxDataTableHierarchyConfig as y, type MatrxDataTableHierarchyMove as z };
1854
+ export { type SpreadsheetSelection as $, type AnyOfColumnSearch as A, type MatrxDataTableHierarchyMove as B, type ColumnFiltersState as C, type MatrxDataTableMobileCardControls as D, type MatrxDataTableMultiExpandedDetailConfig as E, type MatrxDataTableQueryControl as F, type MatrxDataTableReadStatus as G, type MatrxDataTableSelectionConfig as H, type MatrxDataTableSingleExpandedDetailConfig as I, type MatrxDataTableSourceProcessing as J, type MatrxDataTableSpreadsheetConfig as K, type LayeredFilterRule as L, type MatrxColumnDef as M, type MatrxDataTableStyleConfig as N, type MatrxDataTableSummaryConfig as O, type MatrxDataTableSummaryContext as P, type MatrxDataTableSummaryMetric as Q, type MatrxDataTableToolbar as R, type SortState as S, type TableSearchMatchMode as T, type MatrxDataTableUrlStateConfig as U, type MatrxDataTableVirtualizeConfig as V, type MatrxDataTableWindowConfig as W, type MatrxTablePagination as X, type NumberFilterOp as Y, type SavedTableViewTab as Z, type SortDirection as _, type ColumnFilterValue as a, type TableRankedSearchOptions as a0, type TableSearchRole as a1, type TableSearchScope as a2, type TableViewQuery as a3, type TableViewTab as a4, TableViewTabs as a5, type TableViewTabsProps as a6, type TableViewTabsStore as a7, type TextFilterMode as a8, type ToolbarFacet as a9, inferTableSearchRole as aa, rankTableSearchRows as ab, resolveTableSearchScopes as ac, LAYERED_FILTER_OPERATORS as ad, LAYERED_FILTER_OPERATOR_LABELS as ae, type LayeredFilterField as af, type LayeredFilterOperator as ag, columnFiltersToLayeredRules as ah, completeLayeredFilterRules as ai, decodeLayeredFilterRules as aj, encodeLayeredFilterRules as ak, isCompleteLayeredFilterRule as al, isLayeredFilterOperator as am, layeredFilterMatchesValue as an, layeredFilterNeedsValue as ao, layeredFilterRuleSummary as ap, operatorsForLayeredField as aq, type TableSavedViewsProps as b, type MatrxDataTableDensity as c, type MatrxDataTableRecordControls as d, type MatrxDataTableQueryState as e, type ColumnFilterKind as f, type MatrxDataTableCopyConfig as g, type MatrxTableIconAction as h, type MatrxDataTableProps as i, type MatrxDataTableAppearance as j, type TableViewSnapshot as k, type MatrxDataTableRead as l, type ColumnMarker as m, type CellEditType as n, type CellEditsMap as o, type MatrxDataTableContextMenuConfig as p, type MatrxDataTableCoverageConfig as q, type MatrxDataTableDetailConfig as r, type MatrxDataTableDrillConfig as s, type MatrxDataTableEditConfig as t, type MatrxDataTableEmptyState as u, type MatrxDataTableExpandedDetailConfig as v, type MatrxDataTableFacetsConfig as w, type MatrxDataTableFilterUi as x, type MatrxDataTableGroupingConfig as y, type MatrxDataTableHierarchyConfig as z };
package/dist/styles.css CHANGED
@@ -453,50 +453,49 @@
453
453
  }
454
454
  }
455
455
  .matrx-motion-sheet-top[data-state="open"] {
456
- animation: matrx-slide-in-top var(--matrx-motion-duration-sheet)
457
- var(--matrx-motion-ease-out);
456
+ animation: matrx-slide-in-top var(--matrx-motion-duration-panel)
457
+ var(--matrx-motion-ease-panel);
458
458
  }
459
459
  .matrx-motion-sheet-top[data-state="closed"] {
460
- animation: matrx-slide-out-top var(--matrx-motion-duration-slow)
461
- var(--matrx-motion-ease-in);
460
+ animation: matrx-slide-out-top var(--matrx-motion-duration-panel)
461
+ var(--matrx-motion-ease-panel);
462
462
  }
463
463
  .matrx-motion-sheet-bottom[data-state="open"] {
464
- animation: matrx-slide-in-bottom var(--matrx-motion-duration-sheet)
465
- var(--matrx-motion-ease-out);
464
+ animation: matrx-slide-in-bottom var(--matrx-motion-duration-panel)
465
+ var(--matrx-motion-ease-panel);
466
466
  }
467
467
  .matrx-motion-sheet-bottom[data-state="closed"] {
468
- animation: matrx-slide-out-bottom var(--matrx-motion-duration-slow)
469
- var(--matrx-motion-ease-in);
468
+ animation: matrx-slide-out-bottom var(--matrx-motion-duration-panel)
469
+ var(--matrx-motion-ease-panel);
470
470
  }
471
471
  .matrx-motion-sheet-left[data-state="open"] {
472
- animation: matrx-slide-in-left var(--matrx-motion-duration-sheet)
473
- var(--matrx-motion-ease-out);
472
+ animation: matrx-slide-in-left var(--matrx-motion-duration-panel)
473
+ var(--matrx-motion-ease-panel);
474
474
  }
475
475
  .matrx-motion-sheet-left[data-state="closed"] {
476
- animation: matrx-slide-out-left var(--matrx-motion-duration-slow)
477
- var(--matrx-motion-ease-in);
476
+ animation: matrx-slide-out-left var(--matrx-motion-duration-panel)
477
+ var(--matrx-motion-ease-panel);
478
478
  }
479
479
  .matrx-motion-sheet-right[data-state="open"] {
480
- animation: matrx-slide-in-right var(--matrx-motion-duration-sheet)
481
- var(--matrx-motion-ease-out);
480
+ animation: matrx-slide-in-right var(--matrx-motion-duration-panel)
481
+ var(--matrx-motion-ease-panel);
482
482
  }
483
483
  .matrx-motion-sheet-right[data-state="closed"] {
484
- animation: matrx-slide-out-right var(--matrx-motion-duration-slow)
485
- var(--matrx-motion-ease-in);
484
+ animation: matrx-slide-out-right var(--matrx-motion-duration-panel)
485
+ var(--matrx-motion-ease-panel);
486
486
  }
487
487
  /* A `side="center"` Sheet has no edge to come from, so it fades like a
488
488
  dialog scrim rather than sliding from nowhere. */
489
489
  .matrx-motion-sheet-center[data-state="open"] {
490
- animation: matrx-fade-in var(--matrx-motion-duration-sheet)
491
- var(--matrx-motion-ease-out);
490
+ animation: matrx-fade-in var(--matrx-motion-duration-panel)
491
+ var(--matrx-motion-ease-panel);
492
492
  }
493
493
  .matrx-motion-sheet-center[data-state="closed"] {
494
- animation: matrx-fade-out var(--matrx-motion-duration-slow)
495
- var(--matrx-motion-ease-in);
494
+ animation: matrx-fade-out var(--matrx-motion-duration-panel)
495
+ var(--matrx-motion-ease-panel);
496
496
  }
497
- /* The mobile Dialog / CommandDialog bottom sheet: slides AND fades, at the
498
- dialog's 200ms rather than the Sheet's 500ms, because it is a dialog
499
- wearing sheet geometry and it opens from a tap, not from a nav gesture. */
497
+ /* The mobile Dialog / CommandDialog bottom sheet: slides AND fades on THE
498
+ panel motion (0.56.0, the motion standard) — a bottom sheet is a panel. */
500
499
  @keyframes matrx-bottom-sheet-in {
501
500
  from {
502
501
  opacity: 0;
@@ -518,12 +517,12 @@
518
517
  }
519
518
  }
520
519
  .matrx-motion-bottom-sheet[data-state="open"] {
521
- animation: matrx-bottom-sheet-in var(--matrx-motion-duration-base)
522
- var(--matrx-motion-ease-out);
520
+ animation: matrx-bottom-sheet-in var(--matrx-motion-duration-panel)
521
+ var(--matrx-motion-ease-panel);
523
522
  }
524
523
  .matrx-motion-bottom-sheet[data-state="closed"] {
525
- animation: matrx-bottom-sheet-out var(--matrx-motion-duration-base)
526
- var(--matrx-motion-ease-in);
524
+ animation: matrx-bottom-sheet-out var(--matrx-motion-duration-panel)
525
+ var(--matrx-motion-ease-panel);
527
526
  }
528
527
 
529
528
  /* --- poppers -----------------------------------------------------------
@@ -957,6 +956,26 @@
957
956
  animation: none;
958
957
  }
959
958
 
959
+ /* THE PANEL MOTION on the vaul Drawer (0.56.0, the motion standard). vaul
960
+ 1.1.2 injects `[data-vaul-drawer]{transition: transform .5s
961
+ cubic-bezier(.32,.72,0,1); animation-duration: .5s; …}` (0,1,0) and sets the
962
+ same pace INLINE when a released drag settles. Two attributes (0,2,0) beat
963
+ its sheet whatever the load order; `!important` on the two timing longhands
964
+ beats its inline settle WITHOUT touching `transition-property`, so vaul's
965
+ inline `transition: none` while a finger drags still means no motion. */
966
+ [data-vaul-drawer][data-vaul-drawer-direction] {
967
+ animation-duration: var(--matrx-motion-duration-panel) !important;
968
+ animation-timing-function: var(--matrx-motion-ease-panel) !important;
969
+ transition-duration: var(--matrx-motion-duration-panel) !important;
970
+ transition-timing-function: var(--matrx-motion-ease-panel) !important;
971
+ }
972
+ [data-vaul-overlay][data-vaul-snap-points][data-state] {
973
+ animation-duration: var(--matrx-motion-duration-panel);
974
+ animation-timing-function: var(--matrx-motion-ease-panel);
975
+ transition-duration: var(--matrx-motion-duration-panel);
976
+ transition-timing-function: var(--matrx-motion-ease-panel);
977
+ }
978
+
960
979
  .matrx-mobile-sheet > [data-slot="dialog-footer"] {
961
980
  padding-bottom: max(var(--dialog-pad, 0px), env(safe-area-inset-bottom, 0px));
962
981
  }
package/dist/tokens.css CHANGED
@@ -139,14 +139,21 @@
139
139
  switch: `prefers-reduced-motion: reduce` silences the animations
140
140
  outright in styles.css, regardless of these values.
141
141
 
142
- The numbers are the ones the primitives already carried as Tailwind
143
- `duration-*` utilities before the package owned the keyframes:
144
- poppers/tooltips 150ms, dialogs and overlays 200ms, a sheet closing
145
- 300ms and opening 500ms. */
142
+ The small-motion numbers are the ones the primitives already carried as
143
+ Tailwind `duration-*` utilities before the package owned the keyframes:
144
+ poppers/tooltips 150ms, dialogs and overlays 200ms, 300ms slow. */
146
145
  --matrx-motion-duration-fast: 150ms;
147
146
  --matrx-motion-duration-base: 200ms;
148
147
  --matrx-motion-duration-slow: 300ms;
149
- --matrx-motion-duration-sheet: 500ms;
148
+ /* THE PANEL MOTION (0.56.0) — the motion standard (AI Matrx
149
+ common-docs/policies/motion-standard.md, Arman 2026-10-02): every panel-like
150
+ slide — the Sheet on every side, the mobile Dialog bottom sheet, the vaul
151
+ Drawer and the Sidebar's collapse — opens AND closes on this one pair. The
152
+ NAMES are the package's contract; the VALUES are the host's (a host that
153
+ declares them unlayered wins over this layered default). An even
154
+ ease-in-out, never a spring; 0ms under reduced motion (below). */
155
+ --matrx-motion-duration-panel: 600ms;
156
+ --matrx-motion-ease-panel: cubic-bezier(0.4, 0, 0.2, 1);
150
157
  /* Enters decelerate (the surface arrives and settles); exits accelerate
151
158
  (it leaves and is gone). Linear on both — which is what
152
159
  `tailwindcss-animate` defaulted to — reads mechanical at these
@@ -263,4 +270,11 @@
263
270
  --background-texture: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2' viewBox='0 0 2 2'%3E%3Cpath fill='%23999' fill-opacity='0.07' d='M1 1h0.5v0.5H1V1z'%3E%3C/path%3E%3C/svg%3E");
264
271
  --card-texture: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2' viewBox='0 0 2 2'%3E%3Cpath fill='%23fff' fill-opacity='0.02' d='M1 1h0.5v0.5H1V1z'%3E%3C/path%3E%3C/svg%3E");
265
272
  }
273
+
274
+ /* Reduced motion means no panel slide (the motion standard, rule 6). */
275
+ @media (prefers-reduced-motion: reduce) {
276
+ :root {
277
+ --matrx-motion-duration-panel: 0ms;
278
+ }
279
+ }
266
280
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/design-system",
3
- "version": "0.55.0",
3
+ "version": "0.56.0",
4
4
  "description": "AI Matrx semantic React primitives shared across Vite, Next.js, desktop, and customer-built applications.",
5
5
  "type": "module",
6
6
  "license": "MIT",