@primer/react
Version:
An implementation of GitHub's Primer Design System using React
320 lines (319 loc) • 11 kB
JavaScript
import { useId as useId$1 } from "../hooks/useId.js";
import { invariant } from "../utils/invariant.js";
import { useSlots } from "../hooks/useSlots.js";
import { ListContext } from "./shared.js";
import ActionList_module_css_default from "./ActionList.module.css.js";
import { useFeatureFlag } from "../FeatureFlags/useFeatureFlag.js";
import Group_module_css_default from "./Group.module.css.js";
import { GroupHeadingTrailingAction } from "./GroupHeadingTrailingAction.js";
import { GroupContext } from "./GroupContext.js";
import { c } from "react-compiler-runtime";
import { clsx } from "clsx";
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
import React from "react";
//#region src/ActionList/Group.tsx
const GROUP_HEADING_TRAILING_ACTION_FEATURE_FLAG = "primer_react_action_list_group_heading_trailing_action";
const Heading = (t0) => {
const $ = c(12);
let children;
let className;
let id;
let rest;
let t1;
if ($[0] !== t0) {
({as: t1, className, children, id, ...rest} = t0);
$[0] = t0;
$[1] = children;
$[2] = className;
$[3] = id;
$[4] = rest;
$[5] = t1;
} else {
children = $[1];
className = $[2];
id = $[3];
rest = $[4];
t1 = $[5];
}
const Component = t1 === void 0 ? "h3" : t1;
let t2;
if ($[6] !== Component || $[7] !== children || $[8] !== className || $[9] !== id || $[10] !== rest) {
t2 = /*#__PURE__*/ jsx(Component, {
className,
id,
...rest,
children
});
$[6] = Component;
$[7] = children;
$[8] = className;
$[9] = id;
$[10] = rest;
$[11] = t2;
} else t2 = $[11];
return t2;
};
const HeadingWrap = ({ as = "div", children, className, ...rest }) => {
return /*#__PURE__*/ React.createElement(as, {
...rest,
className
}, children);
};
const Group = (t0) => {
var _ariaLabel, _title, _slots$groupHeading;
const $ = c(38);
let ariaLabel;
let auxiliaryText;
let className;
let props;
let role;
let selectionVariant;
let t1;
let title;
if ($[0] !== t0) {
({title, variant: t1, auxiliaryText, selectionVariant, role, className, "aria-label": ariaLabel, ...props} = t0);
$[0] = t0;
$[1] = ariaLabel;
$[2] = auxiliaryText;
$[3] = className;
$[4] = props;
$[5] = role;
$[6] = selectionVariant;
$[7] = t1;
$[8] = title;
} else {
ariaLabel = $[1];
auxiliaryText = $[2];
className = $[3];
props = $[4];
role = $[5];
selectionVariant = $[6];
t1 = $[7];
title = $[8];
}
const variant = t1 === void 0 ? "subtle" : t1;
const id = useId$1();
const { role: listRole } = React.useContext(ListContext);
let t2;
if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
t2 = { groupHeading: GroupHeading };
$[9] = t2;
} else t2 = $[9];
const [slots, childrenWithoutSlots] = useSlots(props.children, t2);
let groupHeadingId = void 0;
if (slots.groupHeading) {
var _slots$groupHeading$p;
groupHeadingId = (_slots$groupHeading$p = slots.groupHeading.props.id) !== null && _slots$groupHeading$p !== void 0 ? _slots$groupHeading$p : id;
}
if (title) groupHeadingId = id;
let t3;
if ($[10] !== className) {
t3 = clsx(className, Group_module_css_default.Group);
$[10] = className;
$[11] = t3;
} else t3 = $[11];
const t4 = listRole ? "none" : void 0;
let t5;
if ($[12] !== groupHeadingId || $[13] !== selectionVariant) {
t5 = {
selectionVariant,
groupHeadingId
};
$[12] = groupHeadingId;
$[13] = selectionVariant;
$[14] = t5;
} else t5 = $[14];
let t6;
if ($[15] !== auxiliaryText || $[16] !== slots.groupHeading || $[17] !== title || $[18] !== variant) {
t6 = title && !slots.groupHeading ? /*#__PURE__*/ jsx(GroupHeading, {
variant,
auxiliaryText,
_internalBackwardCompatibleTitle: title
}) : null;
$[15] = auxiliaryText;
$[16] = slots.groupHeading;
$[17] = title;
$[18] = variant;
$[19] = t6;
} else t6 = $[19];
let t7;
if ($[20] !== slots.groupHeading || $[21] !== title) {
t7 = !title && slots.groupHeading ? /*#__PURE__*/ React.cloneElement(slots.groupHeading) : null;
$[20] = slots.groupHeading;
$[21] = title;
$[22] = t7;
} else t7 = $[22];
const t8 = listRole ? void 0 : groupHeadingId;
const t9 = (_ariaLabel = ariaLabel) !== null && _ariaLabel !== void 0 ? _ariaLabel : listRole ? (_title = title) !== null && _title !== void 0 ? _title : (_slots$groupHeading = slots.groupHeading) === null || _slots$groupHeading === void 0 ? void 0 : _slots$groupHeading.props.children : void 0;
const t10 = role || listRole && "group";
const t11 = slots.groupHeading ? childrenWithoutSlots : props.children;
let t12;
if ($[23] !== t10 || $[24] !== t11 || $[25] !== t8 || $[26] !== t9) {
t12 = /*#__PURE__*/ jsx("ul", {
"aria-labelledby": t8,
"aria-label": t9,
role: t10,
className: Group_module_css_default.GroupList,
children: t11
});
$[23] = t10;
$[24] = t11;
$[25] = t8;
$[26] = t9;
$[27] = t12;
} else t12 = $[27];
let t13;
if ($[28] !== t12 || $[29] !== t5 || $[30] !== t6 || $[31] !== t7) {
t13 = /*#__PURE__*/ jsxs(GroupContext.Provider, {
value: t5,
children: [
t6,
t7,
t12
]
});
$[28] = t12;
$[29] = t5;
$[30] = t6;
$[31] = t7;
$[32] = t13;
} else t13 = $[32];
let t14;
if ($[33] !== props || $[34] !== t13 || $[35] !== t3 || $[36] !== t4) {
t14 = /*#__PURE__*/ jsx("li", {
className: t3,
"data-component": "ActionList.Group",
role: t4,
...props,
children: t13
});
$[33] = props;
$[34] = t13;
$[35] = t3;
$[36] = t4;
$[37] = t14;
} else t14 = $[37];
return t14;
};
/**
* Heading of a `Group`.
*
* As default, the role of ActionList is "list" and therefore group heading is rendered as a proper heading tag.
* If the role is "listbox" or "menu" (ActionMenu), the group heading is rendered as a div with presentation role and it is
* hidden from the accessibility tree due to the limitation of listbox children. https://w3c.github.io/aria/#listbox
* groups under menu or listbox are labelled by `aria-label`
*/
const GroupHeadingImpl = (t0) => {
const $ = c(22);
let _internalBackwardCompatibleTitle;
let as;
let auxiliaryText;
let children;
let className;
let props;
let t1;
let t2;
if ($[0] !== t0) {
({as, variant: t1, _internalBackwardCompatibleTitle, auxiliaryText, children, className, headingWrapElement: t2, ...props} = t0);
$[0] = t0;
$[1] = _internalBackwardCompatibleTitle;
$[2] = as;
$[3] = auxiliaryText;
$[4] = children;
$[5] = className;
$[6] = props;
$[7] = t1;
$[8] = t2;
} else {
_internalBackwardCompatibleTitle = $[1];
as = $[2];
auxiliaryText = $[3];
children = $[4];
className = $[5];
props = $[6];
t1 = $[7];
t2 = $[8];
}
const variant = t1 === void 0 ? "subtle" : t1;
const headingWrapElement = t2 === void 0 ? "div" : t2;
const { role: listRole } = React.useContext(ListContext);
const { groupHeadingId } = React.useContext(GroupContext);
const trailingActionEnabled = useFeatureFlag(GROUP_HEADING_TRAILING_ACTION_FEATURE_FLAG);
let t3;
if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
t3 = { trailingAction: GroupHeadingTrailingAction };
$[9] = t3;
} else t3 = $[9];
const [slots, childrenWithoutSlots] = useSlots(children, t3);
const trailingAction = trailingActionEnabled ? slots.trailingAction : null;
const headingChildren = trailingActionEnabled ? childrenWithoutSlots : children;
if (trailingAction) !(listRole === void 0 || listRole === "list") && invariant(false, `ActionList.GroupHeading.TrailingAction can not be used inside an ActionList with an ARIA role of "${listRole}". Trailing actions on group headings are only supported in lists with the default "list" role.`);
const missingAsForList = (listRole === void 0 || listRole === "list") && children !== void 0 && as === void 0;
const unnecessaryAsForListboxOrMenu = listRole !== void 0 && listRole !== "list" && children !== void 0 && as !== void 0;
missingAsForList && invariant(false, "You are setting a heading for a list, that requires a heading level. Please use 'as' prop to set a proper heading level.");
unnecessaryAsForListboxOrMenu && invariant(false, `Looks like you are trying to set a heading level to a ${listRole} role. Group headings for ${listRole} type action lists are for representational purposes, and rendered as divs. Therefore they don't need a heading level.`);
let t4;
if ($[10] !== _internalBackwardCompatibleTitle || $[11] !== as || $[12] !== auxiliaryText || $[13] !== className || $[14] !== groupHeadingId || $[15] !== headingChildren || $[16] !== headingWrapElement || $[17] !== listRole || $[18] !== props || $[19] !== trailingAction || $[20] !== variant) {
var _internalBackwardComp, _internalBackwardComp2;
t4 = /*#__PURE__*/ jsx(Fragment, { children: listRole && listRole !== "list" ? /*#__PURE__*/ jsxs(HeadingWrap, {
role: "presentation",
className: Group_module_css_default.GroupHeadingWrap,
"aria-hidden": "true",
"data-variant": variant,
"data-component": "GroupHeadingWrap",
as: headingWrapElement,
...props,
children: [/*#__PURE__*/ jsx("span", {
className: clsx(className, Group_module_css_default.GroupHeading),
id: groupHeadingId,
children: (_internalBackwardComp = _internalBackwardCompatibleTitle) !== null && _internalBackwardComp !== void 0 ? _internalBackwardComp : headingChildren
}), auxiliaryText && /*#__PURE__*/ jsx("div", {
className: ActionList_module_css_default.Description,
children: auxiliaryText
})]
}) : /*#__PURE__*/ jsxs(HeadingWrap, {
className: Group_module_css_default.GroupHeadingWrap,
"data-variant": variant,
"data-has-trailing-action": trailingAction ? "" : void 0,
as: headingWrapElement,
"data-component": "GroupHeadingWrap",
children: [
/*#__PURE__*/ jsx(Heading, {
className: clsx(className, Group_module_css_default.GroupHeading),
as: as || "h3",
id: groupHeadingId,
...props,
children: (_internalBackwardComp2 = _internalBackwardCompatibleTitle) !== null && _internalBackwardComp2 !== void 0 ? _internalBackwardComp2 : headingChildren
}),
auxiliaryText && /*#__PURE__*/ jsx("div", {
className: ActionList_module_css_default.Description,
children: auxiliaryText
}),
trailingAction ? /*#__PURE__*/ jsx("span", {
className: Group_module_css_default.GroupHeadingTrailingAction,
children: trailingAction
}) : null
]
}) });
$[10] = _internalBackwardCompatibleTitle;
$[11] = as;
$[12] = auxiliaryText;
$[13] = className;
$[14] = groupHeadingId;
$[15] = headingChildren;
$[16] = headingWrapElement;
$[17] = listRole;
$[18] = props;
$[19] = trailingAction;
$[20] = variant;
$[21] = t4;
} else t4 = $[21];
return t4;
};
GroupHeadingImpl.displayName = "ActionList.GroupHeading";
Group.displayName = "ActionList.Group";
Group.__SLOT__ = Symbol("ActionList.Group");
GroupHeadingImpl.__SLOT__ = Symbol("ActionList.GroupHeading");
const GroupHeading = Object.assign(GroupHeadingImpl, { TrailingAction: GroupHeadingTrailingAction });
//#endregion
export { Group, GroupHeading };