105 lines
3.8 KiB
JavaScript
105 lines
3.8 KiB
JavaScript
'use client';
|
|
import { makeStyles, mergeClasses } from '@griffel/react';
|
|
import { tokens } from '@fluentui/react-theme';
|
|
export const carouselNavContainerClassNames = {
|
|
root: 'fui-CarouselNavContainer',
|
|
next: 'fui-CarouselNavContainer__next',
|
|
prev: 'fui-CarouselNavContainer__prev',
|
|
autoplay: 'fui-CarouselNavContainer__autoplay',
|
|
/* Tooltip classNames are listed for type compatibility only (cannot assign root className to portal)
|
|
* Use 'content' slot to style Tooltip content instead
|
|
*/ nextTooltip: 'fui-CarouselNavContainer__nextTooltip',
|
|
prevTooltip: 'fui-CarouselNavContainer__prevTooltip',
|
|
autoplayTooltip: 'fui-CarouselNavContainer__autoplayTooltip'
|
|
};
|
|
/**
|
|
* Styles for the root slot
|
|
*/ const useStyles = makeStyles({
|
|
root: {
|
|
display: 'flex',
|
|
flexDirection: 'row',
|
|
justifyContent: 'center',
|
|
width: '100%',
|
|
pointerEvents: 'none'
|
|
},
|
|
next: {},
|
|
prev: {},
|
|
autoplay: {},
|
|
inline: {
|
|
marginTop: tokens.spacingVerticalM
|
|
},
|
|
overlay: {
|
|
position: 'absolute',
|
|
bottom: tokens.spacingVerticalM,
|
|
boxSizing: 'border-box'
|
|
},
|
|
overlayWide: {
|
|
bottom: tokens.spacingVerticalM
|
|
},
|
|
nextWide: {
|
|
marginLeft: 'auto'
|
|
},
|
|
prevWide: {
|
|
marginRight: 'auto'
|
|
},
|
|
nextOverlayWide: {
|
|
marginRight: tokens.spacingHorizontalM
|
|
},
|
|
prevOverlayWide: {
|
|
marginLeft: tokens.spacingHorizontalM
|
|
},
|
|
autoplayOverlayWide: {
|
|
marginLeft: tokens.spacingHorizontalM
|
|
},
|
|
expanded: {
|
|
width: '100%',
|
|
height: '100%',
|
|
alignItems: 'flex-end',
|
|
justifyContent: 'center',
|
|
bottom: 0,
|
|
'> div': {
|
|
position: 'relative',
|
|
bottom: tokens.spacingVerticalL,
|
|
marginBottom: 0
|
|
}
|
|
},
|
|
nextOverlayExpanded: {
|
|
position: 'absolute',
|
|
right: tokens.spacingHorizontalM,
|
|
top: '50%',
|
|
transform: 'translateY(-50%)'
|
|
},
|
|
prevOverlayExpanded: {
|
|
position: 'absolute',
|
|
left: tokens.spacingHorizontalM,
|
|
top: '50%',
|
|
transform: 'translateY(-50%)'
|
|
},
|
|
autoplayExpanded: {
|
|
position: 'absolute',
|
|
bottom: `-${tokens.spacingHorizontalXS}`,
|
|
left: tokens.spacingHorizontalM,
|
|
marginBottom: tokens.spacingVerticalM
|
|
}
|
|
});
|
|
/**
|
|
* Apply styling to the CarouselNavContainer slots based on the state
|
|
*/ export const useCarouselNavContainerStyles_unstable = (state)=>{
|
|
'use no memo';
|
|
const { layout } = state;
|
|
const isOverlay = layout === 'overlay' || layout === 'overlay-wide' || layout === 'overlay-expanded';
|
|
const isWide = layout === 'inline-wide' || layout === 'overlay-wide';
|
|
const styles = useStyles();
|
|
state.root.className = mergeClasses(carouselNavContainerClassNames.root, styles.root, isOverlay ? styles.overlay : styles.inline, isOverlay && isWide && styles.overlayWide, layout === 'overlay-expanded' && styles.expanded, state.root.className);
|
|
if (state.next) {
|
|
state.next.className = mergeClasses(carouselNavContainerClassNames.next, styles.next, isWide && styles.nextWide, isWide && isOverlay && styles.nextOverlayWide, layout === 'overlay-expanded' && styles.nextOverlayExpanded, state.next.className);
|
|
}
|
|
if (state.prev) {
|
|
state.prev.className = mergeClasses(carouselNavContainerClassNames.prev, styles.prev, isWide && styles.prevWide, !state.autoplay && isWide && isOverlay && styles.prevOverlayWide, layout === 'overlay-expanded' && styles.prevOverlayExpanded, state.prev.className);
|
|
}
|
|
if (state.autoplay) {
|
|
state.autoplay.className = mergeClasses(carouselNavContainerClassNames.autoplay, styles.autoplay, layout === 'overlay-expanded' && styles.autoplayExpanded, isWide && isOverlay && styles.autoplayOverlayWide, state.autoplay.className);
|
|
}
|
|
return state;
|
|
};
|