@egjs/flicking
Version:
Everyday 30 million people experience. It's reliable, flexible and extendable carousel.
325 lines (324 loc) • 11.1 kB
TypeScript
import { ORDER } from "../constants/values";
import AnchorPoint from "../core/AnchorPoint";
import Panel from "../core/panel/Panel";
import Flicking, { FlickingOptions } from "../Flicking";
import { ValueOf } from "../types/internal";
import { CameraMode } from "./mode";
export interface CameraOptions {
align: FlickingOptions["align"];
}
/**
* A range with minimum and maximum values
*/
export interface CameraRange {
/** A minimum position */
min: number;
/** A maximum position */
max: number;
}
/**
* A component that manages actual movement inside the viewport
* @public
*/
declare class Camera {
private _align;
private _flicking;
private _mode;
private _el;
private _transform;
private _lookedOffset;
private _position;
private _alignPos;
private _offset;
private _circularOffset;
private _circularEnabled;
private _range;
private _visiblePanels;
private _anchors;
private _needPanelTriggered;
private _panelOrder;
/**
* The camera element(`.flicking-camera`)
* @readonly
*/
get element(): HTMLElement;
/**
* An array of the child elements of the camera element(`.flicking-camera`)
* @readonly
*/
get children(): HTMLElement[];
/**
* Current position of the camera
* @readonly
*/
get position(): number;
/**
* Align position inside the viewport where {@link Panel}'s {@link Panel.alignPosition | alignPosition} should be located at
* @readonly
*/
get alignPosition(): number;
/**
* Position offset, used for the {@link Flicking.renderOnlyVisible | renderOnlyVisible} option
* @defaultValue 0
* @readonly
*/
get offset(): number;
/**
* Whether the `circular` option is enabled.
* @remarks
* The {@link Flicking.circular | circular} option can't be enabled when sum of the panel sizes are too small.
* @defaultValue false
* @readonly
*/
get circularEnabled(): boolean;
/**
* A current camera mode
* @readonly
*/
get mode(): CameraMode;
/**
* A range that Camera's {@link Camera.position | position} can reach
* @readonly
*/
get range(): CameraRange;
/**
* A difference between Camera's minimum and maximum position that can reach
* @readonly
*/
get rangeDiff(): number;
/**
* An array of visible panels from the current position
* @readonly
*/
get visiblePanels(): Panel[];
/**
* A range of the visible area from the current position
* @readonly
*/
get visibleRange(): CameraRange;
/**
* An array of {@link AnchorPoint}s that Camera can be stopped at
* @readonly
*/
get anchorPoints(): AnchorPoint[];
/**
* A current parameters of the Camera for updating {@link AxesController}
* @readonly
*/
get controlParams(): {
range: CameraRange;
position: number;
circular: boolean;
};
/**
* A Boolean value indicating whether Camera's over the minimum or maximum position reachable
* @readonly
*/
get atEdge(): boolean;
/**
* Return the size of the viewport
* @readonly
*/
get size(): number;
/**
* Return the camera's position progress from the first panel to last panel
* @remarks
* Range is from 0 to last panel's index
* @readonly
*/
get progress(): number;
/**
* {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element(`.flicking-camera`)
* @readonly
*/
get panelOrder(): ValueOf<typeof ORDER>;
/**
* A value indicating where the {@link Camera.alignPosition | alignPosition} should be located at inside the viewport element
*/
get align(): FlickingOptions["align"];
set align(val: FlickingOptions["align"]);
/**
* Creates a new Camera instance
* @param flicking - An instance of {@link Flicking}
* @param options - Options for the Camera
*/
constructor(flicking: Flicking, { align }?: Partial<CameraOptions>);
/**
* Initialize Camera
* @remarks
* This method is called automatically during {@link Flicking.init}. It finds the camera element inside the viewport.
* @throws {@link InitializationErrors}
* @returns The current instance for method chaining
*/
init(): this;
/**
* Destroy Camera and return to initial state
* @remarks
* This method resets all internal values to their initial state.
* @returns The current instance for method chaining
*/
destroy(): this;
/**
* Move to the given position and apply CSS transform
* @remarks
* This method updates the camera position, toggles panels for circular mode, and refreshes visible panels.
* @param pos - A new position
* @throws {@link InitializationErrors}
*/
lookAt(pos: number): void;
/**
* Return a previous {@link AnchorPoint} of given {@link AnchorPoint}
* @remarks
* If it does not exist, return `null` instead
* @param anchor - A reference {@link AnchorPoint}
* @returns The previous {@link AnchorPoint}
*/
getPrevAnchor(anchor: AnchorPoint): AnchorPoint | null;
/**
* Return a next {@link AnchorPoint} of given {@link AnchorPoint}
* @remarks
* If it does not exist, return `null` instead
* @param anchor - A reference {@link AnchorPoint}
* @returns The next {@link AnchorPoint}
*/
getNextAnchor(anchor: AnchorPoint): AnchorPoint | null;
/**
* Return the camera's position progress in the panel below
* @remarks
* Value is from 0 to 1 when the camera's inside panel.
* Value can be lower than 0 or bigger than 1 when it's in the margin area
* @param panel - A panel to check
* @returns Progress value from 0 to 1 (or outside this range when in margin area)
*/
getProgressInPanel(panel: Panel): number;
/**
* Return {@link AnchorPoint} that includes given position
* @remarks
* If there's no {@link AnchorPoint} that includes the given position, return `null` instead
* @param position - A position to check
* @returns The {@link AnchorPoint} that includes the given position
*/
findAnchorIncludePosition(position: number): AnchorPoint | null;
/**
* Return {@link AnchorPoint} nearest to given position
* @remarks
* If there're no {@link AnchorPoint}s, return `null` instead
* @param position - A position to check
* @returns The {@link AnchorPoint} nearest to the given position
*/
findNearestAnchor(position: number): AnchorPoint | null;
/**
* Return {@link AnchorPoint} that matches {@link Flicking.currentPanel}
* @returns The {@link AnchorPoint} that matches current panel
*/
findActiveAnchor(): AnchorPoint | null;
/**
* Clamp the given position between camera's range
* @param position - A position to clamp
* @returns A clamped position
*/
clampToReachablePosition(position: number): number;
/**
* Check whether the given panel is inside of the Camera's range
* @param panel - An instance of {@link Panel} to check
* @returns Whether the panel's inside Camera's range
*/
canReach(panel: Panel): boolean;
/**
* Check whether the given panel element is visible at the current position
* @param panel - An instance of {@link Panel} to check
* @returns Whether the panel element is visible at the current position
*/
canSee(panel: Panel): boolean;
/**
* Update {@link Camera.range | range} of Camera
* @remarks
* This method recalculates the camera range based on the current panel positions and circular mode settings.
* @throws {@link InitializationErrors}
* @returns The current instance for method chaining
*/
updateRange(): this;
/**
* Update Camera's {@link Camera.alignPosition | alignPosition}
* @returns The current instance for method chaining
*/
updateAlignPos(): this;
/**
* Update Camera's {@link Camera.anchorPoints | anchorPoints}
* @remarks
* Anchor points are positions where the camera can stop. This method recalculates them based on the current mode.
* @throws {@link InitializationErrors}
* @returns The current instance for method chaining
*/
updateAnchors(): this;
/**
* Update Viewport's height to visible panel's max height
* @remarks
* This method only takes effect when {@link FlickingOptions.horizontal | horizontal} is `true` and {@link FlickingOptions.adaptive | adaptive} is enabled.
* @throws {@link InitializationErrors}
*/
updateAdaptiveHeight(): void;
/**
* Update current offset of the camera
* @returns The current instance for method chaining
*/
updateOffset(): this;
/**
* Update direction to match the {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element
* @returns The current instance for method chaining
*/
updatePanelOrder(): this;
/**
* Reset the history of {@link Flicking.event:needPanel | needPanel} events so it can be triggered again
* @returns The current instance for method chaining
*/
resetNeedPanelHistory(): this;
/**
* Apply "transform" style with the current position to camera element
* @returns The current instance for method chaining
*/
applyTransform(): this;
/**
* @internal
* @privateRemarks
* Resets all internal state values to their defaults. Called during construction and destruction.
*/
private _resetInternalValues;
/**
* @internal
* @privateRemarks
* Updates the list of visible panels and triggers {@link VisibleChangeEvent} if panels were added or removed.
*/
private _refreshVisiblePanels;
/**
* @internal
* @privateRemarks
* Checks if the camera is near the edges and triggers {@link NeedPanelEvent} for infinite scrolling implementations.
*/
private _checkNeedPanel;
/**
* @internal
* @privateRemarks
* Checks if the camera has reached the edge of the range and triggers {@link ReachEdgeEvent}.
*/
private _checkReachEnd;
/**
* @internal
* @privateRemarks
* Checks for CSS transform support and stores the vendor-prefixed property name. Throws if transforms are not supported.
*/
private _checkTranslateSupport;
/**
* @internal
* @privateRemarks
* Updates the camera mode based on {@link FlickingOptions.circular | circular} and {@link FlickingOptions.bound | bound} options.
*/
private _updateMode;
/**
* @internal
* @privateRemarks
* Toggles panel positions for circular mode. Returns true if any panel was toggled.
*/
private _togglePanels;
}
export default Camera;