/**
* External dependencies
*/
// eslint-disable-next-line no-restricted-imports
import type { Ref, ReactNode } from 'react';
/**
* GeChiUI dependencies
*/
import { isValidElement } from '@gechiui/element';
/**
* Internal dependencies
*/
import { getValidChildren } from '../ui/utils/get-valid-children';
import { contextConnect, useContextSystem } from '../ui/context';
import type { GeChiUIComponentProps } from '../ui/context';
import { ZStackView, ZStackChildView } from './styles';
export interface ZStackProps {
/**
* Layers children elements on top of each other (first: highest z-index, last: lowest z-index).
*
* @default true
*/
isLayered?: boolean;
/**
* Reverse the layer ordering (first: lowest z-index, last: highest z-index).
*
* @default false
*/
isReversed?: boolean;
/**
* The amount of offset between each child element.
*
* @default 0
*/
offset?: number;
/**
* Child elements.
*/
children: ReactNode;
}
function ZStack(
props: GeChiUIComponentProps< ZStackProps, 'div' >,
forwardedRef: Ref< any >
) {
const {
children,
className,
isLayered = true,
isReversed = false,
offset = 0,
...otherProps
} = useContextSystem( props, 'ZStack' );
const validChildren = getValidChildren( children );
const childrenLastIndex = validChildren.length - 1;
const clonedChildren = validChildren.map( ( child, index ) => {
const zIndex = isReversed ? childrenLastIndex - index : index;
const offsetAmount = offset * index;
const key = isValidElement( child ) ? child.key : index;
return (
{ child }
);
} );
return (
{ clonedChildren }
);
}
export default contextConnect( ZStack, 'ZStack' );