diff --git a/.gitignore b/.gitignore index 7b62e03fb776..31cf0b64106f 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ theme/stencil/src/components.d.ts /static/js/algolia.*.js /static/js/marketing.*.js /static/js/homepage.*.js +/static/js/hero-animation.*.js /static/js/chunk-*.js # Ignore webpack-generated JS manifest for Hugo. diff --git a/content/_index.md b/content/_index.md index 010292f40122..a59e1a1fd01e 100644 --- a/content/_index.md +++ b/content/_index.md @@ -17,6 +17,12 @@ sections: description: | Ship infrastructure faster with tools that let agents do what they do best — without letting them go off the rails. anchor: hero + + # The right slot: "animation" plays the agent-loop scene; switch to "code" + # to run the classic language-selector composite configured below. + hero_visual: animation + hero_animation: agent-loop + code_overlay_image: /images/home/home-hero-code-overlay.svg code_aspect_ratio: "666/513" code_offsets: @@ -287,7 +293,7 @@ sections: description: | Coding agents have reset the pace at which we build software. Pulumi brings that same agent-driven velocity to infrastructure. - Open source and powered by languages agents know well, Pulumi is **software-driven infrastructure** that gives humans and agents the tools they need to build and scale infrastructure — safely. + Open source and powered by languages agents know well, Pulumi is **infrastructure as software** that gives humans and agents the tools they need to build and scale infrastructure — safely. cta_text: Explore the platform cta_link: /product/ cards: diff --git a/data/hero_agent_loop.yaml b/data/hero_agent_loop.yaml new file mode 100644 index 000000000000..bbe45920e697 --- /dev/null +++ b/data/hero_agent_loop.yaml @@ -0,0 +1,179 @@ +# The text content of the homepage hero animation (the agent-loop scene): +# the Pulumi program the agent types — one example per language, adapted from +# the classic code-selector hero — and the pulumi up stream in the terminal. +# +# To change any of them, edit the plain-text sources below, then run +# +# yarn --cwd theme gen:hero-text +# +# which re-highlights them with shiki (min-light theme; each language's own +# grammar for the editor, bash for the terminal — the same highlighting the +# storyboards used) and rewrites data/hero_agent_loop_generated.yaml, the file +# the hero partial actually renders. Nothing runs at build or page-load time. +# +# Editor examples must fit the code panel: at most 13 rows, and lines longer +# than ~68 characters clip at the panel's right edge. A blank line is a blank +# row and separates the typing animation's bursts. If you add or remove +# terminal rows, shift TERM_SCROLL_END in theme/src/ts/hero-animation.ts by +# 18px per row. + +editor_sources: + typescript: | + import * as aws from "@pulumi/aws"; + import * as awsx from "@pulumi/awsx"; + + const vpc = new awsx.ec2.Vpc("vpc"); + const azs = await aws.getAvailabilityZones({ state: "available" }); + + const subnets = azs.names.map((az, i) => + new aws.ec2.Subnet(`subnet-${i}`, { + vpcId: vpc.vpcId, + cidrBlock: `10.0.${i}.0/24`, + availabilityZone: az, + }) + ); + python: | + import pulumi_aws as aws + import pulumi_awsx as awsx + + azs = aws.get_availability_zones(state="available") + vpc = awsx.ec2.Vpc("vpc") + + for i, az in enumerate(azs.names): + aws.ec2.Subnet(f"subnet-{i}", + vpc_id=vpc.vpc_id, + cidr_block=f"10.0.{i}.0/24", + availability_zone=az, + ) + go: | + pulumi.Run(func(ctx *pulumi.Context) error { + vpc, _ := awsx.NewVpc(ctx, "vpc", nil) + azs, _ := aws.GetAvailabilityZones(ctx, nil, nil) + for i, az := range azs.Names { + name := fmt.Sprintf("subnet-%d", i) + ec2.NewSubnet(ctx, name, &ec2.SubnetArgs{ + VpcId: vpc.VpcId, + CidrBlock: pulumi.Sprintf("10.0.%d.0/24", i), + AvailabilityZone: pulumi.String(az), + }) + } + return nil + }) + csharp: | + var vpc = new Pulumi.Awsx.Ec2.Vpc("vpc"); + var azs = GetAvailabilityZones.Invoke(new() { State = "available" }); + + var subnets = azs.Apply(zones => + zones.Names.Select((az, i) => + new Subnet($"subnet-{i}", new() + { + VpcId = vpc.VpcId, + CidrBlock = $"10.0.{i}.0/24", + AvailabilityZone = az, + }) + ).ToList() + ); + java: | + Pulumi.run(ctx -> { + var vpc = new Vpc("vpc"); + var azs = AwsFunctions.getAvailabilityZonesPlain().join(); + + var names = azs.names(); + for (int i = 0; i < names.size(); i++) { + new Subnet("subnet-" + i, SubnetArgs.builder() + .vpcId(vpc.id()) + .cidrBlock("10.0." + i + ".0/24") + .availabilityZone(names.get(i)) + .build()); + } + }); + hcl: | + resource "awsx_ec2_vpc" "vpc" {} + + data "aws_availability_zones" "azs" { + state = "available" + } + + resource "aws_subnet" "subnet" { + count = length(data.aws_availability_zones.azs.names) + vpc_id = awsx_ec2_vpc.vpc.vpc_id + cidr_block = "10.0.${count.index}.0/24" + availability_zone = data.aws_availability_zones.azs.names[count.index] + } + yaml: | + variables: + azs: + fn::invoke: + function: aws:getAvailabilityZones + resources: + vpc: + type: awsx:ec2:Vpc + subnet-0: + type: aws:ec2:Subnet + properties: + vpcId: ${vpc.vpcId} + cidrBlock: "10.0.0.0/24" + availabilityZone: ${azs.names[0]} + +terminal_source: | + • Tests passed. Deploying. + + › pulumi up + + Previewing update (prod) + + + pulumi:pulumi:Stack network create + + ├─ awsx:ec2:Vpc vpc create + + │ └─ aws:ec2:Vpc vpc create + + │ ├─ aws:ec2:InternetGateway vpc create + + │ ├─ aws:ec2:Subnet vpc-public-2 create + + │ │ ├─ aws:ec2:Eip vpc-2 create + + │ │ ├─ aws:ec2:RouteTable vpc-public-2 create + + │ │ │ ├─ aws:ec2:Route vpc-public-2 create + + │ │ │ └─ aws:ec2:RouteTableAssoc vpc-public-2 create + + │ │ └─ aws:ec2:NatGateway vpc-2 create + + │ ├─ aws:ec2:Subnet vpc-public-1 create + + │ │ ├─ aws:ec2:Eip vpc-1 create + + │ │ ├─ aws:ec2:RouteTable vpc-public-1 create + + │ │ │ ├─ aws:ec2:Route vpc-public-1 create + + │ │ │ └─ aws:ec2:RouteTableAssoc vpc-public-1 create + + │ │ └─ aws:ec2:NatGateway vpc-1 create + + │ ├─ aws:ec2:Subnet vpc-private-1 create + + │ │ └─ aws:ec2:RouteTable vpc-private-1 create + + │ │ ├─ aws:ec2:RouteTableAssoc vpc-private-1 create + + │ │ └─ aws:ec2:Route vpc-private-1 create + + │ ├─ aws:ec2:Subnet vpc-private-2 create + + │ │ └─ aws:ec2:RouteTable vpc-private-2 create + + │ │ ├─ aws:ec2:RouteTableAssoc vpc-private-2 create + + │ │ └─ aws:ec2:Route vpc-private-2 create + + │ ├─ aws:ec2:Subnet vpc-public-3 create + + │ │ ├─ aws:ec2:Eip vpc-3 create + + │ │ ├─ aws:ec2:RouteTable vpc-public-3 create + + │ │ │ ├─ aws:ec2:Route vpc-public-3 create + + │ │ │ └─ aws:ec2:RouteTableAssoc vpc-public-3 create + + │ │ └─ aws:ec2:NatGateway vpc-3 create + + │ └─ aws:ec2:Subnet vpc-private-3 create + + │ └─ aws:ec2:RouteTable vpc-private-3 create + + │ ├─ aws:ec2:RouteTableAssoc vpc-private-3 create + + │ └─ aws:ec2:Route vpc-private-3 create + + ├─ aws:ec2:Subnet subnet-1 create + + ├─ aws:ec2:Subnet subnet-5 create + + ├─ aws:ec2:Subnet subnet-3 create + + ├─ aws:ec2:Subnet subnet-4 create + + ├─ aws:ec2:Subnet subnet-0 create + + └─ aws:ec2:Subnet subnet-2 create + + Outputs: + vpcId: "vpc-0a1b2c3d4e5f67890" + + Resources: + + 40 created + + Policies applied: + Name Version + cis-aws 1.0.2 + nist-aws 1.0.2 + pci-dss-aws 2.0.4 + iso-27001-aws 1.0.0 + + Duration: 1m47s diff --git a/data/hero_agent_loop_generated.yaml b/data/hero_agent_loop_generated.yaml new file mode 100644 index 000000000000..3ee882f78057 --- /dev/null +++ b/data/hero_agent_loop_generated.yaml @@ -0,0 +1,697 @@ +# GENERATED FILE — DO NOT EDIT. +# Written by theme/scripts/gen-hero-text.mjs from the plain-text sources in +# data/hero_agent_loop.yaml; edit those and run +# yarn --cwd theme gen:hero-text +# +# Runs are [color, startColumn, text] segments; _code-lines.html positions +# each from its column offset (Monaspace Neon, 7.44141px advance at +# font-size 12). Segment text carries no leading or doubled spaces, since +# the production build's HTML minifier collapses whitespace inside tspans. + +colors: + kw: "#D32F2F" # keywords + id: "#1976D2" # identifiers, numbers + txt: "#24292E" # plain text + str: "#22863A" # strings + mem: "#6F42C1" # members, methods; terminal commands + pun: "#212121" # punctuation + tbl: "#2B5581" # terminal arguments, table text + +editors: + typescript: + - - [kw, 0, "import"] + - [id, 7, "*"] + - [kw, 9, "as"] + - [txt, 12, "aws"] + - [kw, 16, "from"] + - [str, 21, "\"@pulumi/aws\""] + - [txt, 34, ";"] + - - [kw, 0, "import"] + - [id, 7, "*"] + - [kw, 9, "as"] + - [txt, 12, "awsx"] + - [kw, 17, "from"] + - [str, 22, "\"@pulumi/awsx\""] + - [txt, 36, ";"] + - [] + - - [kw, 0, "const"] + - [id, 6, "vpc"] + - [kw, 10, "= new"] + - [id, 16, "awsx"] + - [mem, 20, "."] + - [id, 21, "ec2"] + - [mem, 24, ".Vpc"] + - [txt, 28, "("] + - [str, 29, "\"vpc\""] + - [txt, 34, ");"] + - - [kw, 0, "const"] + - [id, 6, "azs"] + - [kw, 10, "= await"] + - [id, 18, "aws"] + - [mem, 21, ".getAvailabilityZones"] + - [txt, 42, "({ state"] + - [kw, 50, ":"] + - [str, 52, "\"available\""] + - [txt, 64, "});"] + - [] + - - [kw, 0, "const"] + - [id, 6, "subnets"] + - [kw, 14, "="] + - [id, 16, "azs"] + - [mem, 19, "."] + - [id, 20, "names"] + - [mem, 25, ".map"] + - [txt, 29, "((az"] + - [pun, 33, ","] + - [txt, 35, "i)"] + - [kw, 38, "=>"] + - - [kw, 2, "new"] + - [id, 6, "aws"] + - [mem, 9, "."] + - [id, 10, "ec2"] + - [mem, 13, ".Subnet"] + - [txt, 20, "("] + - [str, 21, "`subnet-"] + - [kw, 29, "${"] + - [txt, 31, "i"] + - [kw, 32, "}"] + - [str, 33, "`"] + - [pun, 34, ","] + - [txt, 36, "{"] + - - [txt, 4, "vpcId"] + - [kw, 9, ":"] + - [id, 11, "vpc"] + - [txt, 14, ".vpcId"] + - [pun, 20, ","] + - - [txt, 4, "cidrBlock"] + - [kw, 13, ":"] + - [str, 15, "`10.0."] + - [kw, 21, "${"] + - [txt, 23, "i"] + - [kw, 24, "}"] + - [str, 25, ".0/24`"] + - [pun, 31, ","] + - - [txt, 4, "availabilityZone"] + - [kw, 20, ":"] + - [txt, 22, "az"] + - [pun, 24, ","] + - - [txt, 2, "})"] + - - [txt, 0, ");"] + python: + - - [kw, 0, "import"] + - [txt, 7, "pulumi_aws"] + - [kw, 18, "as"] + - [txt, 21, "aws"] + - - [kw, 0, "import"] + - [txt, 7, "pulumi_awsx"] + - [kw, 19, "as"] + - [txt, 22, "awsx"] + - [] + - - [txt, 0, "azs"] + - [kw, 4, "="] + - [txt, 6, "aws"] + - [pun, 9, "."] + - [mem, 10, "get_availability_zones"] + - [pun, 32, "(state"] + - [kw, 38, "="] + - [str, 39, "\"available\""] + - [pun, 50, ")"] + - - [txt, 0, "vpc"] + - [kw, 4, "="] + - [txt, 6, "awsx"] + - [pun, 10, "."] + - [txt, 11, "ec2"] + - [pun, 14, "."] + - [mem, 15, "Vpc"] + - [pun, 18, "("] + - [str, 19, "\"vpc\""] + - [pun, 24, ")"] + - [] + - - [kw, 0, "for"] + - [txt, 4, "i"] + - [pun, 5, ","] + - [txt, 7, "az"] + - [kw, 10, "in"] + - [mem, 13, "enumerate"] + - [pun, 22, "(azs.names):"] + - - [txt, 4, "aws"] + - [pun, 7, "."] + - [txt, 8, "ec2"] + - [pun, 11, "."] + - [mem, 12, "Subnet"] + - [pun, 18, "("] + - [kw, 19, "f"] + - [str, 20, "\"subnet-"] + - [id, 28, "{"] + - [pun, 29, "i"] + - [id, 30, "}"] + - [str, 31, "\""] + - [pun, 32, ","] + - - [pun, 8, "vpc_id"] + - [kw, 14, "="] + - [pun, 15, "vpc.vpc_id,"] + - - [pun, 8, "cidr_block"] + - [kw, 18, "=f"] + - [str, 20, "\"10.0."] + - [id, 26, "{"] + - [pun, 27, "i"] + - [id, 28, "}"] + - [str, 29, ".0/24\""] + - [pun, 35, ","] + - - [pun, 8, "availability_zone"] + - [kw, 25, "="] + - [pun, 26, "az,"] + - - [pun, 4, ")"] + go: + - - [txt, 0, "pulumi."] + - [mem, 7, "Run"] + - [txt, 10, "("] + - [kw, 11, "func"] + - [txt, 15, "(ctx"] + - [kw, 20, "*"] + - [mem, 21, "pulumi"] + - [txt, 27, "."] + - [mem, 28, "Context"] + - [txt, 35, ")"] + - [kw, 37, "error"] + - [txt, 43, "{"] + - - [txt, 2, "vpc, _"] + - [kw, 9, ":="] + - [txt, 12, "awsx."] + - [mem, 17, "NewVpc"] + - [txt, 23, "(ctx,"] + - [str, 29, "\"vpc\""] + - [txt, 34, ","] + - [id, 36, "nil"] + - [txt, 39, ")"] + - - [txt, 2, "azs, _"] + - [kw, 9, ":="] + - [txt, 12, "aws."] + - [mem, 16, "GetAvailabilityZones"] + - [txt, 36, "(ctx,"] + - [id, 42, "nil"] + - [txt, 45, ","] + - [id, 47, "nil"] + - [txt, 50, ")"] + - - [kw, 2, "for"] + - [txt, 6, "i, az"] + - [kw, 12, ":= range"] + - [txt, 21, "azs.Names {"] + - - [txt, 4, "name"] + - [kw, 9, ":="] + - [txt, 12, "fmt."] + - [mem, 16, "Sprintf"] + - [txt, 23, "("] + - [str, 24, "\"subnet-"] + - [id, 32, "%d"] + - [str, 34, "\""] + - [txt, 35, ", i)"] + - - [txt, 4, "ec2."] + - [mem, 8, "NewSubnet"] + - [txt, 17, "(ctx, name,"] + - [kw, 29, "&"] + - [mem, 30, "ec2"] + - [txt, 33, "."] + - [mem, 34, "SubnetArgs"] + - [txt, 44, "{"] + - - [txt, 6, "VpcId:"] + - [txt, 24, "vpc.VpcId,"] + - - [txt, 6, "CidrBlock:"] + - [txt, 24, "pulumi."] + - [mem, 31, "Sprintf"] + - [txt, 38, "("] + - [str, 39, "\"10.0."] + - [id, 45, "%d"] + - [str, 47, ".0/24\""] + - [txt, 53, ", i),"] + - - [txt, 6, "AvailabilityZone: pulumi."] + - [mem, 31, "String"] + - [txt, 37, "(az),"] + - - [txt, 4, "})"] + - - [txt, 2, "}"] + - - [kw, 2, "return"] + - [id, 9, "nil"] + - - [txt, 0, "})"] + csharp: + - - [kw, 0, "var"] + - [txt, 4, "vpc"] + - [kw, 8, "= new"] + - [mem, 14, "Pulumi"] + - [txt, 20, "."] + - [mem, 21, "Awsx"] + - [txt, 25, "."] + - [mem, 26, "Ec2"] + - [txt, 29, "."] + - [mem, 30, "Vpc"] + - [txt, 33, "("] + - [str, 34, "\"vpc\""] + - [txt, 39, ");"] + - - [kw, 0, "var"] + - [txt, 4, "azs"] + - [kw, 8, "="] + - [id, 10, "GetAvailabilityZones"] + - [txt, 30, "."] + - [mem, 31, "Invoke"] + - [txt, 37, "("] + - [kw, 38, "new"] + - [txt, 41, "() { State"] + - [kw, 52, "="] + - [str, 54, "\"available\""] + - [txt, 66, "});"] + - [] + - - [kw, 0, "var"] + - [txt, 4, "subnets"] + - [kw, 12, "="] + - [id, 14, "azs"] + - [txt, 17, "."] + - [mem, 18, "Apply"] + - [txt, 23, "(zones"] + - [kw, 30, "=>"] + - - [id, 4, "zones"] + - [txt, 9, "."] + - [id, 10, "Names"] + - [txt, 15, "."] + - [mem, 16, "Select"] + - [txt, 22, "((az"] + - [pun, 26, ","] + - [txt, 28, "i)"] + - [kw, 31, "=>"] + - - [kw, 8, "new"] + - [mem, 12, "Subnet"] + - [txt, 18, "("] + - [str, 19, "$\"subnet-{i}\""] + - [pun, 32, ","] + - [kw, 34, "new"] + - [txt, 37, "()"] + - - [txt, 8, "{"] + - - [txt, 12, "VpcId"] + - [kw, 18, "="] + - [id, 20, "vpc"] + - [txt, 23, "."] + - [id, 24, "VpcId"] + - [pun, 29, ","] + - - [txt, 12, "CidrBlock"] + - [kw, 22, "="] + - [str, 24, "$\"10.0.{i}.0/24\""] + - [pun, 40, ","] + - - [txt, 12, "AvailabilityZone"] + - [kw, 29, "="] + - [txt, 31, "az"] + - [pun, 33, ","] + - - [txt, 8, "})"] + - - [txt, 4, ")."] + - [mem, 6, "ToList"] + - [txt, 12, "()"] + - - [txt, 0, ");"] + java: + - - [id, 0, "Pulumi"] + - [pun, 6, "."] + - [mem, 7, "run"] + - [txt, 10, "(ctx"] + - [kw, 15, "->"] + - [txt, 18, "{"] + - - [kw, 4, "var"] + - [txt, 8, "vpc"] + - [kw, 12, "= new"] + - [mem, 18, "Vpc("] + - [str, 22, "\"vpc\""] + - [mem, 27, ")"] + - [txt, 28, ";"] + - - [kw, 4, "var"] + - [txt, 8, "azs"] + - [kw, 12, "="] + - [id, 14, "AwsFunctions"] + - [pun, 26, "."] + - [mem, 27, "getAvailabilityZonesPlain"] + - [txt, 52, "()"] + - [pun, 54, "."] + - [mem, 55, "join"] + - [txt, 59, "();"] + - [] + - - [kw, 4, "var"] + - [txt, 8, "names"] + - [kw, 14, "="] + - [id, 16, "azs"] + - [pun, 19, "."] + - [mem, 20, "names"] + - [txt, 25, "();"] + - - [kw, 4, "for"] + - [txt, 8, "("] + - [kw, 9, "int"] + - [txt, 13, "i"] + - [kw, 15, "="] + - [id, 17, "0"] + - [txt, 18, "; i"] + - [kw, 22, "<"] + - [id, 24, "names"] + - [pun, 29, "."] + - [mem, 30, "size"] + - [txt, 34, "(); i"] + - [kw, 39, "++"] + - [txt, 41, ") {"] + - - [kw, 8, "new"] + - [mem, 12, "Subnet("] + - [str, 19, "\"subnet-\""] + - [kw, 29, "+"] + - [mem, 31, "i"] + - [pun, 32, ","] + - [id, 34, "SubnetArgs"] + - [pun, 44, "."] + - [mem, 45, "builder()"] + - - [pun, 12, "."] + - [mem, 13, "vpcId("] + - [id, 19, "vpc"] + - [pun, 22, "."] + - [mem, 23, "id())"] + - - [pun, 12, "."] + - [mem, 13, "cidrBlock("] + - [str, 23, "\"10.0.\""] + - [kw, 31, "+"] + - [mem, 33, "i"] + - [kw, 35, "+"] + - [str, 37, "\".0/24\""] + - [mem, 44, ")"] + - - [pun, 12, "."] + - [mem, 13, "availabilityZone("] + - [id, 30, "names"] + - [pun, 35, "."] + - [mem, 36, "get(i))"] + - - [pun, 12, "."] + - [mem, 13, "build())"] + - [txt, 21, ";"] + - - [txt, 4, "}"] + - - [txt, 0, "});"] + hcl: + - - [mem, 0, "resource"] + - [txt, 9, "\"awsx_ec2_vpc\" \"vpc\" {}"] + - [] + - - [mem, 0, "data"] + - [txt, 5, "\"aws_availability_zones\" \"azs\" {"] + - - [txt, 2, "state"] + - [kw, 8, "="] + - [str, 10, "\"available\""] + - - [txt, 0, "}"] + - [] + - - [mem, 0, "resource"] + - [txt, 9, "\"aws_subnet\" \"subnet\" {"] + - - [txt, 2, "count"] + - [kw, 20, "="] + - [mem, 22, "length(data"] + - [txt, 33, "."] + - [mem, 34, "aws_availability_zones"] + - [txt, 56, "."] + - [mem, 57, "azs"] + - [txt, 60, "."] + - [mem, 61, "names)"] + - - [txt, 2, "vpc_id"] + - [kw, 20, "="] + - [txt, 22, "awsx_ec2_vpc.vpc.vpc_id"] + - - [txt, 2, "cidr_block"] + - [kw, 20, "="] + - [str, 22, "\"10.0."] + - [kw, 28, "${"] + - [str, 30, "count"] + - [txt, 35, "."] + - [str, 36, "index"] + - [kw, 41, "}"] + - [str, 42, ".0/24\""] + - - [txt, 2, "availability_zone"] + - [kw, 20, "="] + - [txt, 22, "data.aws_availability_zones.azs.names[count.index]"] + - - [txt, 0, "}"] + yaml: + - - [kw, 0, "variables:"] + - - [kw, 2, "azs:"] + - - [kw, 4, "fn::invoke:"] + - - [kw, 6, "function:"] + - [str, 16, "aws:getAvailabilityZones"] + - - [kw, 0, "resources:"] + - - [kw, 2, "vpc:"] + - - [kw, 4, "type:"] + - [str, 10, "awsx:ec2:Vpc"] + - - [kw, 2, "subnet-0:"] + - - [kw, 4, "type:"] + - [str, 10, "aws:ec2:Subnet"] + - - [kw, 4, "properties:"] + - - [kw, 6, "vpcId:"] + - [str, 13, "${vpc.vpcId}"] + - - [kw, 6, "cidrBlock:"] + - [str, 17, "\"10.0.0.0/24\""] + - - [kw, 6, "availabilityZone:"] + - [str, 24, "${azs.names[0]}"] + +terminal: + - - [mem, 0, "•"] + - [tbl, 2, "Tests passed. Deploying."] + - [] + - - [mem, 0, "›"] + - [tbl, 2, "pulumi up"] + - [] + - - [mem, 0, "Previewing"] + - [tbl, 11, "update"] + - [txt, 18, "(prod)"] + - [] + - - [mem, 1, "+"] + - [tbl, 5, "pulumi:pulumi:Stack"] + - [tbl, 45, "network"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "├─ awsx:ec2:Vpc"] + - [tbl, 45, "vpc"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 8, "└─ aws:ec2:Vpc"] + - [tbl, 45, "vpc"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "├─ aws:ec2:InternetGateway"] + - [tbl, 45, "vpc"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "├─ aws:ec2:Subnet"] + - [tbl, 45, "vpc-public-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "├─ aws:ec2:Eip"] + - [tbl, 45, "vpc-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "├─ aws:ec2:RouteTable"] + - [tbl, 45, "vpc-public-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "│"] + - [tbl, 17, "├─ aws:ec2:Route"] + - [tbl, 45, "vpc-public-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "│"] + - [tbl, 17, "└─ aws:ec2:RouteTableAssoc"] + - [tbl, 45, "vpc-public-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "└─ aws:ec2:NatGateway"] + - [tbl, 45, "vpc-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "├─ aws:ec2:Subnet"] + - [tbl, 45, "vpc-public-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "├─ aws:ec2:Eip"] + - [tbl, 45, "vpc-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "├─ aws:ec2:RouteTable"] + - [tbl, 45, "vpc-public-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "│"] + - [tbl, 17, "├─ aws:ec2:Route"] + - [tbl, 45, "vpc-public-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "│"] + - [tbl, 17, "└─ aws:ec2:RouteTableAssoc"] + - [tbl, 45, "vpc-public-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "└─ aws:ec2:NatGateway"] + - [tbl, 45, "vpc-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "├─ aws:ec2:Subnet"] + - [tbl, 45, "vpc-private-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "└─ aws:ec2:RouteTable"] + - [tbl, 45, "vpc-private-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 17, "├─ aws:ec2:RouteTableAssoc"] + - [tbl, 45, "vpc-private-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 17, "└─ aws:ec2:Route"] + - [tbl, 45, "vpc-private-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "├─ aws:ec2:Subnet"] + - [tbl, 45, "vpc-private-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "└─ aws:ec2:RouteTable"] + - [tbl, 45, "vpc-private-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 17, "├─ aws:ec2:RouteTableAssoc"] + - [tbl, 45, "vpc-private-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 17, "└─ aws:ec2:Route"] + - [tbl, 45, "vpc-private-2"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "├─ aws:ec2:Subnet"] + - [tbl, 45, "vpc-public-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "├─ aws:ec2:Eip"] + - [tbl, 45, "vpc-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "├─ aws:ec2:RouteTable"] + - [tbl, 45, "vpc-public-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "│"] + - [tbl, 17, "├─ aws:ec2:Route"] + - [tbl, 45, "vpc-public-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "│"] + - [tbl, 17, "└─ aws:ec2:RouteTableAssoc"] + - [tbl, 45, "vpc-public-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "│"] + - [tbl, 14, "└─ aws:ec2:NatGateway"] + - [tbl, 45, "vpc-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 11, "└─ aws:ec2:Subnet"] + - [tbl, 45, "vpc-private-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 14, "└─ aws:ec2:RouteTable"] + - [tbl, 45, "vpc-private-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 17, "├─ aws:ec2:RouteTableAssoc"] + - [tbl, 45, "vpc-private-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "│"] + - [tbl, 17, "└─ aws:ec2:Route"] + - [tbl, 45, "vpc-private-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "├─ aws:ec2:Subnet"] + - [tbl, 45, "subnet-1"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "├─ aws:ec2:Subnet"] + - [tbl, 45, "subnet-5"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "├─ aws:ec2:Subnet"] + - [tbl, 45, "subnet-3"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "├─ aws:ec2:Subnet"] + - [tbl, 45, "subnet-4"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "├─ aws:ec2:Subnet"] + - [tbl, 45, "subnet-0"] + - [tbl, 60, "create"] + - - [mem, 1, "+"] + - [tbl, 5, "└─ aws:ec2:Subnet"] + - [tbl, 45, "subnet-2"] + - [tbl, 60, "create"] + - [] + - - [mem, 0, "Outputs:"] + - - [mem, 4, "vpcId:"] + - [str, 11, "\"vpc-0a1b2c3d4e5f67890\""] + - [] + - - [mem, 0, "Resources:"] + - - [mem, 4, "+"] + - [id, 6, "40"] + - [tbl, 9, "created"] + - [] + - - [mem, 0, "Policies"] + - [tbl, 9, "applied:"] + - - [mem, 4, "Name"] + - [tbl, 28, "Version"] + - - [mem, 4, "cis-aws"] + - [id, 28, "1.0.2"] + - - [mem, 4, "nist-aws"] + - [id, 28, "1.0.2"] + - - [mem, 4, "pci-dss-aws"] + - [id, 28, "2.0.4"] + - - [mem, 4, "iso-27001-aws"] + - [id, 28, "1.0.0"] + - [] + - - [mem, 0, "Duration:"] + - [tbl, 10, "1m47s"] diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 7cd5e5e77966..7b91f71a7bc1 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -31,10 +31,8 @@ {{- end }} - - {{ if not .IsHome }} + - {{ end }} diff --git a/layouts/partials/template-partials/hero-animation/_code-lines.html b/layouts/partials/template-partials/hero-animation/_code-lines.html new file mode 100644 index 000000000000..7cd4a24147b5 --- /dev/null +++ b/layouts/partials/template-partials/hero-animation/_code-lines.html @@ -0,0 +1,38 @@ +{{/* + Renders the hero animation's monospace text (from data/hero_agent_loop_generated.yaml) + as one element per line with colored tspan runs. Each run is + [colorKey, startColumn, text]; x positions come from the column offsets + (Monaspace Neon advances 7.44141px per character at font-size 12), and run + text never begins with a space or contains 2+ consecutive spaces — the + production build's HTML minifier collapses whitespace inside tspans, so + indentation and column alignment must not depend on space glyphs. + + Args (dict): + - lines: list of lines; each line is a list of [colorKey, col, text] runs + (an empty list is a blank line) + - colors: map of colorKey -> hex fill + - originX: left edge of the text block (px, SVG user space) + - originY: top edge of the text block; baselines land at originY + 13.47 + row*18 + - kind: "code" (editor: typing clips + data-chars) or "term" (terminal: + lines revealed whole by the script) + - clipPrefix: id prefix for the editor's per-line typing clips +*/}} +{{- $CW := 7.44141 -}} +{{- $ox := .originX -}} +{{- $oy := .originY -}} +{{- $colors := .colors -}} +{{- $kind := .kind -}} +{{- $clipPrefix := .clipPrefix | default "hal-lc" -}} +{{- $idx := 0 -}} +{{- range $row, $line := .lines }} + {{- if $line }} + {{- $chars := 0 }}{{ range $line }}{{ $end := add (index . 1) (strings.RuneCount (index . 2)) }}{{ if gt $end $chars }}{{ $chars = $end }}{{ end }}{{ end }} + {{- $y := printf "%.2f" (add $oy (add 13.47 (mul $row 18))) }} + + {{- range $line -}} + {{ index . 2 }} + {{- end -}} + + {{- $idx = add $idx 1 }} + {{- end }} +{{- end }} diff --git a/layouts/partials/template-partials/hero-animation/agent-loop.html b/layouts/partials/template-partials/hero-animation/agent-loop.html new file mode 100644 index 000000000000..9bc30ff5ff13 --- /dev/null +++ b/layouts/partials/template-partials/hero-animation/agent-loop.html @@ -0,0 +1,294 @@ +{{/* + Animated homepage hero — the agentic loop, as a single GSAP-driven inline SVG. + + The scene is authored in its FINISHED state (storyboard frame 7: the isometric + VPC diagram, both summary pills, the agent glyph at rest). That makes the + static markup the correct rendering for prefers-reduced-motion and for + no-JS readers (unhidden by the