UNPKG

@carbon/react

Version:

React components for the Carbon Design System

77 lines (75 loc) 2.16 kB
/** * 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 };