react-twinkle-text
Version:
React twinkle text effect using Tailwind-compatible styles.
114 lines (104 loc) • 2.98 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.tsx
var index_exports = {};
__export(index_exports, {
TwinkleText: () => TwinkleText
});
module.exports = __toCommonJS(index_exports);
// src/TwinkleText.tsx
var import_react = require("react");
// src/twinkleStyles.ts
var twinkleCSS = `
@keyframes text-twinkle {
0% { background-position: 150% 0; }
100% { background-position: -250% 0; }
}
.text-twinkle,
.hover-text-twinkle,
.group-hover-text-twinkle {
position: relative;
display: inline-block;
}
.text-twinkle::before,
.hover-text-twinkle::before,
.group-hover-text-twinkle::before {
content: attr(data-text-twinkle);
position: absolute;
inset: 0;
pointer-events: none;
color: transparent;
background-clip: text;
background-image: linear-gradient(
90deg,
transparent,
transparent,
white,
transparent,
transparent
);
background-size: 200% 100%;
background-position: 150% 0;
filter: drop-shadow(0 0 1px #ffffff)
drop-shadow(0 0 2px rgba(255, 255, 255, 0.5));
}
.text-twinkle::before {
animation: text-twinkle 5s linear infinite;
}
.hover-text-twinkle::before,
.group-hover-text-twinkle::before {
opacity: 0;
}
.hover-text-twinkle:hover::before,
.group:hover .group-hover-text-twinkle::before {
opacity: 1;
animation: text-twinkle 5s linear infinite;
}
`;
// src/TwinkleText.tsx
var import_jsx_runtime = require("react/jsx-runtime");
var cssInjected = false;
var TwinkleText = ({
children,
className = "",
hover = false,
groupHover = false
}) => {
(0, import_react.useEffect)(() => {
if (!cssInjected) {
const style = document.createElement("style");
style.textContent = twinkleCSS;
document.head.appendChild(style);
cssInjected = true;
}
}, []);
const twinkleClass = groupHover ? "group-hover-text-twinkle" : hover ? "hover-text-twinkle" : "text-twinkle";
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
"span",
{
"data-text-twinkle": typeof children === "string" ? children : void 0,
className: `${twinkleClass} ${className}`,
children
}
);
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
TwinkleText
});