Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions package/src/lib/SpotlightTour.provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ export interface SpotlightTourProviderProps extends TooltipProps {
* argument.
*/
children: ChildFn<SpotlightTour> | React.ReactNode;
/**
* Additional y position around the spotlight target point to account for
* UI elements like status bars or navigation bars, especially when using
* translucent or edge-to-edge modes. This creates extra space between the
* target element and the spotlight mask.
*
* @default 0
*/
maskOffset?: number;
/**
* Sets the default transition motion for all steps. You can override this
* value on each step too.
Expand Down Expand Up @@ -107,6 +116,15 @@ export interface SpotlightTourProviderProps extends TooltipProps {
* An array of `TourStep` objects that define each step of the tour.
*/
steps: TourStep[];
/**
* Android only: Enable translucent status and navigation bars to allow the
* tour overlay to extend behind system bars. Uses react-native-edge-to-edge
* internally to handle the translucent bars setup.
*
* @platform android
* @default false
*/
translucent?: boolean;
}

/**
Expand All @@ -117,6 +135,7 @@ export const SpotlightTourProvider = forwardRef<SpotlightTour, SpotlightTourProv
arrow,
children,
flip,
maskOffset = 0,
motion = "bounce",
nativeDriver = true,
offset,
Expand All @@ -130,6 +149,7 @@ export const SpotlightTourProvider = forwardRef<SpotlightTour, SpotlightTourProv
shape = "circle",
shift,
steps,
translucent,
} = props;

const [current, setCurrent] = useState<number>();
Expand Down Expand Up @@ -271,6 +291,7 @@ export const SpotlightTourProvider = forwardRef<SpotlightTour, SpotlightTourProv
backdropOpacity={overlayOpacity}
color={overlayColor}
current={current}
maskOffset={maskOffset}
motion={motion}
nativeDriver={nativeDriver}
onBackdropPress={onBackdropPress}
Expand All @@ -283,6 +304,7 @@ export const SpotlightTourProvider = forwardRef<SpotlightTour, SpotlightTourProv
offset={offset}
placement={placement}
shift={shift}
translucent={translucent}
/>
</SpotlightTourContext.Provider>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,32 +57,41 @@ interface TourOverlayProps extends ToOptional<TooltipProps> {
backdropOpacity: number;
color: ColorValue;
current: Optional<number>;
maskOffset?: number;
motion: Motion;
nativeDriver: boolean | OSConfig<boolean>;
onBackdropPress: Optional<BackdropPressBehavior>;
shape: Shape | ShapeOptions;
spot: LayoutRectangle;
tourStep: TourStep;
translucent?: boolean;
}

export const TourOverlay = forwardRef<TourOverlayRef, TourOverlayProps>((props, ref) => {
const {
backdropOpacity,
color,
current,
maskOffset = 0,
motion,
nativeDriver,
onBackdropPress,
shape,
spot,
spot: defaultSpot,
tourStep,
translucent,
...tooltipProps
} = props;

const { goTo, next, pause, previous, resume, start, steps, stop } = useContext(SpotlightTourContext);

const arrowRef = useRef<View>(null);

const spot = useMemo((): LayoutRectangle => ({
...defaultSpot,
...(translucent && { y: defaultSpot.y + maskOffset }),
}), [defaultSpot, translucent, maskOffset]);

const floating = useMemo((): TooltipProps => ({
arrow: tourStep.arrow ?? tooltipProps.arrow,
flip: tourStep.flip ?? tooltipProps.flip,
Expand Down