@checkstack/ui 1.3.0 → 1.3.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @checkstack/ui
2
2
 
3
+ ## 1.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 765b764: Optimize AmbientBackground performance by replacing thousand-div grid with a single-element CSS mask and hardware-accelerated Aurora Mesh animations.
8
+
3
9
  ## 1.3.0
4
10
 
5
11
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checkstack/ui",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "dependencies": {
@@ -1,4 +1,4 @@
1
- import React, { useMemo, useEffect, useState } from "react";
1
+ import React from "react";
2
2
  import { cn } from "../utils";
3
3
 
4
4
  interface AmbientBackgroundProps {
@@ -6,53 +6,15 @@ interface AmbientBackgroundProps {
6
6
  className?: string;
7
7
  }
8
8
 
9
- const TILE_SIZE = 48;
10
-
11
9
  /**
12
- * AmbientBackground - Animated checkerboard pattern
13
- * Features a chess-inspired grid where random tiles glow with the primary color.
14
- * Dynamically adapts to screen size.
10
+ * AmbientBackground - High-performance background pattern
11
+ * Features an "Inverse Glow Grid" where aurora effects shine through transparent grid lines.
12
+ * Provides a premium "glowing grid" aesthetic with minimal performance impact.
15
13
  */
16
14
  export const AmbientBackground: React.FC<AmbientBackgroundProps> = ({
17
15
  children,
18
16
  className,
19
17
  }) => {
20
- const [dimensions, setDimensions] = useState({ cols: 40, rows: 25 });
21
-
22
- // Calculate grid size based on viewport
23
- useEffect(() => {
24
- const updateDimensions = () => {
25
- const cols = Math.ceil(globalThis.innerWidth / TILE_SIZE) + 2;
26
- const rows = Math.ceil(globalThis.innerHeight / TILE_SIZE) + 2;
27
- setDimensions({ cols, rows });
28
- };
29
-
30
- updateDimensions();
31
- globalThis.addEventListener("resize", updateDimensions);
32
- return () => globalThis.removeEventListener("resize", updateDimensions);
33
- }, []);
34
-
35
- // Generate tile grid with staggered animation delays
36
- const tiles = useMemo(() => {
37
- const { cols, rows } = dimensions;
38
- const result: Array<{ key: string; delay: number; isLight: boolean }> = [];
39
-
40
- for (let row = 0; row < rows; row++) {
41
- for (let col = 0; col < cols; col++) {
42
- const isLight = (row + col) % 2 === 0;
43
- // Negative delay so tiles start at different points in their 12s cycle
44
- // This creates a gentle, staggered breathing effect across the grid
45
- const delay = -((row * 7 + col * 13 + row * col) % 24) * 0.5;
46
- result.push({
47
- key: `${row}-${col}`,
48
- delay,
49
- isLight,
50
- });
51
- }
52
- }
53
- return result;
54
- }, [dimensions]);
55
-
56
18
  return (
57
19
  <div
58
20
  className={cn(
@@ -60,40 +22,49 @@ export const AmbientBackground: React.FC<AmbientBackgroundProps> = ({
60
22
  className
61
23
  )}
62
24
  >
63
- {/* Checkerboard grid - covers full viewport */}
64
- <div
65
- className="pointer-events-none fixed inset-0 overflow-hidden"
66
- style={{
67
- display: "grid",
68
- gridTemplateColumns: `repeat(${dimensions.cols}, ${TILE_SIZE}px)`,
69
- gridTemplateRows: `repeat(${dimensions.rows}, ${TILE_SIZE}px)`,
70
- }}
71
- >
72
- {tiles.map(({ key, delay, isLight }) => (
73
- <div
74
- key={key}
75
- className="tile-glow"
76
- style={
77
- {
78
- width: TILE_SIZE,
79
- height: TILE_SIZE,
80
- backgroundColor: isLight
81
- ? "hsl(var(--muted-foreground) / 0.12)"
82
- : "hsl(var(--muted-foreground) / 0.04)",
83
- "--glow-delay": `${delay}s`,
84
- } as React.CSSProperties
85
- }
86
- />
87
- ))}
25
+ {/* Performance optimized background layers */}
26
+ <div className="pointer-events-none fixed inset-0 overflow-hidden">
27
+ {/* Layer 1: Aurora Blobs (Bottom) - Hardware accelerated via transform/compositor */}
28
+ <div
29
+ className="aurora-blob absolute w-[50%] h-[50%] -top-[10%] -left-[10%]"
30
+ style={{
31
+ background: "radial-gradient(circle at center, hsl(var(--primary) / 0.8), transparent 60%)",
32
+ animation: "aurora-float-1 25s ease-in-out infinite",
33
+ }}
34
+ />
35
+ <div
36
+ className="aurora-blob absolute w-[40%] h-[40%] bottom-[10%] right-[10%]"
37
+ style={{
38
+ background: "radial-gradient(circle at center, hsl(var(--chart-2) / 0.7), transparent 60%)",
39
+ animation: "aurora-float-2 20s ease-in-out infinite",
40
+ }}
41
+ />
42
+ <div
43
+ className="aurora-blob absolute w-[35%] h-[35%] top-[30%] left-[40%]"
44
+ style={{
45
+ background: "radial-gradient(circle at center, hsl(var(--primary) / 0.6), transparent 60%)",
46
+ animation: "aurora-float-3 30s ease-in-out infinite",
47
+ }}
48
+ />
49
+ <div
50
+ className="aurora-blob absolute w-[45%] h-[45%] bottom-[20%] left-[10%]"
51
+ style={{
52
+ background: "radial-gradient(circle at center, hsl(var(--chart-1) / 0.5), transparent 60%)",
53
+ animation: "aurora-float-4 35s ease-in-out infinite",
54
+ }}
55
+ />
56
+
57
+ {/* Layer 2: Inverse Grid Mask (Top) - Transparent lines on a solid background */}
58
+ <div className="ambient-grid-inverse absolute inset-0 overflow-hidden" />
88
59
  </div>
89
60
 
90
- {/* Edge vignette to fade out the grid smoothly */}
61
+ {/* Layer 3: Edge vignette to fade out the background smoothly */}
91
62
  <div
92
63
  className="pointer-events-none fixed inset-0"
93
64
  style={{
94
65
  background: `
95
- linear-gradient(to right, hsl(var(--background)) 0%, transparent 5%, transparent 95%, hsl(var(--background)) 100%),
96
- linear-gradient(to bottom, hsl(var(--background)) 0%, transparent 8%, transparent 92%, hsl(var(--background)) 100%)
66
+ linear-gradient(to right, hsl(var(--background)) 0%, transparent 15%, transparent 85%, hsl(var(--background)) 100%),
67
+ linear-gradient(to bottom, hsl(var(--background)) 0%, transparent 15%, transparent 85%, hsl(var(--background)) 100%)
97
68
  `,
98
69
  }}
99
70
  />
package/src/themes.css CHANGED
@@ -143,41 +143,15 @@
143
143
 
144
144
  /* Custom animations */
145
145
  @keyframes bell-ring {
146
- 0% {
147
- transform: rotate(0deg);
148
- }
149
-
150
- 10% {
151
- transform: rotate(15deg);
152
- }
153
-
154
- 20% {
155
- transform: rotate(-15deg);
156
- }
157
-
158
- 30% {
159
- transform: rotate(10deg);
160
- }
161
-
162
- 40% {
163
- transform: rotate(-10deg);
164
- }
165
-
166
- 50% {
167
- transform: rotate(5deg);
168
- }
169
-
170
- 60% {
171
- transform: rotate(-5deg);
172
- }
173
-
174
- 70% {
175
- transform: rotate(0deg);
176
- }
177
-
178
- 100% {
179
- transform: rotate(0deg);
180
- }
146
+ 0% { transform: rotate(0deg); }
147
+ 10% { transform: rotate(15deg); }
148
+ 20% { transform: rotate(-15deg); }
149
+ 30% { transform: rotate(10deg); }
150
+ 40% { transform: rotate(-10deg); }
151
+ 50% { transform: rotate(5deg); }
152
+ 60% { transform: rotate(-5deg); }
153
+ 70% { transform: rotate(0deg); }
154
+ 100% { transform: rotate(0deg); }
181
155
  }
182
156
 
183
157
  .animate-bell-ring {
@@ -185,20 +159,48 @@
185
159
  transform-origin: top center;
186
160
  }
187
161
 
188
- /* Subtle tile pulse animation - gentle breathing effect */
189
- @keyframes tile-pulse {
162
+ /* High-performance ambient background styles */
163
+ @keyframes aurora-float-1 {
164
+ 0% { transform: translate(-15vw, -10vh) rotate(0deg); }
165
+ 50% { transform: translate(35vw, 25vh) rotate(180deg); }
166
+ 100% { transform: translate(-15vw, -10vh) rotate(360deg); }
167
+ }
190
168
 
191
- 0%,
192
- 100% {
193
- opacity: 1;
194
- }
169
+ @keyframes aurora-float-2 {
170
+ 0% { transform: translate(0, 0) scale(1); }
171
+ 50% { transform: translate(-30vw, 25vh) scale(1.2); }
172
+ 100% { transform: translate(0, 0) scale(1); }
173
+ }
195
174
 
196
- 50% {
197
- opacity: 0.4;
198
- }
175
+ @keyframes aurora-float-3 {
176
+ 0% { transform: translate(0, 0) rotate(0deg); }
177
+ 50% { transform: translate(25vw, -30vh) rotate(-180deg); }
178
+ 100% { transform: translate(0, 0) rotate(-360deg); }
179
+ }
180
+
181
+ @keyframes aurora-float-4 {
182
+ 0% { transform: translate(0, 0) scale(1.1); }
183
+ 50% { transform: translate(-20vw, -20vh) scale(1); }
184
+ 100% { transform: translate(0, 0) scale(1.1); }
185
+ }
186
+
187
+ .ambient-grid {
188
+ background-image:
189
+ linear-gradient(to right, hsl(var(--muted-foreground) / 0.15) 1px, transparent 1px),
190
+ linear-gradient(to bottom, hsl(var(--muted-foreground) / 0.15) 1px, transparent 1px);
191
+ background-size: 48px 48px;
192
+ }
193
+
194
+ .ambient-grid-inverse {
195
+ background: hsl(var(--background));
196
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='48' height='48' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='47' height='47' fill='black'/%3E%3C/svg%3E");
197
+ mask-image: url("data:image/svg+xml,%3Csvg width='48' height='48' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='47' height='47' fill='black'/%3E%3C/svg%3E");
199
198
  }
200
199
 
201
- .tile-glow {
202
- animation: tile-pulse 12s ease-in-out infinite;
203
- animation-delay: var(--glow-delay, 0s);
200
+ .aurora-blob {
201
+ position: absolute;
202
+ filter: blur(60px);
203
+ opacity: 0.6;
204
+ pointer-events: none;
205
+ will-change: transform;
204
206
  }