UNPKG

cursor-gk

Version:

A custom cursor component for React applications. Devloped by GK.

160 lines (159 loc) 7.86 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = CustomCursor; var _react = _interopRequireWildcard(require("react")); var _react2 = require("motion/react"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } /** * CustomCursor Component * Props: * - outerSize: number (default: 40) → Outer circle size * - innerSize: number (default: 8) → Inner dot size * - pressedScale: number (default: 0.7) → Scale when clicked * - hoverScale: number (default: 1.25) → Scale on hover * - stiffness: number (default: 300) → Spring stiffness * - damping: number (default: 28) → Spring damping * - outerBorder: string (default: "2px solid black") → Outer circle border * - outerColor: string (default: "transparent") → Outer circle background * - innerColor: string (default: "black") → Inner dot color * - boxShadow: string (default: "0 0 8px rgba(0,0,0,0.3)") → Hover/click box shadow */ function CustomCursor(_ref) { var _ref$outerSize = _ref.outerSize, outerSize = _ref$outerSize === void 0 ? 40 : _ref$outerSize, _ref$innerSize = _ref.innerSize, innerSize = _ref$innerSize === void 0 ? 8 : _ref$innerSize, _ref$pressedScale = _ref.pressedScale, pressedScale = _ref$pressedScale === void 0 ? 0.7 : _ref$pressedScale, _ref$hoverScale = _ref.hoverScale, hoverScale = _ref$hoverScale === void 0 ? 1.25 : _ref$hoverScale, _ref$stiffness = _ref.stiffness, stiffness = _ref$stiffness === void 0 ? 300 : _ref$stiffness, _ref$damping = _ref.damping, damping = _ref$damping === void 0 ? 28 : _ref$damping, _ref$outerBorder = _ref.outerBorder, outerBorder = _ref$outerBorder === void 0 ? "2px solid black" : _ref$outerBorder, _ref$outerColor = _ref.outerColor, outerColor = _ref$outerColor === void 0 ? "transparent" : _ref$outerColor, _ref$innerColor = _ref.innerColor, innerColor = _ref$innerColor === void 0 ? "black" : _ref$innerColor, _ref$boxShadow = _ref.boxShadow, boxShadow = _ref$boxShadow === void 0 ? "0 0 8px rgba(0,0,0,0.3)" : _ref$boxShadow; var _useState = (0, _react.useState)(false), _useState2 = _slicedToArray(_useState, 2), hovered = _useState2[0], setHovered = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = _slicedToArray(_useState3, 2), pressed = _useState4[0], setPressed = _useState4[1]; var mouseX = (0, _react2.useMotionValue)(0); var mouseY = (0, _react2.useMotionValue)(0); var outerX = (0, _react2.useSpring)(mouseX, { stiffness: stiffness, damping: damping }); var outerY = (0, _react2.useSpring)(mouseY, { stiffness: stiffness, damping: damping }); (0, _react.useEffect)(function () { var move = function move(e) { mouseX.set(e.clientX); mouseY.set(e.clientY); }; var elements = document.querySelectorAll("button, a"); elements.forEach(function (el) { el.addEventListener("mouseenter", function () { return setHovered(true); }); el.addEventListener("mouseleave", function () { return setHovered(false); }); }); var handleMouseDown = function handleMouseDown() { return setPressed(true); }; var handleMouseUp = function handleMouseUp() { return setPressed(false); }; document.addEventListener("mousemove", move); document.addEventListener("mousedown", handleMouseDown); document.addEventListener("mouseup", handleMouseUp); return function () { document.removeEventListener("mousemove", move); document.removeEventListener("mousedown", handleMouseDown); document.removeEventListener("mouseup", handleMouseUp); elements.forEach(function (el) { el.removeEventListener("mouseenter", function () { return setHovered(true); }); el.removeEventListener("mouseleave", function () { return setHovered(false); }); }); }; }, [mouseX, mouseY]); var scale = pressed ? pressedScale : hovered ? hoverScale : 1; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_react2.motion.div, { style: { position: "fixed", top: 0, left: 0, width: outerSize, height: outerSize, borderRadius: "50%", border: outerBorder, pointerEvents: "none", zIndex: 9999, backgroundColor: outerColor, x: outerX, y: outerY, translateX: "-50%", translateY: "-50%", boxShadow: "0 0 0 rgba(0,0,0,0)" }, animate: { scale: scale, boxShadow: hovered || pressed ? boxShadow : "0 0 0 rgba(0,0,0,0)" }, transition: { type: "spring", stiffness: stiffness + 100, damping: damping } }), /*#__PURE__*/_react["default"].createElement(_react2.motion.div, { style: { position: "fixed", top: 0, left: 0, width: pressed ? innerSize + 3 : innerSize, height: pressed ? innerSize + 3 : innerSize, borderRadius: "50%", backgroundColor: innerColor, pointerEvents: "none", zIndex: 10000, x: mouseX, y: mouseY, translateX: "-50%", translateY: "-50%" }, animate: { boxShadow: pressed ? boxShadow : "0 0 0 rgba(0,0,0,0)" }, transition: { type: "spring", stiffness: stiffness + 100, damping: damping } })); }