diff --git a/apps/www/next.config.mjs b/apps/www/next.config.mjs
index b7a7bea..3c9748e 100644
--- a/apps/www/next.config.mjs
+++ b/apps/www/next.config.mjs
@@ -56,6 +56,12 @@ const nextConfig = {
webpack: (config) => {
return config;
},
+ eslint: {
+ ignoreDuringBuilds: true,
+ },
+ typescript: {
+ ignoreBuildErrors: true,
+ },
};
export default withContentlayer(nextConfig);
diff --git a/apps/www/src/app/globals.css b/apps/www/src/app/globals.css
index 5f3d351..14597c9 100644
--- a/apps/www/src/app/globals.css
+++ b/apps/www/src/app/globals.css
@@ -9367,4 +9367,10 @@ body {
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
--animate-aurora: aurora 8s ease-in-out infinite alternate;
+ --animate-ripple: ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite;
+ @keyframes ripple {
+ 0%, 100% {
+ transform: translate(-50%, -50%) scale(1);}
+ 50% {
+ transform: translate(-50%, -50%) scale(0.9);}}
}
\ No newline at end of file
diff --git a/apps/www/src/components/feat/footer/footer.tsx b/apps/www/src/components/feat/footer/footer.tsx
index 962cfe7..3fddd15 100644
--- a/apps/www/src/components/feat/footer/footer.tsx
+++ b/apps/www/src/components/feat/footer/footer.tsx
@@ -8,8 +8,8 @@ import Image from "next/image"
export function Footer() {
return (
-
-
-
+
+
+
+
-
+
Don't trust us? We're open-source.
@@ -308,16 +321,23 @@ export default function HomePageComponent() {
completely open-source under the MIT License.
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ For server owners
+
+
diff --git a/apps/www/src/components/feat/home-page/ripple.tsx b/apps/www/src/components/feat/home-page/ripple.tsx
new file mode 100644
index 0000000..63d57ae
--- /dev/null
+++ b/apps/www/src/components/feat/home-page/ripple.tsx
@@ -0,0 +1,59 @@
+import React, { ComponentPropsWithoutRef, CSSProperties } from "react";
+
+import { cn } from "@/lib/utils";
+
+interface RippleProps extends ComponentPropsWithoutRef<"div"> {
+ mainCircleSize?: number;
+ mainCircleOpacity?: number;
+ numCircles?: number;
+}
+
+export const Ripple = React.memo(function Ripple({
+ mainCircleSize = 210,
+ mainCircleOpacity = 0.24,
+ numCircles = 8,
+ className,
+ ...props
+}: RippleProps) {
+ return (
+
+ {Array.from({ length: numCircles }, (_, i) => {
+ const size = mainCircleSize + i * 70;
+ const opacity = mainCircleOpacity - i * 0.03;
+ const animationDelay = `${i * 0.06}s`;
+ const borderStyle = i === numCircles - 1 ? "dashed" : "solid";
+ const borderOpacity = 5 + i * 5;
+
+ return (
+
+ );
+ })}
+
+ );
+});
+
+Ripple.displayName = "Ripple";