page-flip
Version:
Powerful, simple and flexible JS Library for creating realistic and beautiful page turning effect
122 lines (100 loc) • 3.72 kB
text/typescript
/**
* Book size calculation type
*/
export const enum SizeType {
/** Dimensions are fixed */
FIXED = 'fixed',
/** Dimensions are calculated based on the parent element */
STRETCH = 'stretch',
}
/**
* Configuration object
*/
export interface FlipSetting {
/** Page number from which to start viewing */
startPage: number;
/** Whether the book will be stretched under the parent element or not */
size: SizeType;
width: number;
height: number;
minWidth: number;
maxWidth: number;
minHeight: number;
maxHeight: number;
/** Draw shadows or not when page flipping */
drawShadow: boolean;
/** Flipping animation time */
flippingTime: number;
/** Enable switching to portrait mode */
usePortrait: boolean;
/** Initial value to z-index */
startZIndex: number;
/** If this value is true, the parent element will be equal to the size of the book */
autoSize: boolean;
/** Shadow intensity (1: max intensity, 0: hidden shadows) */
maxShadowOpacity: number;
/** If this value is true, the first and the last pages will be marked as hard and will be shown in single page mode */
showCover: boolean;
/** Disable content scrolling when touching a book on mobile devices */
mobileScrollSupport: boolean;
/** Set the forward event of clicking on child elements (buttons, links) */
clickEventForward: boolean;
/** Using mouse and touch events to page flipping */
useMouseEvents: boolean;
swipeDistance: number;
/** if this value is true, fold the corners of the book when the mouse pointer is over them. */
showPageCorners: boolean;
/** if this value is true, flipping by clicking on the whole book will be locked. Only on corners */
disableFlipByClick: boolean;
}
export class Settings {
private _default: FlipSetting = {
startPage: 0,
size: SizeType.FIXED,
width: 0,
height: 0,
minWidth: 0,
maxWidth: 0,
minHeight: 0,
maxHeight: 0,
drawShadow: true,
flippingTime: 1000,
usePortrait: true,
startZIndex: 0,
autoSize: true,
maxShadowOpacity: 1,
showCover: false,
mobileScrollSupport: true,
swipeDistance: 30,
clickEventForward: true,
useMouseEvents: true,
showPageCorners: true,
disableFlipByClick: false,
};
/**
* Processing parameters received from the user. Substitution default values
*
* @param userSetting
* @returns {FlipSetting} Сonfiguration object
*/
public getSettings(userSetting: Record<string, number | string | boolean>): FlipSetting {
const result = this._default;
Object.assign(result, userSetting);
if (result.size !== SizeType.STRETCH && result.size !== SizeType.FIXED)
throw new Error('Invalid size type. Available only "fixed" and "stretch" value');
if (result.width <= 0 || result.height <= 0) throw new Error('Invalid width or height');
if (result.flippingTime <= 0) throw new Error('Invalid flipping time');
if (result.size === SizeType.STRETCH) {
if (result.minWidth <= 0) result.minWidth = 100;
if (result.maxWidth < result.minWidth) result.maxWidth = 2000;
if (result.minHeight <= 0) result.minHeight = 100;
if (result.maxHeight < result.minHeight) result.maxHeight = 2000;
} else {
result.minWidth = result.width;
result.maxWidth = result.width;
result.minHeight = result.height;
result.maxHeight = result.height;
}
return result;
}
}