loader-pack 1.2.4 → 2.0.0

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/README.md CHANGED
@@ -1,19 +1,24 @@
1
1
  # loader-pack
2
2
 
3
- A beautiful, cinematic intro/loader screen for React apps. Drop it in and give your portfolio, SPA, or landing page a stunning animated entry.
3
+ Beautiful, animated intro/loader screens for React apps. Pick from 5 design variants (or import just the one you need) and give your portfolio, SPA, or landing page a stunning entry.
4
4
 
5
5
  ![npm](https://img.shields.io/npm/v/loader-pack)
6
6
  ![license](https://img.shields.io/npm/l/loader-pack)
7
+ ![bundle size](https://img.shields.io/bundlephobia/minzip/loader-pack)
7
8
 
8
- ## Features
9
+ ---
9
10
 
10
- - Scrolling multilingual marquee (Hello in 12+ languages + code snippets)
11
- - Animated name reveal with scale + stroke effect
12
- - Smooth zoom-out transition into your app content
13
- - Dark & light themes
14
- - Optional ambient & click sound effects
15
- - Fully customizable marquee text
16
- - Zero runtime dependencies (only React as a peer dep)
11
+ ## Variants
12
+
13
+ | Variant | Style | Preview |
14
+ |---------|-------|---------|
15
+ | `classic` | Animated name reveal, multilingual marquee, date/time | Clean & cinematic |
16
+ | `terminal` | CLI boot sequence, macOS-style title bar | Developer vibes |
17
+ | `minimal` | Ultra-clean fade-in with bordered button | Less is more |
18
+ | `spotlight` | Volumetric light beam with rays from corner | Dramatic & elegant |
19
+ | `glitch` | RGB channel-split text, pixel cat, scanlines | Cyberpunk energy |
20
+
21
+ ---
17
22
 
18
23
  ## Installation
19
24
 
@@ -21,71 +26,155 @@ A beautiful, cinematic intro/loader screen for React apps. Drop it in and give y
21
26
  npm install loader-pack
22
27
  ```
23
28
 
29
+ > **Peer dependencies:** `react >=18.0.0` and `react-dom >=18.0.0`
30
+
31
+ Don't forget to import the styles:
32
+
33
+ ```tsx
34
+ import "loader-pack/styles";
35
+ ```
36
+
37
+ ---
38
+
24
39
  ## Quick Start
25
40
 
41
+ ### Option 1: Single component with `variant` prop
42
+
43
+ The simplest way — one import, pick your variant:
44
+
26
45
  ```tsx
27
46
  import { LoaderPack } from "loader-pack";
28
47
  import "loader-pack/styles";
29
48
 
30
49
  function App() {
31
50
  return (
32
- <LoaderPack name="Your Name" theme="dark">
33
- <div>
34
- <h1>Welcome to my site!</h1>
35
- <p>Your main content goes here.</p>
36
- </div>
51
+ <LoaderPack variant="glitch" name="Your Name" theme="dark">
52
+ {/* Your app content goes here — shown after the loader */}
53
+ <main>
54
+ <h1>Welcome to my site</h1>
55
+ </main>
37
56
  </LoaderPack>
38
57
  );
39
58
  }
40
59
  ```
41
60
 
61
+ ### Option 2: Direct import (tree-shakeable)
62
+
63
+ Import only the variant you need — smaller bundle:
64
+
65
+ ```tsx
66
+ import { GlitchLoader } from "loader-pack";
67
+ import "loader-pack/styles";
68
+
69
+ function App() {
70
+ return (
71
+ <GlitchLoader name="Your Name" theme="dark">
72
+ <main>
73
+ <h1>Welcome to my site</h1>
74
+ </main>
75
+ </GlitchLoader>
76
+ );
77
+ }
78
+ ```
79
+
80
+ Available standalone imports: `ClassicLoader`, `TerminalLoader`, `MinimalLoader`, `SpotlightLoader`, `GlitchLoader`
81
+
82
+ ---
83
+
42
84
  ## Props
43
85
 
86
+ ### `<LoaderPack>` props
87
+
44
88
  | Prop | Type | Default | Description |
45
- | --- | --- | --- | --- |
46
- | `name` | `string` | *required* | Large centered display name |
47
- | `children` | `ReactNode` | *required* | Content shown after clicking Start |
48
- | `theme` | `"dark" \| "light"` | `"dark"` | Color scheme |
49
- | `sound` | `boolean` | `false` | Enable ambient & click sounds |
50
- | `ambientSoundSrc` | `string` | `"/loader-sound.mp3"` | Path to ambient sound file |
51
- | `clickSoundSrc` | `string` | `"/click.mp3"` | Path to click sound file |
52
- | `marqueeText` | `string` | multilingual default | Custom scrolling marquee text |
89
+ |------|------|---------|-------------|
90
+ | `variant` | `"classic" \| "terminal" \| "minimal" \| "spotlight" \| "glitch"` | `"classic"` | Which loader design to use |
91
+ | `name` | `string` | **required** | The name displayed in the loader |
92
+ | `children` | `ReactNode` | **required** | Your app content (revealed after start) |
93
+ | `theme` | `"dark" \| "light"` | `"dark"` | Color theme |
94
+ | `sound` | `boolean` | `false` | Enable ambient & click sound effects |
95
+ | `ambientSoundSrc` | `string` | built-in | Custom ambient sound file path |
96
+ | `clickSoundSrc` | `string` | built-in | Custom click sound file path |
97
+ | `marqueeText` | `string` | built-in | Custom scrolling marquee text (classic variant) |
53
98
 
54
- ## Examples
99
+ All standalone loaders (`ClassicLoader`, etc.) accept the same props except `variant`.
55
100
 
56
- ### Dark theme (default)
101
+ ---
102
+
103
+ ## Customization Examples
57
104
 
105
+ ### Dark theme (default)
58
106
  ```tsx
59
- <LoaderPack name="Jane Doe">
60
- <YourApp />
107
+ <LoaderPack variant="spotlight" name="Jane Doe" theme="dark">
108
+ <App />
61
109
  </LoaderPack>
62
110
  ```
63
111
 
64
- ### Light theme with sound
112
+ ### Light theme
113
+ ```tsx
114
+ <LoaderPack variant="terminal" name="Jane Doe" theme="light">
115
+ <App />
116
+ </LoaderPack>
117
+ ```
65
118
 
119
+ ### With sound effects
66
120
  ```tsx
67
- <LoaderPack name="Jane Doe" theme="light" sound>
68
- <YourApp />
121
+ <LoaderPack variant="classic" name="Jane Doe" sound>
122
+ <App />
69
123
  </LoaderPack>
70
124
  ```
71
125
 
72
- ### Custom marquee
126
+ ### Custom sounds
127
+ ```tsx
128
+ <LoaderPack
129
+ variant="minimal"
130
+ name="Jane Doe"
131
+ ambientSoundSrc="/audio/my-ambient.wav"
132
+ clickSoundSrc="/audio/my-click.wav"
133
+ sound
134
+ >
135
+ <App />
136
+ </LoaderPack>
137
+ ```
73
138
 
139
+ ### Custom marquee text (classic variant)
74
140
  ```tsx
75
141
  <LoaderPack
76
- name="Studio X"
77
- marqueeText="Design • Code • Ship • Repeat • "
142
+ variant="classic"
143
+ name="Jane Doe"
144
+ marqueeText="React • TypeScript • Node.js • Next.js • GraphQL •"
78
145
  >
79
- <YourApp />
146
+ <App />
80
147
  </LoaderPack>
81
148
  ```
82
149
 
83
- ## How It Works
150
+ ---
151
+
152
+ ## How it works
153
+
154
+ 1. The loader renders full-screen over your app
155
+ 2. It plays the intro animation for the chosen variant
156
+ 3. User clicks/taps the start action (button, pixel cat, etc.)
157
+ 4. The loader smoothly transitions out, revealing your `children`
158
+
159
+ The `children` content is only mounted after the user clicks start, so your app code doesn't run until the intro is complete.
160
+
161
+ ---
162
+
163
+ ## TypeScript
164
+
165
+ All types are exported:
166
+
167
+ ```tsx
168
+ import type { LoaderPackProps, LoaderProps, LoaderVariant } from "loader-pack";
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Browser Support
174
+
175
+ Works in all modern browsers (Chrome, Firefox, Safari, Edge). Uses CSS custom properties and standard React 18+ APIs.
84
176
 
85
- 1. The loader screen appears full-screen with a marquee, your name, date/time, and a Start button
86
- 2. User clicks **Start →**
87
- 3. The screen zooms out with a smooth opacity transition
88
- 4. Your `children` content fades in
177
+ ---
89
178
 
90
179
  ## License
91
180
 
@@ -1,2 +1,16 @@
1
1
  import { LoaderPackProps } from './types';
2
- export default function LoaderPack({ name, children, theme, sound, cursor, cursorSize, ambientSoundSrc, clickSoundSrc, marqueeText, }: LoaderPackProps): import("react/jsx-runtime").JSX.Element;
2
+ /**
3
+ * Convenience component — picks the right loader via the `variant` prop.
4
+ *
5
+ * ```tsx
6
+ * <LoaderPack variant="terminal" name="Bhavya" theme="dark">
7
+ * <App />
8
+ * </LoaderPack>
9
+ * ```
10
+ *
11
+ * For tree-shaking, import the variant directly instead:
12
+ * ```tsx
13
+ * import { TerminalLoader } from "loader-pack";
14
+ * ```
15
+ */
16
+ export default function LoaderPack({ variant, ...rest }: LoaderPackProps): import("react/jsx-runtime").JSX.Element;
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { default as LoaderPack } from './LoaderPack';
2
- export type { LoaderPackProps } from './types';
2
+ export { ClassicLoader, TerminalLoader, MinimalLoader, SpotlightLoader, GlitchLoader, } from './standalone';
3
+ export type { LoaderPackProps, LoaderProps, LoaderVariant } from './types';
@@ -1 +1 @@
1
- body{font-family:Geist Sans,system-ui,sans-serif}.lp-dark{--lp-bg: #000;--lp-text: #fff;--lp-muted: rgba(255,255,255,.35)}.lp-light{--lp-bg: #fff;--lp-text: #000;--lp-muted: rgba(0,0,0,.35)}.lp-container{position:fixed;inset:0;background:var(--lp-bg);display:flex;align-items:center;justify-content:center;z-index:9999;transition:transform .8s ease,opacity .8s ease}.lp-container,.lp-container *{cursor:none!important}.lp-container.lp-zoom{transform:scale(1.15);opacity:0}.lp-cursor{position:fixed;top:0;left:0;width:34px;height:34px;border-radius:50%;background:#fff;mix-blend-mode:exclusion;pointer-events:none;z-index:10001;will-change:transform}.lp-marquee{position:absolute;top:3%;width:100%;height:40px;overflow:hidden}.lp-track{display:flex;width:max-content;animation:lpScroll 80s linear infinite}.lp-text{font-size:.75rem;letter-spacing:.15em;padding-right:4rem;white-space:nowrap}@keyframes lpScroll{0%{transform:translate(0)}to{transform:translate(-50%)}}.lp-center{position:relative;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center}.lp-name{font-size:clamp(2.2rem,10vw,6rem);font-weight:600;letter-spacing:-.02em;line-height:1.1;text-align:center;-webkit-text-stroke:1px rgba(255,255,255,.9);color:transparent;opacity:0;transform:scale(.28);animation:lpName 1.4s ease forwards}@keyframes lpName{to{opacity:1;transform:scale(1)}}.lp-button-wrapper{height:60px;display:flex;align-items:center;justify-content:center}.lp-button{background:none;border:none;font-size:.85rem;letter-spacing:.2em;text-transform:uppercase;cursor:pointer;opacity:0;animation:lpBtn .8s ease forwards}@keyframes lpBtn{to{opacity:1}}.lp-button:hover{opacity:.6;transform:translate(6px)}.lp-arrow{margin-left:6px}.lp-date,.lp-time{position:absolute;bottom:20px;font-size:.75rem;letter-spacing:.15em;opacity:.7}.lp-date{left:24px}.lp-time{right:24px}.lp-main{opacity:0;transform:translateY(20px) scale(.98)}.lp-main.reveal{animation:lpReveal .9s ease forwards}@keyframes lpReveal{to{opacity:1;transform:translateY(0) scale(1)}}.lp-name,.lp-text,.lp-button,.lp-date,.lp-time{color:var(--lp-text)}.lp-text{opacity:.4}
1
+ body{font-family:Geist Sans,system-ui,sans-serif}.lp-main{opacity:0;transform:translateY(20px) scale(.98)}.lp-main.reveal{animation:lpReveal .9s ease forwards}@keyframes lpReveal{to{opacity:1;transform:translateY(0) scale(1)}}.lp-classic-dark{--lp-bg: #000;--lp-text: #fff;--lp-stroke: rgba(255, 255, 255, .9)}.lp-classic-light{--lp-bg: #fff;--lp-text: #000;--lp-stroke: rgba(0, 0, 0, .85)}.lp-classic{position:fixed;inset:0;background:var(--lp-bg);display:flex;align-items:center;justify-content:center;z-index:9999;transition:transform .8s ease,opacity .8s ease}.lp-classic.lp-classic-zoom{transform:scale(1.15);opacity:0}.lp-classic-marquee{position:absolute;top:3%;width:100%;height:40px;overflow:hidden}.lp-classic-track{display:flex;width:max-content;animation:lpClassicScroll 35s linear infinite}.lp-classic-mtext{font-size:.75rem;letter-spacing:.15em;padding-right:4rem;white-space:nowrap;color:var(--lp-text);opacity:.4}@keyframes lpClassicScroll{0%{transform:translate(0)}to{transform:translate(-50%)}}.lp-classic-center{position:relative;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center}.lp-classic-name{font-size:clamp(2.2rem,10vw,6rem);font-weight:600;letter-spacing:-.02em;line-height:1.1;text-align:center;-webkit-text-stroke:1px var(--lp-stroke);color:transparent;opacity:0;transform:scale(.28);animation:lpClassicName 1.4s ease forwards}@keyframes lpClassicName{to{opacity:1;transform:scale(1)}}.lp-classic-btnwrap{height:60px;display:flex;align-items:center;justify-content:center}.lp-classic-btn{background:none;border:none;font-size:.85rem;letter-spacing:.2em;text-transform:uppercase;cursor:pointer;color:var(--lp-text);opacity:0;animation:lpClassicBtn .8s ease forwards}@keyframes lpClassicBtn{to{opacity:1}}.lp-classic-btn:hover{opacity:.6;transform:translate(6px)}.lp-classic-arrow{margin-left:6px}.lp-classic-date,.lp-classic-time{position:absolute;bottom:20px;font-size:.75rem;letter-spacing:.15em;opacity:.7;color:var(--lp-text)}.lp-classic-date{left:24px}.lp-classic-time{right:24px}.lp-terminal{position:fixed;inset:0;display:flex;flex-direction:column;z-index:9999;font-family:Fira Code,Cascadia Code,JetBrains Mono,Consolas,monospace;transition:transform .8s ease,opacity .8s ease}.lp-terminal.lp-terminal-out{transform:scale(1.06);opacity:0}.lp-terminal-dark{background:#0d1117;color:#39ff14}.lp-terminal-light{background:#f5f5f5;color:#1a7f37}.lp-terminal-header{display:flex;align-items:center;gap:6px;padding:10px 14px;background:#ffffff0d;border-bottom:1px solid rgba(255,255,255,.08)}.lp-terminal-light .lp-terminal-header{background:#0000000a;border-bottom:1px solid rgba(0,0,0,.1)}.lp-terminal-dot{width:12px;height:12px;border-radius:50%}.lp-dot-red{background:#ff5f57}.lp-dot-yellow{background:#febc2e}.lp-dot-green{background:#28c840}.lp-terminal-title{margin-left:10px;font-size:.72rem;opacity:.5}.lp-terminal-body{flex:1;padding:20px 24px;overflow-y:auto}.lp-terminal-line{font-size:.85rem;line-height:1.9;opacity:0;animation:lpTermLine .3s ease forwards}.lp-terminal-prompt{opacity:.5;margin-right:8px}@keyframes lpTermLine{to{opacity:1}}.lp-terminal-action{margin-top:12px}.lp-terminal-btn{background:none;border:none;color:inherit;font-family:inherit;font-size:inherit;cursor:pointer;padding:0;text-decoration:underline;text-underline-offset:3px}.lp-terminal-btn:hover{opacity:.7}.lp-terminal-cursor{animation:lpBlink 1s step-end infinite;margin-left:2px}@keyframes lpBlink{50%{opacity:0}}.lp-minimal{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:9999;transition:opacity .7s ease}.lp-minimal.lp-minimal-out{opacity:0}.lp-minimal-dark{background:#0a0a0a;color:#e0e0e0}.lp-minimal-light{background:#fafafa;color:#1a1a1a}.lp-minimal-center{display:flex;flex-direction:column;align-items:center;gap:32px}.lp-minimal-name{font-size:clamp(1.8rem,7vw,4.5rem);font-weight:300;letter-spacing:.12em;text-transform:uppercase;opacity:0;animation:lpMinFade 1.2s ease forwards}@keyframes lpMinFade{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.lp-minimal-btn{background:none;border:1px solid currentColor;color:inherit;font-size:.72rem;letter-spacing:.25em;text-transform:uppercase;padding:10px 36px;cursor:pointer;opacity:0;animation:lpMinFade .8s ease .1s forwards;transition:background .3s,color .3s}.lp-minimal-dark .lp-minimal-btn:hover{background:#e0e0e0;color:#0a0a0a}.lp-minimal-light .lp-minimal-btn:hover{background:#1a1a1a;color:#fafafa}.lp-spot{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:9999;overflow:hidden;transition:opacity .8s ease}.lp-spot.lp-spot-out{opacity:0}.lp-spot-dark{background:#050505;color:#fff}.lp-spot-light{background:#f0f0f0;color:#111}.lp-spot-glow{position:absolute;inset:0;opacity:0;transition:opacity 1.6s ease;pointer-events:none;overflow:hidden}.lp-spot-glow.lp-spot-on{opacity:1}.lp-spot-glow:before{content:"";position:absolute;top:-20%;left:-10%;width:120%;height:140%;transform-origin:10% 0%;transform:rotate(-5deg);background:conic-gradient(from 120deg at 10% 0%,transparent 0deg,var(--lp-beam-mid) 15deg,var(--lp-beam-bright) 30deg,var(--lp-beam-mid) 50deg,transparent 65deg);filter:blur(30px);animation:lpBeamSweep 6s ease-in-out infinite alternate}.lp-spot-glow:after{content:"";position:absolute;top:-20%;left:-10%;width:120%;height:140%;transform-origin:10% 0%;transform:rotate(-5deg);background:conic-gradient(from 118deg at 10% 0%,transparent 0deg,var(--lp-ray) 3deg,transparent 6deg,transparent 12deg,var(--lp-ray) 15deg,transparent 18deg,transparent 24deg,var(--lp-ray) 27deg,transparent 30deg,transparent 36deg,var(--lp-ray) 39deg,transparent 42deg,transparent 48deg,var(--lp-ray) 51deg,transparent 54deg,transparent 60deg,var(--lp-ray) 63deg,transparent 66deg);filter:blur(8px);opacity:.5;animation:lpBeamSweep 6s ease-in-out infinite alternate}.lp-spot-ambient{position:absolute;width:70%;height:60%;bottom:0;left:10%;border-radius:50%;background:var(--lp-ambient);filter:blur(80px);opacity:0;transition:opacity 2s ease .3s;pointer-events:none}.lp-spot-on~.lp-spot-ambient,.lp-spot-on+*+.lp-spot-ambient{opacity:1}.lp-spot-dark{--lp-beam-bright: rgba(255,255,255,.14);--lp-beam-mid: rgba(255,255,255,.06);--lp-ray: rgba(255,255,255,.07);--lp-ambient: rgba(255,255,255,.06)}.lp-spot-light{--lp-beam-bright: rgba(0,0,0,.1);--lp-beam-mid: rgba(0,0,0,.04);--lp-ray: rgba(0,0,0,.05);--lp-ambient: rgba(0,0,0,.04)}@keyframes lpBeamSweep{0%{transform:rotate(-8deg)}to{transform:rotate(0)}}.lp-spot-center{position:relative;z-index:2;text-align:center;display:flex;flex-direction:column;align-items:center;gap:40px}.lp-spot-name{font-size:clamp(2rem,9vw,6rem);font-weight:600;letter-spacing:.04em;opacity:0;transform:translateY(20px);transition:opacity 1.2s ease .3s,transform 1.2s ease .3s}.lp-spot-name.lp-spot-visible{opacity:1;transform:translateY(0)}.lp-spot-btn{background:none;border:none;color:inherit;font-size:.8rem;letter-spacing:.2em;text-transform:uppercase;cursor:pointer;opacity:0;animation:lpSpotBtn .8s ease forwards;position:relative}.lp-spot-btn:after{content:"";position:absolute;bottom:-4px;left:0;width:0;height:1px;background:currentColor;transition:width .3s ease}.lp-spot-btn:hover:after{width:100%}@keyframes lpSpotBtn{0%{opacity:0;transform:translateY(10px)}to{opacity:.7;transform:translateY(0)}}.lp-gli{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:9999;overflow:hidden;font-family:Courier New,Fira Mono,monospace;transition:opacity .8s ease}.lp-gli.lp-gli-out{opacity:0}.lp-gli-dark{background:#080810;--lp-gli-fg: #d0d0e0;--lp-gli-accent: #a855f7;--lp-gli-accent2: #6366f1;--lp-gli-accent3: #22d3ee;--lp-gli-name-fill: transparent;--lp-gli-name-stroke: #a855f7;--lp-gli-name-glow: rgba(168, 85, 247, .5);--lp-gli-dim: rgba(255,255,255,.08);--lp-gli-scanline: rgba(0,0,0,.25);--lp-gli-cat-glow: rgba(168, 85, 247, .25)}.lp-gli-light{background:#eeeaf6;--lp-gli-fg: #1a1a2e;--lp-gli-accent: #6d28d9;--lp-gli-accent2: #4338ca;--lp-gli-accent3: #0e7490;--lp-gli-name-fill: transparent;--lp-gli-name-stroke: #5b21b6;--lp-gli-name-glow: rgba(91, 33, 182, .3);--lp-gli-dim: rgba(0,0,0,.06);--lp-gli-scanline: rgba(0,0,0,.06);--lp-gli-cat-glow: rgba(109, 40, 217, .15)}.lp-gli-scanlines{position:absolute;inset:0;pointer-events:none;z-index:3;background:repeating-linear-gradient(0deg,var(--lp-gli-scanline) 0px,var(--lp-gli-scanline) 1px,transparent 1px,transparent 3px);opacity:.6;animation:lpGliScanDrift 8s linear infinite}@keyframes lpGliScanDrift{0%{background-position-y:0}to{background-position-y:60px}}.lp-gli-noise{position:absolute;inset:-50%;width:200%;height:200%;pointer-events:none;z-index:2;opacity:.04;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");animation:lpGliNoiseMove .5s steps(4) infinite}@keyframes lpGliNoiseMove{0%{transform:translate(0)}25%{transform:translate(-2%,-3%)}50%{transform:translate(1%,2%)}75%{transform:translate(-1%,1%)}to{transform:translate(2%,-2%)}}.lp-gli-log{position:absolute;top:40px;left:40px;right:40px;max-height:30vh;overflow:hidden;z-index:5;font-size:clamp(.55rem,1.2vw,.75rem);letter-spacing:.08em;color:var(--lp-gli-accent);opacity:.55}.lp-gli-line{white-space:nowrap;overflow:hidden;animation:lpGliLineIn .3s ease forwards;transform:translate(-20px);opacity:0;margin-bottom:2px}@keyframes lpGliLineIn{to{transform:translate(0);opacity:1}}.lp-gli-name{position:relative;z-index:5;font-size:clamp(2.5rem,12vw,7rem);font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--lp-gli-name-fill);-webkit-text-stroke:2px var(--lp-gli-name-stroke);paint-order:stroke fill;text-shadow:0 0 8px var(--lp-gli-name-glow),0 0 30px var(--lp-gli-name-glow);animation:lpGliNameIn .6s cubic-bezier(.22,1,.36,1) forwards;margin:0}@keyframes lpGliNameIn{0%{opacity:0;transform:scale(1.2) translateY(20px);filter:blur(8px)}60%{opacity:1;filter:blur(0)}to{transform:scale(1) translateY(0);filter:blur(0)}}.lp-gli-name:before,.lp-gli-name:after{content:attr(data-text);position:absolute;inset:0;overflow:hidden}.lp-gli-name:before{color:transparent;-webkit-text-stroke:2px var(--lp-gli-accent3);z-index:-1;animation:lpGliChannelCyan 3s infinite linear alternate;clip-path:inset(0 0 50% 0)}.lp-gli-name:after{color:transparent;-webkit-text-stroke:2px var(--lp-gli-accent);z-index:-1;animation:lpGliChannelMagenta 3s infinite linear alternate;clip-path:inset(50% 0 0 0)}@keyframes lpGliChannelCyan{0%{transform:translate(0)}20%{transform:translate(-3px,1px)}40%{transform:translate(2px,-1px)}60%{transform:translate(-1px,2px)}80%{transform:translate(3px)}to{transform:translate(-2px,-1px)}}@keyframes lpGliChannelMagenta{0%{transform:translate(0)}15%{transform:translate(3px,-1px)}35%{transform:translate(-2px,2px)}55%{transform:translate(1px,-2px)}75%{transform:translate(-3px,1px)}to{transform:translate(2px)}}.lp-gli-name.lp-gli-flicker{animation:lpGliFlicker .15s steps(2) forwards}@keyframes lpGliFlicker{0%{opacity:1;transform:translate(0)}25%{opacity:.6;transform:translate(-6px,2px) skew(4deg)}50%{opacity:1;transform:translate(4px,-1px) skew(-2deg)}75%{opacity:.4;transform:translate(-2px,3px) skew(6deg)}to{opacity:1;transform:translate(0) skew(0)}}.lp-gli-cat{position:relative;z-index:5;margin-top:48px;cursor:pointer;display:flex;align-items:center;justify-content:center;animation:lpGliCatIn .8s ease forwards;opacity:0;transition:transform .2s ease}.lp-gli-cat:hover{transform:scale(1.1)}.lp-gli-cat:hover .lp-gli-cat-glow{opacity:.9;transform:scale(1.3)}@keyframes lpGliCatIn{0%{opacity:0;transform:translateY(20px) scale(.8)}to{opacity:1;transform:translateY(0) scale(1)}}.lp-gli-cat-svg{width:clamp(80px,15vw,140px);height:auto;color:var(--lp-gli-accent);filter:drop-shadow(0 0 6px var(--lp-gli-accent)) drop-shadow(0 0 20px var(--lp-gli-accent2));position:relative;z-index:2}.lp-gli-cat-glow{position:absolute;width:160%;height:160%;border-radius:50%;background:radial-gradient(circle,var(--lp-gli-cat-glow) 0%,transparent 70%);opacity:.7;z-index:1;transition:opacity .3s,transform .3s;filter:blur(10px)}.lp-gli-z{position:absolute;font-family:Courier New,Fira Mono,monospace;font-weight:700;color:var(--lp-gli-accent2);z-index:3;opacity:0;pointer-events:none}.lp-gli-z1{font-size:.9rem;top:-5px;right:-10px;animation:lpGliZFloat 2.5s ease-in-out infinite;animation-delay:0s}.lp-gli-z2{font-size:.7rem;top:-18px;right:-2px;animation:lpGliZFloat 2.5s ease-in-out infinite;animation-delay:.6s}.lp-gli-z3{font-size:.55rem;top:-28px;right:6px;animation:lpGliZFloat 2.5s ease-in-out infinite;animation-delay:1.2s}@keyframes lpGliZFloat{0%{opacity:0;transform:translateY(0) rotate(0)}20%{opacity:.8}80%{opacity:.6}to{opacity:0;transform:translateY(-20px) rotate(-15deg)}}.lp-gli:before{content:"";position:absolute;left:0;right:0;height:3px;background:var(--lp-gli-accent);opacity:0;z-index:10;pointer-events:none;animation:lpGliBar 4s infinite}@keyframes lpGliBar{0%,92%{opacity:0;top:50%}93%{opacity:.8;top:20%}94%{opacity:0;top:20%}95%{opacity:.6;top:70%}96%{opacity:0;top:70%}97%{opacity:.9;top:35%;height:5px}98%{opacity:0;top:35%}to{opacity:0;top:50%}}.lp-gli-cat:after{content:"tap_to_wake_up";position:absolute;bottom:-28px;left:50%;transform:translate(-50%);font-family:Courier New,Fira Mono,monospace;font-size:.55rem;opacity:.3;letter-spacing:.15em;white-space:nowrap;color:var(--lp-gli-accent);text-transform:uppercase}