@deque/cauldron-react 6.11.0 → 6.12.0-canary.98683670

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
@@ -2783,32 +2783,138 @@ var TagButton = React__default["default"].forwardRef(function (_a, ref) {
2783
2783
  });
2784
2784
  TagButton.displayName = 'TagButton';
2785
2785
 
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
- };
2786
+ var TableContext = React.createContext({
2787
+ layout: 'table',
2788
+ columns: []
2789
+ });
2790
+ function TableProvider(_a) {
2791
+ var children = _a.children, layout = _a.layout, columns = _a.columns;
2792
+ var Provider = TableContext.Provider;
2793
+ var contextValue = React.useMemo(function () { return ({
2794
+ layout: layout,
2795
+ columns: columns
2796
+ }); }, [layout, columns]);
2797
+ return React__default["default"].createElement(Provider, { value: contextValue }, children);
2798
+ }
2799
+ function useTable() {
2800
+ return React.useContext(TableContext);
2801
+ }
2802
+
2803
+ var Table = React__default["default"].forwardRef(function (_a, ref) {
2804
+ 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"]);
2805
+ var isGridLayout = layout === 'grid';
2806
+ var columns = React.useMemo(function () {
2807
+ if (typeof columnsProp === 'number') {
2808
+ return columnsProp > 0
2809
+ ? Array(columnsProp).fill({ align: 'start' })
2810
+ : [{ align: 'start' }];
2811
+ }
2812
+ return columnsProp;
2813
+ }, [columnsProp]);
2814
+ var styleTemplateColumns = React.useMemo(function () {
2815
+ if (layout !== 'grid') {
2816
+ return;
2817
+ }
2818
+ if (!columns) {
2819
+ return 'auto';
2820
+ }
2821
+ return columns
2822
+ .map(function (_a) {
2823
+ var width = _a.width;
2824
+ return width || 'auto';
2825
+ })
2826
+ .join(' ');
2827
+ }, [layout, columns]);
2828
+ var tableGridStyles = isGridLayout
2829
+ ? {
2830
+ '--table-grid-template-columns': styleTemplateColumns
2831
+ }
2832
+ : {};
2833
+ return (React__default["default"].createElement("table", tslib.__assign({ ref: ref, style: tslib.__assign(tslib.__assign({}, tableGridStyles), style), className: classNames__default["default"]('Table', className, {
2834
+ 'Table--border': variant === 'border',
2835
+ TableGrid: isGridLayout
2836
+ }) }, other),
2837
+ React__default["default"].createElement(TableProvider, { layout: isGridLayout ? 'grid' : 'table', columns: columns }, children)));
2838
+ });
2790
2839
  Table.displayName = 'Table';
2791
2840
 
2792
- var TableBody = function (_a) {
2841
+ var TableBody = React.forwardRef(function (_a, ref) {
2793
2842
  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
- };
2843
+ return (React__default["default"].createElement("tbody", tslib.__assign({ ref: ref, className: classNames__default["default"]('TableBody', className) }, other), children));
2844
+ });
2796
2845
  TableBody.displayName = 'TableBody';
2797
2846
 
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
- };
2847
+ function useTableGridStyles(_a) {
2848
+ var elementRef = _a.elementRef, align = _a.align, layout = _a.layout, columns = _a.columns;
2849
+ var isGridLayout = layout === 'grid';
2850
+ var _b = tslib.__read(React.useState(align || 'start'), 2), columnAlignment = _b[0], setColumnAlignment = _b[1];
2851
+ var _c = tslib.__read(React.useState(1), 2), gridColumnSpan = _c[0], setGridColumnSpan = _c[1];
2852
+ var _d = tslib.__read(React.useState(1), 2), gridRowSpan = _d[0], setGridRowSpan = _d[1];
2853
+ React.useEffect(function () {
2854
+ var _a;
2855
+ if (!isGridLayout) {
2856
+ return;
2857
+ }
2858
+ var element = elementRef.current;
2859
+ var column = typeof columns !== 'number' && columns[(_a = element === null || element === void 0 ? void 0 : element.cellIndex) !== null && _a !== void 0 ? _a : -1];
2860
+ if (!column) {
2861
+ setColumnAlignment(align || 'start');
2862
+ }
2863
+ else {
2864
+ setColumnAlignment(column.align);
2865
+ }
2866
+ if (element === null || element === void 0 ? void 0 : element.colSpan) {
2867
+ setGridColumnSpan(element.colSpan);
2868
+ }
2869
+ else {
2870
+ setGridColumnSpan(1);
2871
+ }
2872
+ if (element === null || element === void 0 ? void 0 : element.rowSpan) {
2873
+ setGridRowSpan(element.rowSpan);
2874
+ }
2875
+ else {
2876
+ setGridRowSpan(1);
2877
+ }
2878
+ }, [isGridLayout, columns, align]);
2879
+ return isGridLayout
2880
+ ? {
2881
+ textAlign: columnAlignment,
2882
+ gridColumn: gridColumnSpan > 1 ? "span ".concat(gridColumnSpan) : undefined,
2883
+ gridRow: gridRowSpan > 1 ? "span ".concat(gridRowSpan) : undefined
2884
+ }
2885
+ : {};
2886
+ }
2887
+
2888
+ var TableCell = React.forwardRef(function (_a, ref) {
2889
+ var children = _a.children, className = _a.className, align = _a.align, style = _a.style, other = tslib.__rest(_a, ["children", "className", "align", "style"]);
2890
+ var tableCellRef = useSharedRef(ref);
2891
+ var _b = useTable(), layout = _b.layout, columns = _b.columns;
2892
+ var tableGridStyles = useTableGridStyles({
2893
+ elementRef: tableCellRef,
2894
+ align: align,
2895
+ columns: columns,
2896
+ layout: layout
2897
+ });
2898
+ 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));
2899
+ });
2802
2900
  TableCell.displayName = 'TableCell';
