"""AstrAI promo: Hook — terminal demo + GPU comparison + logo reveal (~8s).""" from manim import * Text.set_default(font="Times New Roman") class Hook(Scene): def construct(self): BG = "#0d1117" self.camera.background_color = BG TERM = "#39ff14" # ════ 0. Terminal (0.0 – 2.8s) ════ tw, th = 10.0, 4.8 term_frame = Rectangle( width=tw, height=th, color=WHITE, stroke_width=1.2, fill_opacity=0.03, fill_color=TERM, ) term_frame.to_edge(UP, buff=0.2) lx = term_frame.get_left()[0] + 0.45 ty = term_frame.get_top()[1] - 0.45 prompt = Text("$ ", font_size=20, color=TERM, font="Consolas") prompt.move_to([lx, ty, 0], aligned_edge=LEFT) chat = Text("Hey, write a quicksort for me.", font_size=18, color=WHITE, font="Consolas") chat.next_to(prompt, RIGHT, buff=0.08).align_to(prompt, DOWN) resp = Text(">> ", font_size=18, color=GRAY, font="Consolas") resp.next_to(prompt, DOWN, buff=0.55).align_to(prompt, LEFT) hint = Text("Here is the implementation:", font_size=14, color=GRAY, font="Consolas") hint.next_to(resp, DOWN, buff=0.20).align_to(prompt, LEFT) INDENT = 0.27 code_lines = [ ("def quicksort(arr):", 0), ("if len(arr) <= 1:", 1), ("return arr", 2), ("pivot = arr[len(arr)//2]", 1), ("left = [x for x in arr if x < pivot]", 1), ("right = [x for x in arr if x >= pivot]", 1), ("return quicksort(left) + [pivot] + quicksort(right)", 1), ] code_vg = VGroup() prev = hint for text, level in code_lines: cl = Text(text, font_size=13, color=TERM, font="Consolas") cl.next_to(prev, DOWN, buff=0.08).align_to(prompt, LEFT).shift(RIGHT * level * INDENT) code_vg.add(cl) prev = cl self.play(FadeIn(term_frame), run_time=0.3) self.play(Write(prompt), run_time=0.1) self.play(AddTextLetterByLetter(chat, time_per_char=0.018)) self.play(Write(resp), run_time=0.12) self.play(Write(hint, lag_ratio=1.0), run_time=0.15) self.play(Write(code_vg, lag_ratio=1.0), run_time=1.2) self.play( FadeOut(term_frame), FadeOut(prompt), FadeOut(chat), FadeOut(resp), FadeOut(hint), FadeOut(code_vg), run_time=0.3, ) # ════ 1. Statement (2.8 – 4.0s) ════ s1 = Text("LLMs Are Powerful", font_size=44, color=WHITE) s2 = Text("but do they really need dozens of GPUs?", font_size=28, color=GRAY) VGroup(s1, s2).arrange(DOWN, buff=0.25).move_to(UP * 1.0) self.play(Write(s1), run_time=0.35) self.play(Write(s2), run_time=0.3) self.wait(0.25) self.play(FadeOut(s1), FadeOut(s2), run_time=0.25) # ════ 2. Logo (4.0 – 7.0s) ════ logo = Text("AstrAI", font_size=80, color=BLUE) glow = Text("AstrAI", font_size=80, color=BLUE_A, fill_opacity=0.3) glow.move_to(logo).shift(UP * 0.015 + RIGHT * 0.015) info = VGroup( Text("1B Params · Single GPU · Open Source", font_size=22, color=GRAY), Text("github.com/ViperEkura/AstrAI", font_size=17, color=YELLOW), ).arrange(DOWN, buff=0.18) everything = VGroup(VGroup(glow, logo), info).arrange(DOWN, buff=0.45) everything.move_to(ORIGIN) self.play(Write(logo), run_time=0.45) self.play(Write(glow), run_time=0.08) self.play(Write(info), run_time=0.3) self.wait(1.8) self.play(FadeOut(everything), run_time=0.4)