返回 html-video
08-cta-outro.html
1 <template id="08-cta-outro-template">
2 <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
3 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@500;600;700&family=Instrument+Serif:ital@0;1&family=Geist:wght@500;700&display=block" rel="stylesheet" />
4
5 <div
6 data-composition-id="08-cta-outro"
7 data-start="0"
8 data-duration="5"
9 data-width="1920"
10 data-height="1080"
11 >
12 <div class="stage-08">
13 <div class="grid-floor"></div>
14
15 <div class="outro-lockup">
16 <div class="lockup-row">
17 <div class="o-symbol">
18 <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
19 <defs>
20 <linearGradient id="grad-08" x1="0" y1="0" x2="1" y2="1">
21 <stop offset="0%" stop-color="#5E6AD2"/>
22 <stop offset="100%" stop-color="#A9B0F0"/>
23 </linearGradient>
24 </defs>
25 <path d="M 25 18 L 75 18 L 75 34 L 41 34 L 41 82 L 25 82 Z" fill="url(#grad-08)" />
26 </svg>
27 </div>
28 <div class="o-wordmark">BRANDNAME</div>
29 <div class="shimmer"></div>
30 </div>
31
32 <div class="o-tagline">The product development system for teams and agents.</div>
33
34 <div class="o-cta">Get started &nbsp;—&nbsp; linear.app</div>
35 </div>
36
37 <div class="vignette"></div>
38 <div class="grain"></div>
39 </div>
40
41 <style>
42 [data-composition-id="08-cta-outro"] {
43 position: absolute; inset: 0; overflow: hidden; background: #000;
44 }
45 [data-composition-id="08-cta-outro"] .stage-08 { position: absolute; inset: 0; }
46 [data-composition-id="08-cta-outro"] .grid-floor {
47 position: absolute; inset: 0;
48 transform: perspective(900px) rotateX(60deg) translateY(25%);
49 background:
50 repeating-linear-gradient(0deg, rgba(255,255,255,0.04) 0 1px, transparent 1px 80px),
51 repeating-linear-gradient(90deg, rgba(255,255,255,0.04) 0 1px, transparent 1px 80px);
52 background-color: #000;
53 }
54 [data-composition-id="08-cta-outro"] .outro-lockup {
55 position: absolute;
56 top: 50%; left: 50%;
57 transform: translate(-50%, -50%);
58 display: flex;
59 flex-direction: column;
60 align-items: center;
61 gap: 32px;
62 text-align: center;
63 }
64 [data-composition-id="08-cta-outro"] .lockup-row {
65 position: relative;
66 display: flex;
67 align-items: center;
68 gap: 24px;
69 }
70 [data-composition-id="08-cta-outro"] .o-symbol {
71 width: 100px; height: 100px;
72 filter: drop-shadow(0 0 40px rgba(169,176,240,0.6));
73 opacity: 0;
74 }
75 [data-composition-id="08-cta-outro"] .o-symbol svg { width: 100%; height: 100%; }
76 [data-composition-id="08-cta-outro"] .o-wordmark {
77 font-family: "Inter", sans-serif;
78 font-weight: 600;
79 font-size: 144px;
80 letter-spacing: -0.04em;
81 background: linear-gradient(180deg, #ffffff 0%, #cccccc 60%, #888888 100%);
82 -webkit-background-clip: text;
83 -webkit-text-fill-color: transparent;
84 background-clip: text;
85 color: transparent;
86 text-shadow: 0 0 60px rgba(255,255,255,0.3);
87 opacity: 0;
88 }
89 [data-composition-id="08-cta-outro"] .shimmer {
90 position: absolute;
91 top: 0; left: 0;
92 width: 200px; height: 100%;
93 background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.55) 50%, transparent 100%);
94 filter: blur(4px);
95 transform: translateX(-200%);
96 opacity: 0;
97 mix-blend-mode: screen;
98 pointer-events: none;
99 }
100 [data-composition-id="08-cta-outro"] .o-tagline {
101 font-family: "Instrument Serif", serif;
102 font-style: italic;
103 font-size: 44px;
104 color: rgba(255,255,255,0.85);
105 letter-spacing: 0.005em;
106 max-width: 1200px;
107 line-height: 1.25;
108 opacity: 0;
109 }
110 [data-composition-id="08-cta-outro"] .o-cta {
111 margin-top: 12px;
112 padding: 18px 40px;
113 border-radius: 999px;
114 font-family: "Geist", sans-serif;
115 font-weight: 500;
116 font-size: 28px;
117 letter-spacing: 0.02em;
118 color: #fff;
119 background: linear-gradient(135deg, rgba(94,106,210,0.3), rgba(169,176,240,0.2));
120 border: 1px solid rgba(169,176,240,0.5);
121 box-shadow: 0 0 40px rgba(94,106,210,0.3), inset 0 1px 0 rgba(255,255,255,0.25);
122 backdrop-filter: blur(12px);
123 opacity: 0;
124 }
125 [data-composition-id="08-cta-outro"] .vignette {
126 position: absolute; inset: 0; pointer-events: none;
127 background: radial-gradient(ellipse at center, transparent 30%, rgba(0,0,0,0.95) 95%);
128 opacity: 0.75;
129 }
130 [data-composition-id="08-cta-outro"] .grain {
131 position: absolute; inset: 0; pointer-events: none;
132 opacity: 0.08;
133 background-image:
134 radial-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
135 radial-gradient(rgba(255,255,255,0.02) 1px, transparent 1px);
136 background-size: 3px 3px, 5px 5px;
137 }
138 </style>
139
140 <script>
141 (() => {
142 const SLOT = 5;
143 const tl = gsap.timeline({ paused: true });
144 const sel = (q) => `[data-composition-id="08-cta-outro"] ${q}`;
145
146 tl.to(sel('.o-symbol'), { opacity: 1, duration: 0.5, ease: 'power2.out' }, 0);
147 tl.to(sel('.o-wordmark'), { opacity: 1, duration: 0.5, ease: 'power2.out' }, 0.1);
148
149 tl.fromTo(sel('.o-tagline'),
150 { opacity: 0, y: 20 },
151 { opacity: 1, y: 0, duration: 0.6, ease: 'power3.out' }, 0.5);
152
153 tl.fromTo(sel('.o-cta'),
154 { opacity: 0, scale: 0.9 },
155 { opacity: 1, scale: 1, duration: 0.5, ease: 'back.out(1.3)' }, 0.9);
156
157 const shimmer = (t) => {
158 tl.set(sel('.shimmer'), { opacity: 1, xPercent: -120 }, t);
159 tl.to(sel('.shimmer'), { xPercent: 400, duration: 0.7, ease: 'power2.inOut' }, t);
160 tl.to(sel('.shimmer'), { opacity: 0, duration: 0.1 }, t + 0.65);
161 };
162 shimmer(1.2);
163 shimmer(3.0);
164 shimmer(4.5);
165
166 tl.to(sel('.vignette'), { opacity: 0.85, duration: 2.5, yoyo: true, repeat: 1, ease: 'sine.inOut' }, 0);
167
168 tl.to({}, { duration: SLOT }, 0);
169 window.__timelines = window.__timelines || {};
170 window.__timelines['08-cta-outro'] = tl;
171 })();
172 </script>
173 </div>
174 </template>
175
175 lines HTML