Set the name ahead of the word announcing it, and say what sign-in costs

43173ccf31d1 · AtlantisPleb · · parent 445b7ae32b5e

Set the name ahead of the word announcing it, and say what sign-in costs

Three corrections to the band above the fold.

The announcement pill is commented out rather than deleted, for the same
reason the figure below it is: the shape is right and what it announces
does not exist. A pill is a link, and one that opens a post nobody has
written spends a reader's attention and returns none of it. The
component, its demo, and its styles stay where they are, so restoring it
is uncommenting a slot.

The headline's two tones swap and close up onto one line. "Introducing"
is grammar and "Coder." is the point, so the quiet run goes first and the
name lands where the eye already is. `title_muted` becomes `title_lead`,
which is what it now describes: a muted run set inline before the
headline, rather than a second line under it. The word space is a margin,
because HEEx collapses whitespace between an interpolation and its
neighbour and a space typed there is not one you can rely on.

The note gains a second line. "Every new account starts with $20 of
credit" is what a reader gets; "Login with GitHub required" is what it
costs them, and a reader who runs the install command without knowing
that meets it at the first prompt instead. Two lines rather than one
sentence, so the requirement cannot be read as a condition on the credit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wPUM1Fr44hwBGPP42iMxP
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

pushed
by user · WAL seq 455 · 2026-08-26T17:22:00.427438Z

Changed files

  • modified assets/css/openagents.css
  • modified lib/openagents_web/components/landing.ex
  • modified lib/openagents_web/live/components_live.ex
  • modified lib/openagents_web/live/home_live.ex

Diff

4 files changed, +33 -19

assets/css/openagents.css modified +6 -5

@@ -3454,11 +3454,12 @@

3454 3454
    text-wrap: balance;
3455 3455
  }
3456 3456
3457
  /* Its own line, always. The second tone is the object of the sentence, and a
3458
     headline that breaks it mid-phrase on one viewport and not another reads
3459
     as a wrap rather than as a decision. */
3460
  .hero__title-muted {
3461
    display: block;
3457
  /* Inline and quiet, ahead of the name it introduces. The word space is a
3458
     margin rather than a literal space in the template: HEEx collapses
3459
     whitespace between an interpolation and its neighbour, so a space typed
3460
     there is not one you can rely on. */
3461
  .hero__title-lead {
3462
    margin-inline-end: 0.25em;
3462 3463
    color: var(--text-muted);
3463 3464
  }
3464 3465
lib/openagents_web/components/landing.ex modified +6 -6

@@ -121,10 +121,10 @@ defmodule OpenAgentsWeb.UI.Landing do

121 121
  The figure is a slot rather than an image attribute, so a page can put a live
122 122
  surface in the frame instead of a screenshot of one.
123 123
124
  `title_muted` is a second headline line in the muted tier. Two tones over two
125
  lines is what separates the claim from its object -- the setup is not the
126
  point, the name is -- and doing it with an attribute keeps the break out of
127
  the caller's markup, where a `<br>` would fight `text-wrap: balance`.
124
  `title_lead` is a muted run set inline before the headline. Two tones on one
125
  line is what separates the setup from the claim -- "Introducing" is grammar,
126
  the product name is the point -- and putting the quiet half first means the
127
  eye lands on the name rather than on the word announcing it.
128 128
129 129
  Below the actions sit three quieter rows, in the order a reader needs them: a
130 130
  `command` to run, a `note` qualifying it, and `links` to what the band did

@@ -136,7 +136,7 @@ defmodule OpenAgentsWeb.UI.Landing do

136 136
  needs the division, and one whose next band is a figure does not.
137 137
  """
138 138
  attr :title, :string, required: true
139
  attr :title_muted, :string, default: nil, doc: "a second headline line, in the muted tier"
139
  attr :title_lead, :string, default: nil, doc: "a muted run set inline before the headline"
140 140
  attr :description, :string, default: nil
141 141
  attr :rule, :boolean, default: false, doc: "draw the closing hairline"
142 142
  attr :class, :any, default: nil

@@ -158,7 +158,7 @@ defmodule OpenAgentsWeb.UI.Landing do

158 158
      <div class="hero__lede">
159 159
        <div :if={@eyebrow != []} class="hero__eyebrow appear">{render_slot(@eyebrow)}</div>
160 160
        <h1 class="hero__title appear">
161
          {@title}<span :if={@title_muted} class="hero__title-muted">{@title_muted}</span>
161
          <span :if={@title_lead} class="hero__title-lead">{@title_lead}</span>{@title}
162 162
        </h1>
163 163
        <p :if={@description} class="hero__description appear appear--delay-1">
164 164
          {@description}
lib/openagents_web/live/components_live.ex modified +5 -5

@@ -1660,14 +1660,14 @@ defmodule OpenAgentsWeb.ComponentsLive do

1660 1660
      </div>
1661 1661
1662 1662
      <p class="text-sm text-base-content/60">
1663
        A second headline tone, a command to run, a note qualifying it, and quiet links
1664
        under everything else. The muted line always breaks on its own, so the split
1665
        between the claim and its object is a decision rather than a wrap.
1663
        A muted run ahead of the headline, a command to run, a note qualifying it, and
1664
        quiet links under everything else. Putting the quiet half first means the eye
1665
        lands on the name rather than on the word announcing it.
1666 1666
      </p>
1667 1667
      <div class="demo-frame">
1668 1668
        <Landing.hero
1669
          title="Introducing"
1670
          title_muted="Coder."
1669
          title="Coder."
1670
          title_lead="Introducing"
1671 1671
          description="Your all-in-one coding agent."
1672 1672
        >
1673 1673
          <:eyebrow>
lib/openagents_web/live/home_live.ex modified +16 -3

@@ -545,11 +545,17 @@ defmodule OpenAgentsWeb.HomeLive do

545 545
        It closes with a rule rather than running straight into the feature
546 546
        grid, so the claim and the way to act on it read as one band. --%>
547 547
        <Landing.hero
548
          title="Introducing"
549
          title_muted="Coder."
548
          title="Coder."
549
          title_lead="Introducing"
550 550
          description="Your all-in-one coding agent."
551 551
          rule
552 552
        >
553
          <%!-- Commented out rather than deleted, and for the same reason as
554
          the figure below: the shape is right and what it announces does not
555
          exist yet. A pill is a link, and one that opens a post nobody has
556
          written spends the reader's attention and returns none of it.
557
          Restore it when there is a post to point at.
558
553 559
          <:eyebrow>
554 560
            <Landing.announce
555 561
              lead="Coder is here"

@@ -557,12 +563,19 @@ defmodule OpenAgentsWeb.HomeLive do

557 563
              navigate={~p"/coder"}
558 564
            />
559 565
          </:eyebrow>
566
          --%>
560 567
561 568
          <:command>
562 569
            <Landing.install_command id="home-install-command" command={@install_command} />
563 570
          </:command>
564 571
565
          <:note>Every new account starts with $20 of credit.</:note>
572
          <%!-- Two lines, not one sentence. The first is what the reader gets
573
          and the second is what it costs them to get it, and running them
574
          together would let the second read as a condition on the credit
575
          rather than on the account. --%>
576
          <:note>
577
            Every new account starts with $20 of credit.<br />Login with GitHub required.
578
          </:note>
566 579
567 580
          <:links>
568 581
            <.button navigate={~p"/docs"} variant={:ghost} size={:sm} class="hero__link">

This page updates live while a promote is in flight · changelog