UNPKG

spacery

Version:

Space Modifier utilities for working with React

73 lines (69 loc) 2.21 kB
// src/components/spacery.js import React from "react"; // src/lib/mods-to-style.js var mgnPattern = /(margin)[TBRLXY]*-/; var padPattern = /(padding)[TBRLXY]*-/; var XPattern = /X$/; var YPattern = /Y$/; var toDims = (value, unit) => { if (isNaN(value)) return value; if (unit) return value + unit; return +value; }; var normalizeModifer = (prop) => { let x = prop; return x.endsWith("T") && (x += "op") || x.endsWith("L") && (x += "eft") || x.endsWith("B") && (x += "ottom") || x.endsWith("R") && (x += "ight") || prop; }; function modsToStyle(mods, dimUnit = "px") { const style = {}; const sanitizedProps = { ...mods }; for (const key of Object.keys(mods)) { if (!(mgnPattern.test(key) || padPattern.test(key))) continue; delete sanitizedProps[key]; const propSplits = key.split("-"); const modifier = normalizeModifer(propSplits[0]); propSplits[1] = propSplits[1] || 0; if (XPattern.test(modifier)) { const xProp = modifier.replace(XPattern, ""); style[xProp + "Left"] = toDims(propSplits[1], dimUnit); style[xProp + "Right"] = toDims(propSplits[1], dimUnit); } else if (YPattern.test(modifier)) { const yProp = modifier.replace(YPattern, ""); style[yProp + "Top"] = toDims(propSplits[1], dimUnit); style[yProp + "Bottom"] = toDims(propSplits[1], dimUnit); } else { style[modifier] = toDims(propSplits[1], dimUnit); } } return { style, sanitizedProps }; } // src/components/spacery.js function Spacery({ children, style, ...props }) { const { style: modifiersStyle, sanitizedProps } = modsToStyle(props); return /* @__PURE__ */ React.createElement("div", { style: { ...modifiersStyle, ...style }, ...sanitizedProps }, children); } // src/hoc/with-spacery.js import React2 from "react"; function withSpacery(Component, dimensionUnit) { return ({ style, ...props }) => { const { style: modifiersStyle, sanitizedProps } = modsToStyle( props, dimensionUnit ); return /* @__PURE__ */ React2.createElement(Component, { style: { ...modifiersStyle, ...style }, ...sanitizedProps }); }; } export { Spacery, modsToStyle, withSpacery };