love-ui 1.2.21 → 1.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/chunk-CH2CHRA7.js +122 -0
  2. package/dist/index.js +71 -71
  3. package/dist/mcp-server.js +1 -1
  4. package/package.json +1 -1
  5. package/registry/default/blocks/404-2/components/not-found.tsx +1 -1
  6. package/registry/default/blocks/auth1/components/auth-page.tsx +0 -7
  7. package/registry/default/blocks/auth1/components/logo.tsx +3 -14
  8. package/registry/default/blocks/auth2/components/auth.tsx +1 -1
  9. package/registry/default/blocks/auth2/components/ui/decor-icon.tsx +49 -36
  10. package/registry/default/blocks/auth3/components/logo.tsx +3 -14
  11. package/registry/default/blocks/auth3/components/ui/decor-icon.tsx +49 -36
  12. package/registry/default/blocks/contact5/components/decor-icon.tsx +49 -36
  13. package/registry/default/blocks/cta-3/components/cta.tsx +1 -1
  14. package/registry/default/blocks/cta-3/components/decor-icon.tsx +49 -36
  15. package/registry/default/blocks/cta-5/components/cta.tsx +3 -9
  16. package/registry/default/blocks/faq-3/components/decor-icon.tsx +49 -36
  17. package/registry/default/blocks/features1/components/feature-section.tsx +1 -1
  18. package/registry/default/blocks/features2/components/decor-icon.tsx +49 -36
  19. package/registry/default/blocks/features2/components/feature-section.tsx +1 -1
  20. package/registry/default/blocks/features4/components/decor-icon.tsx +49 -36
  21. package/registry/default/blocks/features4/components/feature-section.tsx +0 -2
  22. package/registry/default/blocks/features5/components/feature-section.tsx +1 -1
  23. package/registry/default/blocks/features6/components/feature-section.tsx +5 -21
  24. package/registry/default/blocks/footer1/components/logo.tsx +3 -14
  25. package/registry/default/blocks/footer2/components/footer.tsx +1 -1
  26. package/registry/default/blocks/footer2/components/logo.tsx +3 -14
  27. package/registry/default/blocks/footer3/components/footer.tsx +2 -2
  28. package/registry/default/blocks/footer3/components/logo.tsx +3 -14
  29. package/registry/default/blocks/footer4/components/footer.tsx +1 -1
  30. package/registry/default/blocks/footer4/components/logo.tsx +3 -14
  31. package/registry/default/blocks/footer5/components/footer.tsx +27 -30
  32. package/registry/default/blocks/footer5/components/logo.tsx +3 -14
  33. package/registry/default/blocks/footer6/components/footer.tsx +3 -3
  34. package/registry/default/blocks/footer6/components/logo.tsx +3 -14
  35. package/registry/default/blocks/header1/components/logo.tsx +3 -14
  36. package/registry/default/blocks/header2/components/logo.tsx +3 -14
  37. package/registry/default/blocks/header3/components/logo.tsx +3 -14
  38. package/registry/default/blocks/hero1/components/hero.tsx +7 -7
  39. package/registry/default/blocks/hero1/components/logo.tsx +3 -14
  40. package/registry/default/blocks/hero2/components/decor-icon.tsx +49 -36
  41. package/registry/default/blocks/hero2/components/hero.tsx +4 -5
  42. package/registry/default/blocks/hero2/components/logo.tsx +3 -14
  43. package/registry/default/blocks/hero3/components/hero.tsx +2 -3
  44. package/registry/default/blocks/hero3/components/logo.tsx +3 -14
  45. package/registry/default/blocks/integrations1/components/integrations.tsx +7 -1
  46. package/registry/default/blocks/integrations2/components/decor-icon.tsx +49 -36
  47. package/registry/default/blocks/integrations2/components/integrations.tsx +7 -1
  48. package/registry/default/blocks/integrations3/components/integrations.tsx +25 -34
  49. package/registry/default/blocks/integrations4/components/integrations.tsx +2 -5
  50. package/registry/default/blocks/integrations5/components/integrations.tsx +8 -5
  51. package/registry/default/blocks/logo-cloud-2/components/decor-icon.tsx +49 -36
  52. package/registry/default/blocks/logo-cloud-3/app/page.tsx +2 -2
  53. package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +1 -1
  54. package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +1 -1
  55. package/registry/default/blocks/logo-cloud-4/components/progressive-blur.tsx +30 -36
  56. package/registry/default/blocks/pricing1/components/decor-icon.tsx +49 -36
  57. package/registry/default/blocks/stats10/components/stats.tsx +1 -9
  58. package/registry/default/blocks/testimonials1/components/logo.tsx +3 -14
  59. package/registry/default/blocks/testimonials1/components/testimonials.tsx +1 -1
  60. package/registry/default/blocks/testimonials2/components/testimonials.tsx +3 -3
  61. package/registry/default/blocks/testimonials3/components/decor-icon.tsx +49 -36
  62. package/registry/default/blocks/testimonials3/components/testimonials.tsx +0 -1
  63. package/registry/default/blocks/testimonials5/components/testimonials.tsx +1 -1
  64. package/registry/default/blocks/testimonials6/components/testimonials.tsx +1 -1
  65. package/registry/default/examples/preview-card-profile.tsx +3 -3
  66. package/registry/default/ui/button.tsx +1 -1
  67. package/registry/default/ui/toggle.tsx +2 -1
  68. package/dist/chunk-VDMHIXDM.js +0 -121
  69. package/registry/default/blocks/auth1/components/particles.tsx +0 -321
