@carbon/react
Version:
React components for the Carbon Design System
77 lines (75 loc) • 2.16 kB
JavaScript
/**
* Copyright IBM Corp. 2016, 2026
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
import { TextDirectionContext } from "./TextDirectionContext.js";
import { Children, forwardRef, useContext } from "react";
import PropTypes from "prop-types";
import { jsx } from "react/jsx-runtime";
//#region src/components/Text/Text.tsx
/**
* Copyright IBM Corp. 2016, 2026
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
const Text = forwardRef(({ as, children, dir = "auto", ...rest }, ref) => {
const context = useContext(TextDirectionContext);
const textProps = {};
const BaseComponent = as ?? "span";
const value = { ...context };
if (!context) {
textProps.dir = dir;
value.direction = dir;
} else {
const { direction: parentDirection, getTextDirection } = context;
if (getTextDirection && getTextDirection.current) {
const text = getTextFromChildren(children);
const override = getTextDirection.current(text);
if (parentDirection !== override) {
textProps.dir = override;
value.direction = override;
} else if (parentDirection === "auto") textProps.dir = override;
} else if (parentDirection !== dir) {
textProps.dir = dir;
value.direction = dir;
} else if (parentDirection === "auto") textProps.dir = dir;
}
return /* @__PURE__ */ jsx(TextDirectionContext.Provider, {
value,
children: /* @__PURE__ */ jsx(BaseComponent, {
ref,
...rest,
...textProps,
children
})
});
});
Text.propTypes = {
as: PropTypes.oneOfType([
PropTypes.func,
PropTypes.string,
PropTypes.elementType
]),
children: PropTypes.node,
dir: PropTypes.oneOf([
"ltr",
"rtl",
"auto"
])
};
const getTextFromChildren = (children) => {
if (typeof children === "string") return children;
const text = Children.map(children, (child) => {
if (typeof child === "string") return child;
return null;
})?.filter((text) => {
return text !== null;
});
if (text?.length === 1) return text[0];
return text;
};
//#endregion
export { Text };