Skip to content

Commit 00d8d82

Browse files
V48 (impl-only): Polish marketing QuantumOrb and fix local particles
Tighten marketing outer chrome and ring layout, keep compact telemetry isolated, fix ParticleLayer for Strict Mode (main-thread draw), and add sparse edge-to-edge particles with inner-ring swallow.
1 parent af2772e commit 00d8d82

4 files changed

Lines changed: 318 additions & 323 deletions

File tree

apps/uapi/components/bitcode/effects/quantum-orb/QuantumOrb/QuantumOrb.tsx

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,9 @@ function QuantumOrb({
253253
// Heavy canvas-based layers only mount when the orb is in the *active*
254254
// state. Hover now keeps things lightweight (pure CSS + SVG) so just
255255
// moving the cursor over multiple orbs doesn’t spike paint time.
256-
// Telemetry-sized orbs skip wavy blobs (they smear at 24px) but keep a
257-
// small particle field + compact glow so the running loader has motion
258-
// matching the marketing verified-access mark.
256+
// Compact (size < 48) only: skip wavy blobs (they smear at 24px) and use a
257+
// slightly lower particle quality floor so telemetry loaders still move on
258+
// mid-spec devices. Marketing sizes (size ≥ 48) keep the pre-compact gates.
259259
const showWavyBlobs =
260260
renderDynamic &&
261261
!isCompactTelemetrySize &&
@@ -265,7 +265,7 @@ function QuantumOrb({
265265
const showParticles =
266266
renderDynamic &&
267267
orbConfig.showParticles &&
268-
qualityMultiplier >= 0.5 &&
268+
qualityMultiplier >= (isCompactTelemetrySize ? 0.5 : 0.6) &&
269269
state === 'active';
270270

271271
// Handle mouse enter/leave
@@ -327,14 +327,16 @@ function QuantumOrb({
327327

328328
// Compact telemetry: fill most of the square (marketing-like soft tile),
329329
// not a tiny core inside multi-frame chrome.
330+
// Marketing outer chrome: slightly tighter than the old -10/-15 so the
331+
// containing frame hugs the same-size inner mark with less empty pad.
330332
const coreInset = isCompactTelemetrySize ? '0%' : '8%';
331333
const coreBlurPx = isCompactTelemetrySize ? 0 : 2;
332334
const outerGlowInsetPx = isCompactTelemetrySize
333335
? -Math.max(2, Math.round(size * 0.18))
334-
: -10;
336+
: -6;
335337
const activeFrameInsetPx = isCompactTelemetrySize
336338
? -Math.max(1, Math.round(size * 0.06))
337-
: -15;
339+
: -9;
338340
const outerGlowBlurPx = isCompactTelemetrySize
339341
? 0
340342
: state === 'active'
@@ -407,11 +409,18 @@ function QuantumOrb({
407409
position: 'absolute',
408410
inset: coreInset,
409411
borderRadius: 0,
410-
// Compact: soft filled mint tile (landing mark). Large: lighter halo.
412+
// Compact: soft filled mint tile. Marketing: pre-compact halo only.
411413
background: isCompactTelemetrySize
412414
? `radial-gradient(circle at 50% 40%, #ecfdf5 0%, ${orbConfig.glowColor} 42%, ${orbConfig.glowColor}bb 78%, ${orbConfig.glowColor}55 100%)`
413415
: `radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.28) 0%, rgba(255, 255, 255, 0.18) 46%, ${orbConfig.glowColor}22 72%, transparent 88%)`,
414-
opacity: state === 'active' ? 0.98 : 0.82,
416+
// Compact densifies the tile; marketing keeps pre-compact opacities.
417+
opacity: isCompactTelemetrySize
418+
? state === 'active'
419+
? 0.98
420+
: 0.82
421+
: state === 'active'
422+
? 0.95
423+
: 0.8,
415424
...(coreBlurPx > 0 ? { filter: `blur(${coreBlurPx}px)` } : null),
416425
willChange: 'transform, opacity',
417426
transform: 'translateZ(0)',
@@ -478,9 +487,13 @@ function QuantumOrb({
478487
count={
479488
isCompactTelemetrySize
480489
? compactParticleCount
481-
: Math.round(
482-
(state === 'active' ? 20 : state === 'hover' ? 15 : 10) *
483-
qualityMultiplier,
490+
: Math.max(
491+
1,
492+
Math.round(
493+
// Sparse shooting discs (deployed marketing look).
494+
(state === 'active' ? 3 : state === 'hover' ? 2 : 2) *
495+
qualityMultiplier,
496+
),
484497
)
485498
}
486499
speed={stateProps.particleSpeed * qualityMultiplier}

apps/uapi/components/bitcode/effects/quantum-orb/layers/OrbitalRings/OrbitalRings.tsx

Lines changed: 14 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function OrbitalRings({
6464

6565
return (
6666
<>
67-
{/* Concentric square frames (still rotate for motion). */}
67+
{/* Soft fill glow may still spin — lava motion lives in Glow/Wavy layers. */}
6868
<motion.div
6969
className="quantum-orb-ring quantum-orb-ring-glow"
7070
style={{
@@ -91,70 +91,42 @@ export function OrbitalRings({
9191
}
9292
/>
9393

94-
<motion.div
94+
{/* Hard border-boxes stay axis-aligned (no rotation).
95+
Outer 5.5%, middle 12%, inner 36% pure black + dark shadow.
96+
Paint order unchanged: rings still sit under wavy + glow. */}
97+
<div
9598
className="quantum-orb-ring quantum-orb-ring-outer"
9699
style={{
97100
position: 'absolute',
98-
inset: '3%',
101+
inset: '5.5%',
99102
borderRadius: 0,
100103
border: `1px solid ${color}`,
101104
opacity: getOpacity(0.2),
102105
}}
103-
animate={isAnimating ? { rotate: 360 } : undefined}
104-
transition={
105-
isAnimating
106-
? {
107-
duration: 60000 / (speed * 0.25),
108-
ease: 'linear',
109-
repeat: Infinity,
110-
repeatType: 'loop',
111-
}
112-
: undefined
113-
}
114106
/>
115107

116-
<motion.div
108+
<div
117109
className="quantum-orb-ring quantum-orb-ring-middle"
118110
style={{
119111
position: 'absolute',
120-
inset: '15%',
112+
inset: '12%',
121113
borderRadius: 0,
122114
border: `1px solid ${color}`,
123115
opacity: getOpacity(0.3),
124116
}}
125-
animate={isAnimating ? { rotate: -360 } : undefined}
126-
transition={
127-
isAnimating
128-
? {
129-
duration: 60000 / (speed * 0.5),
130-
ease: 'linear',
131-
repeat: Infinity,
132-
repeatType: 'loop',
133-
}
134-
: undefined
135-
}
136117
/>
137118

138-
<motion.div
119+
<div
139120
className="quantum-orb-ring quantum-orb-ring-inner"
140121
style={{
141122
position: 'absolute',
142-
inset: '30%',
123+
inset: '36%',
143124
borderRadius: 0,
144-
border: `1px solid ${color}`,
145-
opacity: getOpacity(0.4),
125+
border: '1px solid #000000',
126+
opacity: 0.5,
127+
boxShadow:
128+
'0 0 4px rgba(0, 0, 0, 0.85), 0 0 8px rgba(0, 0, 0, 0.55), inset 0 0 2px rgba(0, 0, 0, 0.9)',
146129
}}
147-
animate={isAnimating ? { rotate: 360 } : undefined}
148-
transition={
149-
isAnimating
150-
? {
151-
duration: 60000 / speed,
152-
ease: 'linear',
153-
repeat: Infinity,
154-
repeatType: 'loop',
155-
}
156-
: undefined
157-
}
158130
/>
159131
</>
160132
);

0 commit comments

Comments
 (0)