2803
2901
 
2804
- var TableHead = function (_a) {
2902
+ var TableHead = React.forwardRef(function (_a, ref) {
2805
2903
  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
- };
2904
+ return (React__default["default"].createElement("thead", tslib.__assign({ ref: ref, className: classNames__default["default"]('TableHead', className) }, other), children));
2905
+ });
2808
2906
  TableHead.displayName = 'TableHead';
2809
2907
 
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"]);
2908
+ var TableHeader = React.forwardRef(function (_a, ref) {
2909
+ 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"]);
2910
+ var tableHeaderRef = useSharedRef(ref);
2911
+ var _d = useTable(), layout = _d.layout, columns = _d.columns;
2912
+ var tableGridStyles = useTableGridStyles({
2913
+ elementRef: tableHeaderRef,
2914
+ align: align,
2915
+ columns: columns,
2916
+ layout: layout
2917
+ });
2812
2918
  // When the sort direction changes, we want to announce the change in a live region
2813
2919
  // because changes to the sort value is not widely supported yet
2814
2920
  // see: https://a11ysupport.io/tech/aria/aria-sort_attribute
@@ -2817,15 +2923,15 @@ var TableHeader = function (_a) {
2817
2923
  : sortDirection === 'descending'
2818
2924
  ? sortDescendingAnnouncement
2819
2925
  : '';
2820
- return (React__default["default"].createElement("th", tslib.__assign({ "aria-sort": sortDirection, className: classNames__default["default"]('TableHeader', className, {
2926
+ return (React__default["default"].createElement("th", tslib.__assign({ ref: tableHeaderRef, "aria-sort": sortDirection, className: classNames__default["default"]('TableHeader', className, {
2821
2927
  'TableHeader--sort-ascending': sortDirection === 'ascending',
2822
2928
  'TableHeader--sort-descending': sortDirection === 'descending'
2823
- }) }, other), !!onSort && !!sortDirection ? (React__default["default"].createElement("button", { onClick: onSort, className: "TableHeader__sort-button", type: "button" },
2929
+ }), style: tslib.__assign(tslib.__assign({}, tableGridStyles), style) }, other), !!onSort && !!sortDirection ? (React__default["default"].createElement("button", { onClick: onSort, className: "TableHeader__sort-button", type: "button" },
2824
2930
  children,
2825
2931
  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
2932
  React__default["default"].createElement(Offscreen, null,
2827
2933
  React__default["default"].createElement("span", { role: "status", "aria-live": "polite" }, announcement)))) : (children)));
2828
- };
2934
+ });
2829
2935
  TableHeader.displayName = 'TableHeader';
2830
2936
 
2831
2937
  var TableRow = function (_a) {
@@ -2834,10 +2940,10 @@ var TableRow = function (_a) {
2834
2940
  };
2835
2941
  TableRow.displayName = 'TableRow';
2836
2942
 
2837
- var TableFooter = function (_a) {
2943
+ var TableFooter = React.forwardRef(function (_a, ref) {
2838
2944
  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
- };
2945
+ return (React__default["default"].createElement("tfoot", tslib.__assign({ ref: ref, className: classNames__default["default"]('TableFooter', className) }, other), children));
2946
+ });
2841
2947
  TableFooter.displayName = 'TableFooter';
2842
2948
 
2843
2949
  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.98683670",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Fully accessible react components library for Deque Cauldron",
6
6
  "homepage": "https://cauldron.dequelabs.com/",