src/mixins/position/index.js
- /* leny/koutla-swiss
- *
- * ~/mixins/position/index.js - Position mixins
- *
- * coded by leny@flatLand!
- * started at 13/01/2018
- */
-
- export const POSITION_STATIC = "static";
- export const POSITION_RELATIVE = "relative";
- export const POSITION_ABSOLUTE = "absolute";
- export const POSITION_STICKY = "sticky";
- export const POSITION_FIXED = "fixed";
-
- /**
- * Mixin to generate a positionned box
- * @abstract
- * @param {string} type position name
- * @param {...string} args values for top, right, bottom, left - treated like for margin or padding properties
- * @return {object} `{position: "...", top: "...", right: "...", bottom: "...", left: "..."}`
- */
- export const position = (type, ...args) => {
- if (
- ![
- POSITION_STATIC,
- POSITION_RELATIVE,
- POSITION_ABSOLUTE,
- POSITION_FIXED,
- POSITION_STICKY,
- ].includes(type)
- ) {
- throw new TypeError("Invalid position type");
- }
-
- let oPosition = {
- position: type,
- },
- aPositionArgs;
-
- if (!args.length) {
- return oPosition;
- }
-
- // check object type, cf. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#Description
- if (args[0] === Object(args[0])) {
- return {
- ...oPosition,
- ...args[0],
- };
- }
-
- aPositionArgs = args.map(mValue => `${mValue}`);
-
- switch (aPositionArgs.length) {
- case 0:
- return oPosition;
- case 1:
- return {
- ...oPosition,
- top: aPositionArgs[0],
- right: aPositionArgs[0],
- bottom: aPositionArgs[0],
- left: aPositionArgs[0],
- };
- case 2:
- return {
- ...oPosition,
- top: aPositionArgs[0],
- right: aPositionArgs[1],
- bottom: aPositionArgs[0],
- left: aPositionArgs[1],
- };
- case 3:
- return {
- ...oPosition,
- top: aPositionArgs[0],
- right: aPositionArgs[1],
- bottom: aPositionArgs[2],
- left: aPositionArgs[1],
- };
- case 4:
- return {
- ...oPosition,
- top: aPositionArgs[0],
- right: aPositionArgs[1],
- bottom: aPositionArgs[2],
- left: aPositionArgs[3],
- };
- default:
- throw new TypeError("Invalid argument amount");
- }
- };
-
- /**
- * Mixin to generate a relative positionned box
- * @abstract
- * @param {...string} args values for top, right, bottom, left - treated like for margin or padding properties
- * @return {object} `{position: "relative", top: "...", right: "...", bottom: "...", left: "..."}`
- */
- export const relative = (...args) => position(POSITION_RELATIVE, ...args);
-
- /**
- * Mixin to generate a absolute positionned box
- * @abstract
- * @param {...string} args values for top, right, bottom, left - treated like for margin or padding properties
- * @return {object} `{position: "absolute", top: "...", right: "...", bottom: "...", left: "..."}`
- */
- export const absolute = (...args) => position(POSITION_ABSOLUTE, ...args);
-
- /**
- * Mixin to generate a fixed positionned box
- * @abstract
- * @param {...string} args values for top, right, bottom, left - treated like for margin or padding properties
- * @return {object} `{position: "fixed", top: "...", right: "...", bottom: "...", left: "..."}`
- */
- export const fixed = (...args) => position(POSITION_FIXED, ...args);
-
- /**
- * Mixin to generate a sticky positionned box
- * @abstract
- * @param {...string} args values for top, right, bottom, left - treated like for margin or padding properties
- * @return {object} `{position: "sticky", top: "...", right: "...", bottom: "...", left: "..."}`
- */
- export const sticky = (...args) => position(POSITION_STICKY, ...args);