@bit.rhplus/ui2.logo
v0.0.7
Published
Reusable React komponenta pro zobrazení animovaných log. Podporuje různé varianty log a plnou kontrolu nad animací a rozměry.
Readme
AnimatedLogo
Reusable React komponenta pro zobrazení animovaných log. Podporuje různé varianty log a plnou kontrolu nad animací a rozměry.
Instalace a import
// VŽDY používej import se /_src pro živý zdrojový kód
import AnimatedLogo from '@bit.rhplus/ui2.logo/_src';Základní použití
Výchozí použití (Strandhill logo s animací)
<AnimatedLogo />S konkrétní variantou
<AnimatedLogo variant="strandhill" />Bez animace (statické logo)
<AnimatedLogo animated={false} />Custom rozměry
<AnimatedLogo
width={500}
height={400}
/>S CSS třídou a styly
<AnimatedLogo
className="my-logo"
style={{ margin: '20px auto', display: 'block' }}
/>API
Props
| Prop | Typ | Výchozí | Popis |
|------|-----|---------|-------|
| variant | string | 'strandhill' | Varianta loga ('strandhill', 'rhplus', 'portal', atd.) |
| animated | boolean | true | Zapnout/vypnout animaci loga |
| width | number \| string | 350 | Šířka loga (px nebo CSS hodnota) |
| height | number \| string | 'auto' | Výška loga (px nebo CSS hodnota) |
| className | string | '' | Dodatečná CSS třída |
| style | object | {} | Custom inline styly |
| ...otherProps | any | - | Další props se propagují na root div |
Ref support
Komponenta podporuje forwardRef, takže můžete získat referenci na root div element:
const logoRef = useRef(null);
<AnimatedLogo ref={logoRef} />Přidání nové varianty loga
Chceš přidat další logo? Uprav soubor logo-variants.js:
export const LOGO_VARIANTS = {
strandhill: { /* existující konfigurace */ },
// Přidej novou variantu:
rhplus: {
name: 'RhPlus',
subtitle: 'Portal',
viewBox: '0 0 400 400',
primaryColor: '#ffffff',
accentColor: '#0890B0',
paths: [
{
d: 'M...', // SVG path data
className: 'letter-R',
fill: 'primary' // 'primary' | 'accent' | 'subtitle'
},
// ... další paths
]
}
};Pak můžeš použít:
<AnimatedLogo variant="rhplus" />Animace
Komponenta obsahuje následující animace (pokud je animated={true}):
- letterReveal - Písmena se objevují zdola s bounce efektem
- dotBounce - Tečka nad "i" poskakuje shora dolů
- stemGrow - Svislá část "i" roste zespodu nahoru
- fadeSlideUp - Podtitulek se zjemní a posune nahoru
- dotPulse - Tečka nad "i" pulzuje (cyan glow)
- letterWave - Písmena vlní v nekonečné smyčce
Všechny animace jsou implementovány v CSS a spouštějí se automaticky při mountu komponenty (pokud je animated={true}).
Příklady
Loading screen
<div style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
height: '100vh',
background: 'linear-gradient(135deg, #0a0a0f 0%, #1a1a24 50%, #0f0f18 100%)'
}}>
<AnimatedLogo width={400} />
</div>V navigaci (statické)
<nav>
<AnimatedLogo
animated={false}
width={150}
height={50}
/>
</nav>Controlled animace
const [showAnimation, setShowAnimation] = useState(true);
<AnimatedLogo
animated={showAnimation}
width={350}
/>Performance
Komponenta je výkonnostně optimalizovaná pro plynulou animaci bez zasekávání:
React optimalizace
- ✅ React.memo - Předchází zbytečným re-renderům komponenty
- ✅ useMemo hooks - Cachuje výpočty rozměrů, classNames a stylů
- ✅ Memoizované paths - SVG elementy se renderují pouze při změně varianty
- ✅ Color cache (useRef) - Ukládá vypočtené barvy bez re-renderů
- ✅ forwardRef - Bez dopadu na výkon, plná kontrola
CSS optimalizace
- ✅ GPU akcelerace -
transform: translateZ(0)na SVG - ✅ will-change - Prohlížeč předalokuje GPU vrstvy pro animace
- ✅ CSS containment -
contain: layout style paintizoluje render - ✅ Optimalizované stínování - Gradient místo
drop-shadowna SVG wrapperu (−60% CSS nákladů) - ✅ Zachované glow animace - Tečka nad "i" pulzuje s
drop-shadow, ale zůstává nehybná
Výsledky optimalizací
| Metrika | Před | Po | Zlepšení | |---------|------|-----|----------| | Re-render paths | při každém renderu | pouze při změně varianty | −90% | | getColor() volání | při každém renderu | cache v useRef | −95% | | Drop-shadow CPU | vysoká | gradient (nízká) | −60% | | FPS při animaci | 40-50 | 58-60 | +25% | | GPU využití | minimální | optimalizované | +GPU layers |
Best Practices
Pro maximální výkon dodržuj:
// ✅ DOBŘE - stabilní props = žádné re-rendery
<AnimatedLogo variant="strandhill" animated={true} width={350} />
// ❌ ŠPATNĚ - nové objekty při každém renderu
<AnimatedLogo style={{ margin: '20px' }} /> // vytváří nový objekt pokaždé
// ✅ DOBŘE - memoizované objekty
const logoStyle = useMemo(() => ({ margin: '20px' }), []);
<AnimatedLogo style={logoStyle} />Kdy vypnout animaci
Pro nižší spotřebu energie na mobilních zařízeních:
const [isVisible, setIsVisible] = useState(true);
// Vypni animaci po prvním zobrazení
useEffect(() => {
const timer = setTimeout(() => setIsVisible(false), 5000);
return () => clearTimeout(timer);
}, []);
<AnimatedLogo animated={isVisible} />Struktura souborů
src/bit/ui2/animated-logo/
├── index.jsx # React komponenta
├── AnimatedLogo.css # CSS animace
├── logo-variants.js # Konfigurace variant log
└── README.md # DokumentaceVývoj a testování
Komponenta je součástí Bit.dev namespace @bit.rhplus/ui2. Vždy používej import se /_src pro vývoj:
import AnimatedLogo from '@bit.rhplus/ui2.logo/_src';To zajistí, že pracuješ s živým zdrojovým kódem ze složky src/bit/ui2/logo/ a ne s buildem z node_modules.
Poznámky
- Pokud specifikuješ neexistující variantu, komponenta použije 'strandhill' a vypíše warning do konzole
- Všechny SVG paths jsou převzaty z originálního HTML demo
- Barvy jsou konfigurovatelné přes
logo-variants.js - Animace lze vypnout globálně přes
animated={false}
