(self)
| 1092 | |
| 1093 | class DemoSlide(Scene): |
| 1094 | def construct(self): |
| 1095 | # Background grid |
| 1096 | grid_lines = VGroup() |
| 1097 | for x in np.arange(-8, 8.5, 1): |
| 1098 | grid_lines.add(Line( |
| 1099 | [x, -5, 0], [x, 5, 0], |
| 1100 | stroke_color=BORDER, stroke_width=0.3, stroke_opacity=0.15 |
| 1101 | )) |
| 1102 | for y in np.arange(-5, 5.5, 1): |
| 1103 | grid_lines.add(Line( |
| 1104 | [-8, y, 0], [8, y, 0], |
| 1105 | stroke_color=BORDER, stroke_width=0.3, stroke_opacity=0.15 |
| 1106 | )) |
| 1107 | self.add(grid_lines) |
| 1108 | |
| 1109 | # "DEMO" text |
| 1110 | demo = Text("LIVE DEMO", font="SF Mono", font_size=64, color=ACCENT_CYAN, weight=BOLD) |
| 1111 | demo.shift(UP * 1.5) |
| 1112 | |
| 1113 | # Glow effect |
| 1114 | demo_glow = demo.copy().set_opacity(0.15).scale(1.05) |
| 1115 | |
| 1116 | self.play(FadeIn(demo_glow), Write(demo, run_time=1.5)) |
| 1117 | |
| 1118 | # Feature highlights |
| 1119 | features = VGroup( |
| 1120 | section_badge("3D Globe", ACCENT_BLUE), |
| 1121 | section_badge("Shodan Search", ACCENT_PURPLE), |
| 1122 | section_badge("Live Attack", SEVERITY_CRITICAL), |
| 1123 | section_badge("Range Monitor", ACCENT_GREEN), |
| 1124 | section_badge("Risk Scoring", ACCENT_AMBER), |
| 1125 | ).arrange(RIGHT, buff=0.3) |
| 1126 | features.shift(DOWN * 0.5) |
| 1127 | |
| 1128 | self.play(LaggedStart( |
| 1129 | *[FadeIn(f, scale=0.8) for f in features], |
| 1130 | lag_ratio=0.1 |
| 1131 | ), run_time=1.5) |
| 1132 | |
| 1133 | # Bottom text |
| 1134 | bottom = VGroup( |
| 1135 | Text("AIMap", font="SF Mono", font_size=24, color=TEXT_PRIMARY, weight=BOLD), |
| 1136 | Text("Securing the Agentic Era", font="SF Mono", font_size=16, color=TEXT_MUTED), |
| 1137 | ).arrange(DOWN, buff=0.2) |
| 1138 | bottom.shift(DOWN * 2.5) |
| 1139 | |
| 1140 | self.play(FadeIn(bottom, shift=UP * 0.3)) |
| 1141 | |
| 1142 | # Pulse the demo text |
| 1143 | self.play( |
| 1144 | demo.animate.scale(1.05), |
| 1145 | demo_glow.animate.scale(1.1).set_opacity(0.25), |
| 1146 | rate_func=there_and_back, |
| 1147 | run_time=1.5 |
| 1148 | ) |
| 1149 | self.play( |
| 1150 | demo.animate.scale(1.05), |
| 1151 | demo_glow.animate.scale(1.1).set_opacity(0.25), |
nothing calls this directly
no test coverage detected