@deque/cauldron-react 6.11.0 → 6.12.0-canary.4505ef2e

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.
@@ -1,9 +1,21 @@
1
- import React, { TableHTMLAttributes } from 'react';
2
- interface TableProps extends TableHTMLAttributes<HTMLTableElement> {
1
+ import React from 'react';
2
+ export type Column = {
3
+ align: ColumnAlignment;
4
+ width?: ColumnWidth;
5
+ };
6
+ export type ColumnAlignment = 'start' | 'center' | 'end';
7
+ export type ColumnWidth = 'auto' | 'min-content' | 'max-content' | `${number}` | `${number}%` | `${number}fr`;
8
+ export type RowAlignment = 'start' | 'center';
9
+ type TableBaseProps = {
10
+ layout: never;
11
+ columns: never;
12
+ variant?: 'border';
13
+ };
14
+ type TableGridProps = {
15
+ layout: 'grid';
16
+ columns?: Array<Column> | number;
3
17
  variant?: 'border';
4
- }
5
- declare const Table: {
6
- ({ children, className, variant, ...other }: TableProps): React.JSX.Element;
7
- displayName: string;
8
18
  };
19
+ type TableProps = (TableBaseProps | Partial<TableGridProps>) & React.TableHTMLAttributes<HTMLTableElement>;
20
+ declare const Table: React.ForwardRefExoticComponent<TableProps & React.RefAttributes<HTMLTableElement>>;
9
21
  export default Table;
@@ -1,6 +1,5 @@
1
- import React, { HTMLAttributes } from 'react';
2
- declare const TableBody: {
3
- ({ children, className, ...other }: HTMLAttributes<HTMLTableSectionElement>): React.JSX.Element;
4
- displayName: string;
5
- };
1
+ import React from 'react';
2
+ declare const TableBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & {
3
+ className?: string | undefined;
4
+ } & React.RefAttributes<HTMLTableSectionElement>>;
6
5
  export default TableBody;
@@ -1,6 +1,7 @@
1
- import React, { TdHTMLAttributes } from 'react';
2
- declare const TableCell: {
3
- ({ children, className, ...other }: TdHTMLAttributes<HTMLTableCellElement>): React.JSX.Element;
4
- displayName: string;
5
- };
1
+ import type { ColumnAlignment } from './Table';
2
+ import React from 'react';
3
+ interface TableCellProps extends Omit<React.TdHTMLAttributes<HTMLTableDataCellElement>, 'align'> {
4
+ align?: ColumnAlignment;
5
+ }
6
+ declare const TableCell: React.ForwardRefExoticComponent<TableCellProps & React.RefAttributes<HTMLTableCellElement>>;
6
7
  export default TableCell;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { Column } from './Table';
3
+ type TableContext = {
4
+ layout: 'table' | 'grid';
5
+ columns: Array<Column>;
6
+ };
7
+ type TableProvider = {
8
+ children: React.ReactNode;
9
+ layout: 'table' | 'grid';
10
+ columns: Array<Column>;
11
+ };
12
+ declare const TableContext: React.Context<TableContext>;
13
+ declare function TableProvider({ children, layout, columns }: TableProvider): JSX.Element;
14
+ declare function useTable(): TableContext;
15
+ export { TableProvider, useTable };
@@ -1,6 +1,5 @@
1
- import React, { HTMLAttributes } from 'react';
2
- declare const TableFooter: {
3
- ({ children, className, ...other }: HTMLAttributes<HTMLTableSectionElement>): React.JSX.Element;
4
- displayName: string;
5
- };
1
+ import React from 'react';
2
+ declare const TableFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & {
3
+ className?: string | undefined;
4
+ } & React.RefAttributes<HTMLTableSectionElement>>;
6
5
  export default TableFooter;
@@ -1,6 +1,5 @@
1
- import React, { HTMLAttributes } from 'react';
2
- declare const TableHead: {
3
- ({ children, className, ...other }: HTMLAttributes<HTMLTableSectionElement>): React.JSX.Element;
4
- displayName: string;
5
- };
1
+ import React from 'react';
2
+ declare const TableHead: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & {
3
+ className?: string | undefined;
4
+ } & React.RefAttributes<HTMLTableSectionElement>>;
6
5
  export default TableHead;
@@ -1,13 +1,12 @@
1
- import React, { ThHTMLAttributes } from 'react';
1
+ import type { ColumnAlignment } from './Table';
2
+ import React from 'react';
2
3
  type SortDirection = 'ascending' | 'descending' | 'none';
3
- interface TableHeaderProps extends ThHTMLAttributes<HTMLTableCellElement> {
4
+ interface TableHeaderProps extends Omit<React.ThHTMLAttributes<HTMLTableHeaderCellElement>, 'align'> {
4
5
  sortDirection?: SortDirection;
5
6
  onSort?: () => void;
6
7
  sortAscendingAnnouncement?: string;
7
8
  sortDescendingAnnouncement?: string;
9
+ align?: ColumnAlignment;
8
10
  }
9
- declare const TableHeader: {
10
- ({ children, sortDirection, onSort, className, sortAscendingAnnouncement, sortDescendingAnnouncement, ...other }: TableHeaderProps): React.JSX.Element;
11
- displayName: string;
12
- };
11
+ declare const TableHeader: React.ForwardRefExoticComponent<TableHeaderProps & React.RefAttributes<HTMLTableHeaderCellElement>>;
13
12
  export default TableHeader;
@@ -0,0 +1,10 @@
1
+ import type { useTable } from './TableContext';
2
+ import type { Column, ColumnAlignment } from './Table';
3
+ interface useTableGridStylesParameters<E extends HTMLTableCellElement = HTMLTableCellElement> {
4
+ elementRef: React.RefObject<E | null>;
5
+ align?: ColumnAlignment;
6
+ layout: ReturnType<typeof useTable>['layout'];
7
+ columns: Array<Column>;
8
+ }
9
+ export default function useTableGridStyles<E extends HTMLTableCellElement>({ elementRef, align, layout, columns }: useTableGridStylesParameters<E>): React.CSSProperties;
10
+ export {};
package/lib/index.js CHANGED
@@ -1282,7 +1282,7 @@ var SideBar = /** @class */ (function (_super) {
1282
1282
  }(React.Component));
1283
1283
 
1284
1284
  var SideBarItem = function (_a) {
1285
- var children = _a.children, autoClickLink = _a.autoClickLink, other = tslib.__rest(_a, ["children", "autoClickLink"]);
1285
+ var children = _a.children, _b = _a.autoClickLink, autoClickLink = _b === void 0 ? true : _b, other = tslib.__rest(_a, ["children", "autoClickLink"]);
1286
1286
  var onClick = function (e) {
1287
1287
  if (!autoClickLink) {
1288
1288
  return;
@@ -1294,9 +1294,6 @@ var SideBarItem = function (_a) {
1294
1294
  /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
1295
1295
  };
1296
1296
  SideBarItem.displayName = 'SideBarItem';
1297
- SideBarItem.defaultProps = {
1298
- autoClickLink: true
1299
- };
1300
1297
 
1301
1298
  /**
1302
1299
  * Handles aria-hidden for dialogs.
@@ -2783,32 +2780,138 @@ var TagButton = React__default["default"].forwardRef(function (_a, ref) {
2783
2780
  });
2784
2781
  TagButton.displayName = 'TagButton';
2785
2782
 
2786
- var Table = function (_a) {
2787
- var children = _a.children, className = _a.className, variant = _a.variant, other = tslib.__rest(_a, ["children", "className", "variant"]);
2788
- return (React__default["default"].createElement("table", tslib.__assign({ className: classNames__default["default"]('Table', variant === 'border' && 'Table--border', className) }, other), children));
2789
- };
2783
+ var TableContext = React.createContext({
2784
+ layout: 'table',
2785
+ columns: []
2786
+ });
2787
+ function TableProvider(_a) {
2788
+ var children = _a.children, layout = _a.layout, columns = _a.columns;
2789
+ var Provider = TableContext.Provider;
2790
+ var contextValue = React.useMemo(function () { return ({
2791
+ layout: layout,
2792
+ columns: columns
2793
+ }); }, [layout, columns]);
2794
+ return React__default["default"].createElement(Provider, { value: contextValue }, children);
2795
+ }
2796
+ function useTable() {
2797
+ return React.useContext(TableContext);
2798
+ }
2799
+
2800
+ var Table = React__default["default"].forwardRef(function (_a, ref) {
2801
+ var children = _a.children, className = _a.className, variant = _a.variant, layout = _a.layout, _b = _a.columns, columnsProp = _b === void 0 ? [] : _b, style = _a.style, other = tslib.__rest(_a, ["children", "className", "variant", "layout", "columns", "style"]);
2802
+ var isGridLayout = layout === 'grid';
2803
+ var columns = React.useMemo(function () {
2804
+ if (typeof columnsProp === 'number') {
2805
+ return columnsProp > 0
2806
+ ? Array(columnsProp).fill({ align: 'start' })
2807
+ : [{ align: 'start' }];
2808
+ }
2809
+ return columnsProp;
2810
+ }, [columnsProp]);
2811
+ var styleTemplateColumns = React.useMemo(function () {
2812
+ if (layout !== 'grid') {
2813
+ return;
2814
+ }
2815
+ if (!columns) {
2816
+ return 'auto';
2817
+ }
2818
+ return columns
2819
+ .map(function (_a) {
2820
+ var width = _a.width;
2821
+ return width || 'auto';
2822
+ })
2823
+ .join(' ');
2824
+ }, [layout, columns]);
2825
+ var tableGridStyles = isGridLayout
2826
+ ? {
2827
+ '--table-grid-template-columns': styleTemplateColumns
2828
+ }
2829
+ : {};
2830
+ return (React__default["default"].createElement("table", tslib.__assign({ ref: ref, style: tslib.__assign(tslib.__assign({}, tableGridStyles), style), className: classNames__default["default"]('Table', className, {
2831
+ 'Table--border': variant === 'border',
2832
+ TableGrid: isGridLayout
2833
+ }) }, other),
2834
+ React__default["default"].createElement(TableProvider, { layout: isGridLayout ? 'grid' : 'table', columns: columns }, children)));
2835
+ });
2790
2836
  Table.displayName = 'Table';
2791
2837
 
2792
- var TableBody = function (_a) {
2838
+ var TableBody = React.forwardRef(function (_a, ref) {
2793
2839
  var children = _a.children, className = _a.className, other = tslib.__rest(_a, ["children", "className"]);
2794
- return (React__default["default"].createElement("tbody", tslib.__assign({ className: classNames__default["default"]('TableBody', className) }, other), children));
2795
- };
2840
+ return (React__default["default"].createElement("tbody", tslib.__assign({ ref: ref, className: classNames__default["default"]('TableBody', className) }, other), children));
2841
+ });
2796
2842
  TableBody.displayName = 'TableBody';
2797
2843
 
2798
- var TableCell = function (_a) {
2799
- var children = _a.children, className = _a.className, other = tslib.__rest(_a, ["children", "className"]);
2800
- return (React__default["default"].createElement("td", tslib.__assign({ className: classNames__default["default"]('TableCell', className) }, other), children));
2801
- };
2844
+ function useTableGridStyles(_a) {
2845
+ var elementRef = _a.elementRef, align = _a.align, layout = _a.layout, columns = _a.columns;
2846
+ var isGridLayout = layout === 'grid';
2847
+ var _b = tslib.__read(React.useState(align || 'start'), 2), columnAlignment = _b[0], setColumnAlignment = _b[1];
2848
+ var _c = tslib.__read(React.useState(1), 2), gridColumnSpan = _c[0], setGridColumnSpan = _c[1];
2849
+ var _d = tslib.__read(React.useState(1), 2), gridRowSpan = _d[0], setGridRowSpan = _d[1];
2850
+ React.useEffect(function () {
2851
+ var _a;
2852
+ if (!isGridLayout) {
2853
+ return;
2854
+ }
2855
+ var element = elementRef.current;
2856
+ var column = typeof columns !== 'number' && columns[(_a = element === null || element === void 0 ? void 0 : element.cellIndex) !== null && _a !== void 0 ? _a : -1];
2857
+ if (!column) {
2858
+ setColumnAlignment(align || 'start');
2859
+ }
2860
+ else {
2861
+ setColumnAlignment(column.align);
2862
+ }
2863
+ if (element === null || element === void 0 ? void 0 : element.colSpan) {
2864
+ setGridColumnSpan(element.colSpan);
2865
+ }
2866
+ else {
2867
+ setGridColumnSpan(1);
2868
+ }
2869
+ if (element === null || element === void 0 ? void 0 : element.rowSpan) {
2870
+ setGridRowSpan(element.rowSpan);
2871
+ }
2872
+ else {
2873
+ setGridRowSpan(1);
2874
+ }
2875
+ }, [isGridLayout, columns, align]);
2876
+ return isGridLayout
2877
+ ? {
2878
+ textAlign: columnAlignment,
2879
+ gridColumn: gridColumnSpan > 1 ? "span ".concat(gridColumnSpan) : undefined,
2880
+ gridRow: gridRowSpan > 1 ? "span ".concat(gridRowSpan) : undefined
2881
+ }
2882
+ : {};
2883
+ }
2884
+
2885
+ var TableCell = React.forwardRef(function (_a, ref) {
2886
+ var children = _a.children, className = _a.className, align = _a.align, style = _a.style, other = tslib.__rest(_a, ["children", "className", "align", "style"]);
2887
+ var tableCellRef = useSharedRef(ref);
2888
+ var _b = useTable(), layout = _b.layout, columns = _b.columns;
2889
+ var tableGridStyles = useTableGridStyles({
2890
+ elementRef: tableCellRef,
2891
+ align: align,
2892
+ columns: columns,
2893
+ layout: layout
2894
+ });
2895
+ return (React__default["default"].createElement("td", tslib.__assign({ ref: tableCellRef, style: tslib.__assign(tslib.__assign({}, tableGridStyles), style), className: classNames__default["default"]('TableCell', className) }, other), children));
2896
+ });
2802
2897
  TableCell.displayName = 'TableCell';
2803
2898
 
2804
- var TableHead = function (_a) {
2899
+ var TableHead = React.forwardRef(function (_a, ref) {
2805
2900
  var children = _a.children, className = _a.className, other = tslib.__rest(_a, ["children", "className"]);
2806
- return (React__default["default"].createElement("thead", tslib.__assign({ className: classNames__default["default"]('TableHead', className) }, other), children));
2807
- };
2901
+ return (React__default["default"].createElement("thead", tslib.__assign({ ref: ref, className: classNames__default["default"]('TableHead', className) }, other), children));
2902
+ });
2808
2903
  TableHead.displayName = 'TableHead';
2809
2904
 
2810
- var TableHeader = function (_a) {
2811
- var children = _a.children, sortDirection = _a.sortDirection, onSort = _a.onSort, className = _a.className, _b = _a.sortAscendingAnnouncement, sortAscendingAnnouncement = _b === void 0 ? 'sorted ascending' : _b, _c = _a.sortDescendingAnnouncement, sortDescendingAnnouncement = _c === void 0 ? 'sorted descending' : _c, other = tslib.__rest(_a, ["children", "sortDirection", "onSort", "className", "sortAscendingAnnouncement", "sortDescendingAnnouncement"]);
2905
+ var TableHeader = React.forwardRef(function (_a, ref) {
2906
+ var children = _a.children, sortDirection = _a.sortDirection, onSort = _a.onSort, className = _a.className, _b = _a.sortAscendingAnnouncement, sortAscendingAnnouncement = _b === void 0 ? 'sorted ascending' : _b, _c = _a.sortDescendingAnnouncement, sortDescendingAnnouncement = _c === void 0 ? 'sorted descending' : _c, align = _a.align, style = _a.style, other = tslib.__rest(_a, ["children", "sortDirection", "onSort", "className", "sortAscendingAnnouncement", "sortDescendingAnnouncement", "align", "style"]);
2907
+ var tableHeaderRef = useSharedRef(ref);
2908
+ var _d = useTable(), layout = _d.layout, columns = _d.columns;
2909
+ var tableGridStyles = useTableGridStyles({
2910
+ elementRef: tableHeaderRef,
2911
+ align: align,
2912
+ columns: columns,
2913
+ layout: layout
2914
+ });
2812
2915
  // When the sort direction changes, we want to announce the change in a live region
2813
2916
  // because changes to the sort value is not widely supported yet
2814
2917
  // see: https://a11ysupport.io/tech/aria/aria-sort_attribute
@@ -2817,15 +2920,15 @@ var TableHeader = function (_a) {
2817
2920
  : sortDirection === 'descending'
2818
2921
  ? sortDescendingAnnouncement
2819
2922
  : '';
2820
- return (React__default["default"].createElement("th", tslib.__assign({ "aria-sort": sortDirection, className: classNames__default["default"]('TableHeader', className, {
2923
+ return (React__default["default"].createElement("th", tslib.__assign({ ref: tableHeaderRef, "aria-sort": sortDirection, className: classNames__default["default"]('TableHeader', className, {
2821
2924
  'TableHeader--sort-ascending': sortDirection === 'ascending',
2822
2925
  'TableHeader--sort-descending': sortDirection === 'descending'
2823
- }) }, other), !!onSort && !!sortDirection ? (React__default["default"].createElement("button", { onClick: onSort, className: "TableHeader__sort-button", type: "button" },
2926
+ }), style: tslib.__assign(tslib.__assign({}, tableGridStyles), style) }, other), !!onSort && !!sortDirection ? (React__default["default"].createElement("button", { onClick: onSort, className: "TableHeader__sort-button", type: "button" },
2824
2927
  children,
2825
2928
  React__default["default"].createElement("span", { "aria-hidden": "true" }, sortDirection === 'none' ? (React__default["default"].createElement(Icon, { type: "sort-triangle" })) : sortDirection === 'ascending' ? (React__default["default"].createElement(Icon, { type: "table-sort-ascending" })) : (React__default["default"].createElement(Icon, { type: "table-sort-descending" }))),
2826
2929
  React__default["default"].createElement(Offscreen, null,
2827
2930
  React__default["default"].createElement("span", { role: "status", "aria-live": "polite" }, announcement)))) : (children)));
2828
- };
2931
+ });
2829
2932
  TableHeader.displayName = 'TableHeader';
2830
2933
 
2831
2934
  var TableRow = function (_a) {
@@ -2834,10 +2937,10 @@ var TableRow = function (_a) {
2834
2937
  };
2835
2938
  TableRow.displayName = 'TableRow';
2836
2939
 
2837
- var TableFooter = function (_a) {
2940
+ var TableFooter = React.forwardRef(function (_a, ref) {
2838
2941
  var children = _a.children, className = _a.className, other = tslib.__rest(_a, ["children", "className"]);
2839
- return (React__default["default"].createElement("tfoot", tslib.__assign({ className: classNames__default["default"]('TableFooter', className) }, other), children));
2840
- };
2942
+ return (React__default["default"].createElement("tfoot", tslib.__assign({ ref: ref, className: classNames__default["default"]('TableFooter', className) }, other), children));
2943
+ });
2841
2944
  TableFooter.displayName = 'TableFooter';
2842
2945
 
2843
2946
  var Tab = React__default["default"].forwardRef(function (_a, ref) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deque/cauldron-react",
3
- "version": "6.11.0",
3
+ "version": "6.12.0-canary.4505ef2e",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Fully accessible react components library for Deque Cauldron",
6
6
  "homepage": "https://cauldron.dequelabs.com/",