@fluentui/react
Version:
Reusable React components for building web experiences.
93 lines • 4.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Stack = void 0;
var tslib_1 = require("tslib");
/** @jsxRuntime classic */
/** @jsx withSlots */
var React = require("react");
var foundation_legacy_1 = require("@fluentui/foundation-legacy");
var react_hooks_1 = require("@fluentui/react-hooks");
var Utilities_1 = require("../../Utilities");
var Stack_styles_1 = require("./Stack.styles");
var StackItem_1 = require("./StackItem/StackItem");
var StackView = function (props) {
var _a = props.as, RootType = _a === void 0 ? 'div' : _a, _b = props.disableShrink, disableShrink = _b === void 0 ? false : _b,
// eslint-disable-next-line @typescript-eslint/no-deprecated
_c = props.doNotRenderFalsyValues,
// eslint-disable-next-line @typescript-eslint/no-deprecated
doNotRenderFalsyValues = _c === void 0 ? false : _c, _d = props.enableScopedSelectors, enableScopedSelectors = _d === void 0 ? false : _d, wrap = props.wrap, rest = tslib_1.__rest(props, ["as", "disableShrink", "doNotRenderFalsyValues", "enableScopedSelectors", "wrap"]);
(0, Utilities_1.warnDeprecations)('Stack', props, {
gap: 'tokens.childrenGap',
maxHeight: 'tokens.maxHeight',
maxWidth: 'tokens.maxWidth',
padding: 'tokens.padding',
});
var stackInnerId = (0, react_hooks_1.useId)('stack-inner');
var stackChildren = _processStackChildren(props.children, {
disableShrink: disableShrink,
enableScopedSelectors: enableScopedSelectors,
doNotRenderFalsyValues: doNotRenderFalsyValues,
});
var nativeProps = (0, Utilities_1.getNativeProps)(rest, Utilities_1.htmlElementProperties);
var Slots = (0, foundation_legacy_1.getSlots)(props, {
root: RootType,
inner: 'div',
});
if (wrap) {
return ((0, foundation_legacy_1.withSlots)(Slots.root, tslib_1.__assign({}, nativeProps),
(0, foundation_legacy_1.withSlots)(Slots.inner, { key: stackInnerId }, stackChildren)));
}
return (0, foundation_legacy_1.withSlots)(Slots.root, tslib_1.__assign({}, nativeProps), stackChildren);
};
function _processStackChildren(children, _a) {
var disableShrink = _a.disableShrink, enableScopedSelectors = _a.enableScopedSelectors, doNotRenderFalsyValues = _a.doNotRenderFalsyValues;
var childrenArray = React.Children.toArray(children);
childrenArray = React.Children.map(childrenArray, function (child) {
if (!child) {
return doNotRenderFalsyValues ? null : child;
}
// We need to allow children that aren't falsy values, but not valid elements since they could be
// a string like <Stack>{'sample string'}</Stack>
if (!React.isValidElement(child)) {
return child;
}
if (child.type === React.Fragment) {
var fragmentChild = child;
return fragmentChild.props.children
? _processStackChildren(fragmentChild.props.children, {
disableShrink: disableShrink,
enableScopedSelectors: enableScopedSelectors,
doNotRenderFalsyValues: doNotRenderFalsyValues,
})
: null;
}
var childAsReactElement = child;
var defaultItemProps = {};
if (_isStackItem(child)) {
defaultItemProps = { shrink: !disableShrink };
}
var childClassName = childAsReactElement.props.className;
return React.cloneElement(childAsReactElement, tslib_1.__assign(tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, defaultItemProps), childAsReactElement.props), (childClassName && { className: childClassName })), (enableScopedSelectors && { className: (0, Utilities_1.css)(Stack_styles_1.GlobalClassNames.child, childClassName) })));
});
return childrenArray;
}
function _isStackItem(item) {
// In theory, we should be able to just check item.type === StackItem.
// However, under certain unclear circumstances (see https://github.com/microsoft/fluentui/issues/10785),
// the object identity is different despite the function implementation being the same.
return (!!item &&
typeof item === 'object' &&
!!item.type &&
// StackItem is generated by createComponent, so we need to check its displayName instead of name
item.type.displayName === StackItem_1.StackItem.displayName);
}
var StackStatics = {
Item: StackItem_1.StackItem,
};
exports.Stack = (0, foundation_legacy_1.createComponent)(StackView, {
displayName: 'Stack',
styles: Stack_styles_1.styles,
statics: StackStatics,
});
exports.default = exports.Stack;
//# sourceMappingURL=Stack.js.map