@@ -20,7 +20,7 @@ export function FeatureSection() {
20
20
  <div
21
21
  className={cn(
22
22
  "relative flex flex-col items-center justify-center p-2",
23
- "after:absolute after:inset-y-0 after:right-0 after:h-full after:w-px after:bg-linear-to-b after:from-foreground/6 after:via-foreground/25 after:to-foreground/6",
23
+ "after:absolute after:inset-y-0 after:right-0 after:h-full after:w-px after:bg-border/50",
24
24
  "[&_svg]:size-6 [&_svg]:text-muted-foreground",
25
25
  {
26
26
  "after:hidden": index === features.length - 1,
@@ -2,44 +2,57 @@ import { cn } from "@/lib/utils";
2
2
  import { cva, type VariantProps } from "class-variance-authority";
3
3
 
4
4
  const DecorIconVariants = cva(
5
- "pointer-events-none absolute z-1 size-5 shrink-0 stroke-1 stroke-muted-foreground",
6
- {
7
- variants: {
8
- position: {
9
- "top-left":
10
- "top-0 left-0 -translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
11
- "top-right":
12
- "top-0 right-0 translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
13
- "bottom-right":
14
- "right-0 bottom-0 translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
15
- "bottom-left":
16
- "bottom-0 left-0 -translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
17
- },
18
- },
19
- defaultVariants: {
20
- position: "top-left",
21
- },
22
- }
5
+ "pointer-events-none absolute z-1 size-4 shrink-0 stroke-1 stroke-muted-foreground transition-transform",
6
+ {
7
+ variants: {
8
+ position: {
9
+ // We also rotate the SVG inside the variant so the bracket always points inward
10
+ "top-left":
11
+ "top-0 left-0 -translate-x-1/2 -translate-y-1/2",
12
+ "top-right":
13
+ "top-0 right-0 translate-x-1/2 -translate-y-1/2 rotate-90",
14
+ "bottom-right":
15
+ "right-0 bottom-0 translate-x-1/2 translate-y-1/2 rotate-180",
16
+ "bottom-left":
17
+ "bottom-0 left-0 -translate-x-1/2 translate-y-1/2 -rotate-90",
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ position: "top-left",
22
+ },
23
+ }
23
24
  );
24
25
 
25
26
  type DecorIconProps = React.ComponentProps<"svg"> &
26
- VariantProps<typeof DecorIconVariants>;
27
+ VariantProps<typeof DecorIconVariants> & {
28
+ variant?: "bracket" | "dot" | "diagonal";
29
+ };
27
30
 
28
- export function DecorIcon({ position, className, ...props }: DecorIconProps) {
29
- return (
30
- <svg
31
- aria-hidden="true"
32
- className={cn(DecorIconVariants({ position, className }))}
33
- fill="none"
34
- stroke="currentColor"
35
- strokeLinecap="round"
36
- strokeLinejoin="round"
37
- viewBox="0 0 24 24"
38
- xmlns="http://www.w3.org/2000/svg"
39
- {...props}
40
- >
41
- <path d="M5 12h14" />
42
- <path d="M12 5v14" />
43
- </svg>
44
- );
31
+ export function DecorIcon({ position, variant = "bracket", className, ...props }: DecorIconProps) {
32
+ return (
33
+ <svg
34
+ aria-hidden="true"
35
+ className={cn(DecorIconVariants({ position, className }))}
36
+ fill="none"
37
+ stroke="currentColor"
38
+ viewBox="0 0 24 24"
39
+ xmlns="http://www.w3.org/2000/svg"
40
+ {...props}
41
+ >
42
+ {/* OPTION 1: Corner Bracket (Default) */}
43
+ {variant === "bracket" && (
44
+ <path strokeLinecap="round" strokeLinejoin="round" d="M12 4H4v8" />
45
+ )}
46
+
47
+ {/* OPTION 2: Minimalist Dot (Change fill to currentColor in class if using this) */}
48
+ {variant === "dot" && (
49
+ <circle cx="12" cy="12" r="3" fill="currentColor" />
50
+ )}
51
+
52
+ {/* OPTION 3: Diagonal Accent Line */}
53
+ {variant === "diagonal" && (
54
+ <path strokeLinecap="round" d="M4 20L20 4" />
55
+ )}
56
+ </svg>
57
+ );
45
58
  }
@@ -43,7 +43,7 @@ export function FeatureSection() {
43
43
  <div className="grid grid-cols-1 md:grid-cols-3">
44
44
  {features.map((feature) => (
45
45
  <div
46
- className="group [&_svg]:mask-b-from-0% relative p-8 [&_svg]:size-7 [&_svg]:text-muted-foreground"
46
+ className="group relative p-8 [&_svg]:size-7 [&_svg]:text-muted-foreground"
47
47
  key={feature.title}
48
48
  >
49
49
  {feature.icon}
@@ -2,44 +2,57 @@ import { cn } from "@/lib/utils";
2
2
  import { cva, type VariantProps } from "class-variance-authority";
3
3
 
4
4
  const DecorIconVariants = cva(
5
- "pointer-events-none absolute z-1 size-5 shrink-0 stroke-1 stroke-muted-foreground",
6
- {
7
- variants: {
8
- position: {
9
- "top-left":
10
- "top-0 left-0 -translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
11
- "top-right":
12
- "top-0 right-0 translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
13
- "bottom-right":
14
- "right-0 bottom-0 translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
15
- "bottom-left":
16
- "bottom-0 left-0 -translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
17
- },
18
- },
19
- defaultVariants: {
20
- position: "top-left",
21
- },
22
- }
5
+ "pointer-events-none absolute z-1 size-4 shrink-0 stroke-1 stroke-muted-foreground transition-transform",
6
+ {
7
+ variants: {
8
+ position: {
9
+ // We also rotate the SVG inside the variant so the bracket always points inward
10
+ "top-left":
11
+ "top-0 left-0 -translate-x-1/2 -translate-y-1/2",
12
+ "top-right":
13
+ "top-0 right-0 translate-x-1/2 -translate-y-1/2 rotate-90",
14
+ "bottom-right":
15
+ "right-0 bottom-0 translate-x-1/2 translate-y-1/2 rotate-180",
16
+ "bottom-left":
17
+ "bottom-0 left-0 -translate-x-1/2 translate-y-1/2 -rotate-90",
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ position: "top-left",
22
+ },
23
+ }
23
24
  );
24
25
 
25
26
  type DecorIconProps = React.ComponentProps<"svg"> &
26
- VariantProps<typeof DecorIconVariants>;
27
+ VariantProps<typeof DecorIconVariants> & {
28
+ variant?: "bracket" | "dot" | "diagonal";
29
+ };
27
30
 
28
- export function DecorIcon({ position, className, ...props }: DecorIconProps) {
29
- return (
30
- <svg
31
- aria-hidden="true"
32
- className={cn(DecorIconVariants({ position, className }))}
33
- fill="none"
34
- stroke="currentColor"
35
- strokeLinecap="round"
36
- strokeLinejoin="round"
37
- viewBox="0 0 24 24"
38
- xmlns="http://www.w3.org/2000/svg"
39
- {...props}
40
- >
41
- <path d="M5 12h14" />
42
- <path d="M12 5v14" />
43
- </svg>
44
- );
31
+ export function DecorIcon({ position, variant = "bracket", className, ...props }: DecorIconProps) {
32
+ return (
33
+ <svg
34
+ aria-hidden="true"
35
+ className={cn(DecorIconVariants({ position, className }))}
36
+ fill="none"
37
+ stroke="currentColor"
38
+ viewBox="0 0 24 24"
39
+ xmlns="http://www.w3.org/2000/svg"
40
+ {...props}
41
+ >
42
+ {/* OPTION 1: Corner Bracket (Default) */}
43
+ {variant === "bracket" && (
44
+ <path strokeLinecap="round" strokeLinejoin="round" d="M12 4H4v8" />
45
+ )}
46
+
47
+ {/* OPTION 2: Minimalist Dot (Change fill to currentColor in class if using this) */}
48
+ {variant === "dot" && (
49
+ <circle cx="12" cy="12" r="3" fill="currentColor" />
50
+ )}
51
+
52
+ {/* OPTION 3: Diagonal Accent Line */}
53
+ {variant === "diagonal" && (
54
+ <path strokeLinecap="round" d="M4 20L20 4" />
55
+ )}
56
+ </svg>
57
+ );
45
58
  }
@@ -47,8 +47,6 @@ function FeatureCard({
47
47
  <div
48
48
  className={cn(
49
49
  "relative flex flex-col justify-between gap-6 bg-background px-6 pt-8 pb-6 shadow-xs",
50
- // Gradient inspired by testimonials
51
- "dark:bg-[radial-gradient(50%_80%_at_25%_0%,--theme(--color-foreground/.1),transparent)]",
52
50
  className
53
51
  )}
54
52
  {...props}
@@ -51,7 +51,7 @@ export function FeatureCard({
51
51
  className={cn("relative overflow-hidden bg-background p-6", className)}
52
52
  {...props}
53
53
  >
54
- <div className="mask-[radial-gradient(farthest-side_at_top,white,transparent)] pointer-events-none absolute top-0 left-1/2 -mt-2 -ml-20 size-full">
54
+ <div className=" pointer-events-none absolute top-0 left-1/2 -mt-2 -ml-20 size-full">
55
55
  <GridPattern
56
56
  className="absolute inset-0 size-full stroke-foreground/20"
57
57
  height={40}
@@ -84,7 +84,7 @@ function SetupVisual() {
84
84
  return (
85
85
  <>
86
86
  <div className="relative mx-auto flex size-32 items-center justify-center rounded-full border-4 border-dashed bg-background shadow-xs outline outline-border outline-offset-4">
87
- <div className="absolute inset-0 z-10 scale-120 bg-radial from-foreground/20 via-foreground/5 to-transparent blur-xl" />
87
+ <div className="absolute inset-0 z-10 scale-120 bg-foreground/5 blur-xl" />
88
88
  <CustomTimerIcon className="size-14 fill-primary/90" />
89
89
  </div>
90
90
 
@@ -103,7 +103,7 @@ function UserBasedSecurity() {
103
103
  <>
104
104
  <div className="relative mx-auto flex size-32 items-center justify-center rounded-full border bg-background shadow-xs outline outline-border outline-offset-4">
105
105
  <CustomLockIcon className="size-24" />
106
- <div className="absolute inset-0 scale-120 bg-radial from-foreground/15 via-foreground/5 to-transparent blur-xl" />
106
+ <div className="absolute inset-0 scale-120 bg-foreground/5 blur-xl" />
107
107
  </div>
108
108
 
109
109
  <div className="relative mt-8 space-y-1.5 text-center">
@@ -157,7 +157,7 @@ function DashboardVisual() {
157
157
  </div>
158
158
  </div>
159
159
  {/* Dashboard Screen */}
160
- <div className="mask-b-from-90% mask-r-from-90% relative aspect-video sm:aspect-auto">
160
+ <div className=" relative aspect-video sm:aspect-auto">
161
161
  <div className="absolute -right-1 -bottom-1 aspect-video max-h-50 rounded-tl-md border bg-card p-1 sm:max-h-42 md:aspect-square md:max-h-50 lg:aspect-16/12">
162
162
  <div className="aspect-video h-full overflow-hidden rounded-tl-sm border *:pointer-events-none *:size-full *:shrink-0 *:select-none">
163
163
  <img
@@ -269,7 +269,7 @@ function ReportsChartsSvg(props: React.ComponentProps<"svg">) {
269
269
  <path
270
270
  clipRule="evenodd"
271
271
  d="M3 123C3 123 14.3298 94.153 35.1282 88.0957C55.9266 82.0384 65.9333 80.5508 65.9333 80.5508C65.9333 80.5508 80.699 80.5508 92.1777 80.5508C103.656 80.5508 100.887 63.5348 109.06 63.5348C117.233 63.5348 117.217 91.9728 124.78 91.9728C132.343 91.9728 142.264 78.03 153.831 80.5508C165.398 83.0716 186.825 91.9728 193.761 91.9728C200.697 91.9728 206.296 63.5348 214.07 63.5348C221.844 63.5348 238.653 93.7771 244.234 91.9728C249.814 90.1684 258.8 60 266.19 60C272.075 60 284.1 88.057 286.678 88.0957C294.762 88.2171 300.192 72.9284 305.423 72.9284C312.323 72.9284 323.377 65.2437 335.553 63.5348C347.729 61.8259 348.218 82.07 363.639 80.5508C367.875 80.1335 372.949 82.2017 376.437 87.1008C379.446 91.3274 381.054 97.4325 382.521 104.647C383.479 109.364 382.521 123 382.521 123"
272
- fill="url(#paint0_linear_0_106)"
272
+ className="fill-primary/10"
273
273
  fillRule="evenodd"
274
274
  />
275
275
  <path
@@ -279,23 +279,7 @@ function ReportsChartsSvg(props: React.ComponentProps<"svg">) {
279
279
  strokeWidth="1"
280
280
  />
281
281
  <defs>
282
- <linearGradient
283
- gradientUnits="userSpaceOnUse"
284
- id="paint0_linear_0_106"
285
- x1="3"
286
- x2="3"
287
- y1="60"
288
- y2="123"
289
- >
290
- <stop className="text-primary/20" stopColor="currentColor" />
291
- <stop
292
- className="text-background"
293
- offset="1"
294
- stopColor="currentColor"
295
- stopOpacity="0.103775"
296
- />
297
- </linearGradient>
298
- <clipPath id="clip0_0_106">
282
+ <clipPath id="clip0_0_106">
299
283
  <rect
300
284
  fill="white"
301
285
  height="30"
@@ -7,18 +7,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
7
7
  xmlns="http://www.w3.org/2000/svg"
8
8
  {...props}
9
9
  >
10
- <defs>
11
- <linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
12
- <stop stopColor="#38A3FF" />
13
- <stop offset="0.55" stopColor="#1266F1" />
14
- <stop offset="1" stopColor="#0B3FD8" />
15
- </linearGradient>
16
-
17
- <linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
18
- <stop stopColor="#FFFFFF" stopOpacity="0.9" />
19
- <stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
20
- </linearGradient>
21
- </defs>
10
+
22
11
 
23
12
  <g transform="translate(0 0)">
24
13
  <rect
@@ -27,7 +16,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
27
16
  width="48"
28
17
  height="48"
29
18
  rx="12"
30
- fill="url(#loveui-blue)"
19
+ fill="#1266F1"
31
20
  />
32
21
 
33
22
  <path
@@ -70,7 +59,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
70
59
  H18
71
60
  C19.7 29 21 27.7 21 25
72
61
  Z"
73
- fill="url(#loveui-shine)"
62
+ fill="#BBD8FF"
74
63
  opacity="0.5"
75
64
  />
76
65
  </g>
@@ -9,7 +9,7 @@ export function Footer() {
9
9
  <footer
10
10
  className={cn(
11
11
  "relative mx-auto max-w-5xl lg:border-x",
12
- "dark:bg-[radial-gradient(35%_80%_at_15%_0%,--theme(--color-foreground/.1),transparent)]"
12
+ ""
13
13
  )}
14
14
  >
15
15
  <FullWidthDivider position="top" />
@@ -7,18 +7,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
7
7
  xmlns="http://www.w3.org/2000/svg"
8
8
  {...props}
9
9
  >
10
- <defs>
11
- <linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
12
- <stop stopColor="#38A3FF" />
13
- <stop offset="0.55" stopColor="#1266F1" />
14
- <stop offset="1" stopColor="#0B3FD8" />
15
- </linearGradient>
16
-
17
- <linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
18
- <stop stopColor="#FFFFFF" stopOpacity="0.9" />
19
- <stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
20
- </linearGradient>
21
- </defs>
10
+
22
11
 
23
12
  <g transform="translate(0 0)">
24
13
  <rect
@@ -27,7 +16,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
27
16
  width="48"
28
17
  height="48"
29
18
  rx="12"
30
- fill="url(#loveui-blue)"
19
+ fill="#1266F1"
31
20
  />
32
21
 
33
22
  <path
@@ -70,7 +59,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
70
59
  H18
71
60
  C19.7 29 21 27.7 21 25
72
61
  Z"
73
- fill="url(#loveui-shine)"
62
+ fill="#BBD8FF"
74
63
  opacity="0.5"
75
64
  />
76
65
  </g>
@@ -76,7 +76,7 @@ export function Footer() {
76
76
  <footer
77
77
  className={cn(
78
78
  "relative mx-auto flex w-full max-w-5xl flex-col items-center justify-center rounded-t-4xl border-t px-6 md:rounded-t-6xl md:px-8",
79
- "dark:bg-[radial-gradient(35%_128px_at_50%_0%,--theme(--color-foreground/.1),transparent)]"
79
+ ""
80
80
  )}
81
81
  >
82
82
  <div className="absolute top-0 right-1/2 left-1/2 h-px w-1/3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-foreground/20 blur" />
@@ -113,7 +113,7 @@ export function Footer() {
113
113
  ))}
114
114
  </div>
115
115
  </div>
116
- <div className="h-px w-full bg-linear-to-r via-border" />
116
+ <div className="h-px w-full bg-border" />
117
117
  <div className="flex w-full items-center justify-center py-4">
118
118
  <p className="text-muted-foreground text-sm">
119
119
  &copy; {new Date().getFullYear()} LoveUI, All rights reserved
@@ -7,18 +7,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
7
7
  xmlns="http://www.w3.org/2000/svg"
8
8
  {...props}
9
9
  >
10
- <defs>
11
- <linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
12
- <stop stopColor="#38A3FF" />
13
- <stop offset="0.55" stopColor="#1266F1" />
14
- <stop offset="1" stopColor="#0B3FD8" />
15
- </linearGradient>
16
-
17
- <linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
18
- <stop stopColor="#FFFFFF" stopOpacity="0.9" />
19
- <stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
20
- </linearGradient>
21
- </defs>
10
+
22
11
 
23
12
  <g transform="translate(0 0)">
24
13
  <rect
@@ -27,7 +16,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
27
16
  width="48"
28
17
  height="48"
29
18
  rx="12"
30
- fill="url(#loveui-blue)"
19
+ fill="#1266F1"
31
20
  />
32
21
 
33
22
  <path
@@ -70,7 +59,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
70
59
  H18
71
60
  C19.7 29 21 27.7 21 25
72
61
  Z"
73
- fill="url(#loveui-shine)"
62
+ fill="#BBD8FF"
74
63
  opacity="0.5"
75
64
  />
76
65
  </g>
@@ -7,7 +7,7 @@ export function Footer() {
7
7
  <footer
8
8
  className={cn(
9
9
  "border-t",
10
- "dark:bg-[radial-gradient(35%_128px_at_50%_0%,--theme(--color-foreground/.08),transparent)]"
10
+ ""
11
11
  )}
12
12
  >
13
13
  <div className="relative mx-auto max-w-5xl px-4">
@@ -7,18 +7,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
7
7
  xmlns="http://www.w3.org/2000/svg"
8
8
  {...props}
9
9
  >
10
- <defs>
11
- <linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
12
- <stop stopColor="#38A3FF" />
13
- <stop offset="0.55" stopColor="#1266F1" />
14
- <stop offset="1" stopColor="#0B3FD8" />
15
- </linearGradient>
16
-
17
- <linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
18
- <stop stopColor="#FFFFFF" stopOpacity="0.9" />
19
- <stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
20
- </linearGradient>
21
- </defs>
10
+
22
11
 
23
12
  <g transform="translate(0 0)">
24
13
  <rect
@@ -27,7 +16,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
27
16
  width="48"
28
17
  height="48"
29
18
  rx="12"
30
- fill="url(#loveui-blue)"
19
+ fill="#1266F1"
31
20
  />
32
21
 
33
22
  <path
@@ -70,7 +59,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
70
59
  H18
71
60
  C19.7 29 21 27.7 21 25
72
61
  Z"
73
- fill="url(#loveui-shine)"
62
+ fill="#BBD8FF"
74
63
  opacity="0.5"
75
64
  />
76
65
  </g>
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
 
3
- import { Instagram as InstagramIcon, LinkedIn as LinkedinIcon, X as XIcon, Apple as AppleIcon, Facebook as FacebookIcon, GooglePlay as GooglePlayIcon } from "love-ui/logos";
3
+ import { Instagram as InstagramIcon, LinkedIn as LinkedinIcon, X as XIcon, Facebook as FacebookIcon } from "love-ui/logos";
4
4
  import { Button } from "@/registry/default/ui/button";
5
+ import { Input } from "@/registry/default/ui/input";
5
6
 
6
7
  export function Footer() {
7
8
  return (
@@ -25,13 +26,13 @@ export function Footer() {
25
26
  ))}
26
27
  </div>
27
28
  <div className="h-px bg-border" />
28
- {/* Social Buttons + App Links */}
29
- <div className="flex flex-wrap items-center justify-between gap-4 py-5">
29
+ {/* Social buttons + newsletter */}
30
+ <div className="flex flex-wrap items-center justify-between gap-6 py-5">
30
31
  <div className="flex items-center gap-2">
31
32
  {socialLinks.map(({ icon, href }, index) => (
32
33
  <Button
33
34
  asChild
34
- key={`social-${href}-${index}`} // More descriptive prefix
35
+ key={`social-${href}-${index}`}
35
36
  size="icon"
36
37
  variant="outline"
37
38
  >
@@ -40,32 +41,28 @@ export function Footer() {
40
41
  ))}
41
42
  </div>
42
43
 
43
- <div className="flex gap-4">
44
- <Button asChild className="h-11">
45
- <a href="#">
46
- <GooglePlayIcon className="size-5" />
47
- <div className="flex flex-col items-start justify-center pr-2 text-left">
48
- <span className="font-light text-[10px] leading-none tracking-tighter">
49
- GET IT ON
50
- </span>
51
- <p className="font-bold text-base leading-none">
52
- Google Play
53
- </p>
54
- </div>
55
- </a>
56
- </Button>
57
-
58
- <Button asChild className="h-11">
59
- <a href="#">
60
- <AppleIcon className="size-5" />
61
- <div className="flex flex-col items-start justify-center pr-2 text-left">
62
- <span className="text-[10px] leading-none tracking-tighter">
63
- Download on the
64
- </span>
65
- <p className="font-bold text-base leading-none">App Store</p>
66
- </div>
67
- </a>
68
- </Button>
44
+ <div className="flex w-full flex-col gap-3 sm:w-auto sm:flex-row sm:items-center">
45
+ <div className="max-w-xs">
46
+ <p className="font-medium text-sm">Stay in the loop</p>
47
+ <p className="text-muted-foreground text-xs">
48
+ Product notes and resources, sent occasionally.
49
+ </p>
50
+ </div>
51
+ <form className="flex w-full flex-col gap-2 sm:w-auto sm:flex-row">
52
+ <label className="sr-only" htmlFor="footer-email">
53
+ Email address
54
+ </label>
55
+ <Input
56
+ className="sm:w-56"
57
+ id="footer-email"
58
+ placeholder="Email address"
59
+ size="sm"
60
+ type="email"
61
+ />
62
+ <Button className="w-full sm:w-auto" size="sm" type="submit">
63
+ Subscribe
64
+ </Button>
65
+ </form>
69
66
  </div>
70
67
  </div>
71
68
  <div className="h-px bg-border" />
@@ -7,18 +7,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
7
7
  xmlns="http://www.w3.org/2000/svg"
8
8
  {...props}
9
9
  >
10
- <defs>
11
- <linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
12
- <stop stopColor="#38A3FF" />
13
- <stop offset="0.55" stopColor="#1266F1" />
14
- <stop offset="1" stopColor="#0B3FD8" />
15
- </linearGradient>
16
-
17
- <linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
18
- <stop stopColor="#FFFFFF" stopOpacity="0.9" />
19
- <stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
20
- </linearGradient>
21
- </defs>
10
+
22
11
 
23
12
  <g transform="translate(0 0)">
24
13
  <rect
@@ -27,7 +16,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
27
16
  width="48"
28
17
  height="48"
29
18
  rx="12"
30
- fill="url(#loveui-blue)"
19
+ fill="#1266F1"
31
20
  />
32
21
 
33
22
  <path
@@ -70,7 +59,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
70
59
  H18
71
60
  C19.7 29 21 27.7 21 25
72
61
  Z"
73
- fill="url(#loveui-shine)"
62
+ fill="#BBD8FF"
74
63
  opacity="0.5"
75
64
  />
76
65
  </g>
@@ -44,9 +44,9 @@ export function StickyFooter({ preview = false }: StickyFooterProps) {
44
44
  aria-hidden
45
45
  className="absolute inset-0 isolate z-0 opacity-50 contain-strict dark:opacity-60"
46
46
  >
47
- <div className="absolute top-0 left-0 h-320 w-140 -translate-y-87.5 -rotate-45 rounded-full bg-[radial-gradient(68.54%_68.72%_at_55.02%_31.46%,--theme(--color-foreground/.06)_0,hsla(0,0%,55%,.02)_50%,--theme(--color-foreground/.01)_80%)]" />
48
- <div className="absolute top-0 left-0 h-320 w-60 -rotate-45 rounded-full bg-[radial-gradient(50%_50%_at_50%_50%,--theme(--color-foreground/.04)_0,--theme(--color-foreground/.01)_80%,transparent_100%)] [translate:5%_-50%]" />
49
- <div className="absolute top-0 left-0 h-320 w-60 -translate-y-87.5 -rotate-45 rounded-full bg-[radial-gradient(50%_50%_at_50%_50%,--theme(--color-foreground/.04)_0,--theme(--color-foreground/.01)_80%,transparent_100%)]" />
47
+ <div className="absolute top-0 left-0 h-320 w-140 -translate-y-87.5 -rotate-45 rounded-full" />
48
+ <div className="absolute top-0 left-0 h-320 w-60 -rotate-45 rounded-full [translate:5%_-50%]" />
49
+ <div className="absolute top-0 left-0 h-320 w-60 -translate-y-87.5 -rotate-45 rounded-full" />
50
50
  </div>
51
51
  <div className="relative mx-auto flex size-full max-w-6xl flex-col justify-between gap-5">
52
52
  <div className="grid grid-cols-1 gap-8 px-4 pt-12 md:grid-cols-2 lg:grid-cols-4">