@stratakit/structures
Version:
Medium-sized component structures for the Strata design system
145 lines (144 loc) • 4.21 kB
JavaScript
import { jsx } from "react/jsx-runtime";
import * as React from "react";
import { Role } from "@ariakit/react/role";
import {
forwardRef,
useMergedRefs,
useSafeContext
} from "@stratakit/foundations/secret-internals";
import cx from "classnames";
const TableContext = React.createContext(void 0);
const TableHeaderContext = React.createContext(false);
const HtmlTable = forwardRef((props, forwardedRef) => {
const tableContextValue = React.useMemo(
() => ({ mode: "html" }),
[]
);
return /* @__PURE__ */ jsx(TableContext.Provider, { value: tableContextValue, children: /* @__PURE__ */ jsx(
Role,
{
render: /* @__PURE__ */ jsx("table", {}),
...props,
ref: forwardedRef,
className: cx("\u{1F95D}-table", props.className)
}
) });
});
const CustomTable = forwardRef(
(props, forwardedRef) => {
const [captionId, setCaptionId] = React.useState();
const tableContextValue = React.useMemo(
() => ({ captionId, setCaptionId, mode: "aria" }),
[captionId]
);
return /* @__PURE__ */ jsx(TableContext.Provider, { value: tableContextValue, children: /* @__PURE__ */ jsx(
Role.div,
{
role: "table",
"aria-labelledby": captionId,
...props,
ref: forwardedRef,
className: cx("\u{1F95D}-table", props.className)
}
) });
}
);
const TableHeader = forwardRef(
(props, forwardedRef) => {
const { mode } = useSafeContext(TableContext);
const render = mode === "html" ? /* @__PURE__ */ jsx("thead", {}) : void 0;
const role = mode === "aria" ? "rowgroup" : void 0;
return /* @__PURE__ */ jsx(TableHeaderContext.Provider, { value: true, children: /* @__PURE__ */ jsx(
Role.div,
{
render,
role,
...props,
ref: forwardedRef,
className: cx("\u{1F95D}-table-header", props.className)
}
) });
}
);
const TableBody = forwardRef((props, forwardedRef) => {
const { mode } = useSafeContext(TableContext);
const render = mode === "html" ? /* @__PURE__ */ jsx("tbody", {}) : void 0;
return /* @__PURE__ */ jsx(
Role.div,
{
render,
role: void 0,
...props,
ref: forwardedRef,
className: cx("\u{1F95D}-table-body", props.className)
}
);
});
const TableRow = forwardRef((props, forwardedRef) => {
const { mode } = useSafeContext(TableContext);
const render = mode === "html" ? /* @__PURE__ */ jsx("tr", {}) : void 0;
const role = mode === "aria" ? "row" : void 0;
return /* @__PURE__ */ jsx(
Role.div,
{
render,
role,
...props,
ref: forwardedRef,
className: cx("\u{1F95D}-table-row", props.className)
}
);
});
const TableCaption = forwardRef(
(props, forwardedRef) => {
const fallbackId = React.useId();
const { id = fallbackId, ...rest } = props;
const { mode, setCaptionId } = useSafeContext(TableContext);
const render = mode === "html" ? /* @__PURE__ */ jsx("caption", {}) : void 0;
const captionIdRef = React.useCallback(
(element) => {
setCaptionId?.(element ? id : void 0);
},
[id, setCaptionId]
);
return /* @__PURE__ */ jsx(
Role.div,
{
render,
...rest,
id,
ref: useMergedRefs(forwardedRef, captionIdRef),
className: cx("\u{1F95D}-table-caption", props.className)
}
);
}
);
const TableCell = forwardRef((props, forwardedRef) => {
const isWithinTableHeader = useSafeContext(TableHeaderContext);
const { mode } = useSafeContext(TableContext);
const { render, role } = React.useMemo(() => {
if (mode === "aria") {
return { role: isWithinTableHeader ? "columnheader" : "cell" };
}
return { render: isWithinTableHeader ? /* @__PURE__ */ jsx("th", {}) : /* @__PURE__ */ jsx("td", {}) };
}, [isWithinTableHeader, mode]);
return /* @__PURE__ */ jsx(
Role.div,
{
render,
role,
...props,
ref: forwardedRef,
className: cx("\u{1F95D}-table-cell", props.className)
}
);
});
export {
TableBody as Body,
TableCaption as Caption,
TableCell as Cell,
CustomTable,
TableHeader as Header,
HtmlTable,
TableRow as Row
};