Open demo

CSS code

HTML
<div class="lf">
<main class="lf-box">
  <div class="lf-mark" aria-hidden="true">N</div>
  <h1>Sign in to your workspace</h1>
  <p class="lf-sub">Enter your team's Northwind address to be sent to your company's login.</p>
  <form onsubmit="event.preventDefault()">
    <label class="lf-label" for="team">Workspace address</label>
    <div class="lf-combo">
      <input id="team" name="workspace" type="text" placeholder="your-team" autocomplete="on" required
             spellcheck="false" autocapitalize="off" aria-describedby="team-suffix">
      <span class="lf-suffix" id="team-suffix">.northwind.app</span>
    </div>
    <button class="lf-btn" type="submit">Continue with SSO</button>
  </form>
  <div class="lf-or" id="prov-label"><span>or use</span></div>
  <div class="lf-provs" role="group" aria-labelledby="prov-label">
    <button class="lf-prov" type="button"><span class="lf-ic" style="background:#00297a" aria-hidden="true">O</span> Okta</button>
    <button class="lf-prov" type="button"><span class="lf-ic" style="background:#0078d4" aria-hidden="true">M</span> Microsoft Entra ID</button>
    <button class="lf-prov" type="button"><span class="lf-ic" style="background:#1a73e8" aria-hidden="true">G</span> Google Workspace</button>
  </div>
  <p class="lf-foot">Not on a team plan? <a href="#">Sign in with a password</a></p>
</main>
</div>
CSS
/* Enterprise SSO: a workspace subdomain field with a fixed suffix, then named identity providers.
   The suffix is tied to the input with aria-describedby so screen readers hear the full address. */
.lf{--lf-brand:#4f46e5;--lf-brand-dark:#4338ca;--lf-ink:#111827;--lf-muted:#6b7280;--lf-line:#e5e7eb;--lf-edge:#868c99;--lf-bg:#f5f6fa;
  min-height:100vh;display:grid;grid-template-columns:minmax(0,1fr);place-items:center;padding:28px 20px;
  background:var(--lf-bg);color:var(--lf-ink);line-height:normal;
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
.lf,.lf *,.lf *::before,.lf *::after{box-sizing:border-box}
.lf :where(h1,p,form){margin:0}
.lf :where(input,button){font:inherit}
.lf a{color:var(--lf-brand);text-decoration:none;font-weight:600}
.lf a:hover{text-decoration:underline}
.lf :focus-visible{outline:2px solid var(--lf-brand);outline-offset:2px}
.lf-box{width:100%;max-width:430px;background:#fff;border:1px solid var(--lf-line);border-radius:16px;
  padding:38px 34px;box-shadow:0 10px 34px rgba(17,24,39,.06)}
.lf-mark{width:42px;height:42px;border-radius:12px;background:var(--lf-brand);display:grid;place-items:center;
  color:#fff;font-weight:800;margin-bottom:22px}
.lf h1{font-size:1.4rem;letter-spacing:-.02em;margin-bottom:7px}
.lf-sub{color:var(--lf-muted);font-size:.93rem;line-height:1.6;margin-bottom:26px}
.lf-label{display:block;font-size:.85rem;font-weight:600;margin-bottom:6px}
.lf-combo{display:flex;align-items:center;border:1px solid var(--lf-edge);border-radius:10px;
  overflow:hidden;transition:border-color .15s,box-shadow .15s;background:#fff}
.lf-combo:focus-within{border-color:var(--lf-brand);box-shadow:0 0 0 3px rgba(79,70,229,.15)}
.lf-combo input{flex:1;min-width:0;border:0;padding:12px 4px 12px 14px;font-size:.95rem;background:none;color:inherit}
.lf-combo input::placeholder{color:var(--lf-muted)}
.lf-combo input:focus{outline:none}
.lf-suffix{padding:12px 14px 12px 2px;color:#636a77;font-size:.95rem;white-space:nowrap;
  background:var(--lf-bg);align-self:stretch;display:flex;align-items:center;border-left:1px solid var(--lf-line)}
.lf-btn{width:100%;padding:13px;border:0;border-radius:10px;background:var(--lf-brand);color:#fff;margin-top:20px;
  font-size:.97rem;font-weight:700;cursor:pointer;transition:background .15s}
.lf-btn:hover{background:var(--lf-brand-dark)}
.lf-or{display:flex;align-items:center;gap:14px;margin:24px 0 4px;color:var(--lf-muted);font-size:.8rem;
  letter-spacing:.08em;text-transform:uppercase}
.lf-or::before,.lf-or::after{content:"";flex:1;height:1px;background:var(--lf-line)}
.lf-provs{display:grid;gap:9px;margin:24px 0 0}
.lf-prov{display:flex;align-items:center;gap:11px;padding:12px 14px;border:1px solid var(--lf-line);
  border-radius:11px;background:#fff;font-size:.92rem;font-weight:600;color:var(--lf-ink);cursor:pointer;
  text-align:left;transition:background .15s,border-color .15s}
.lf-prov:hover{background:var(--lf-bg);border-color:#cbd0dd}
.lf-ic{width:24px;height:24px;border-radius:6px;display:grid;place-items:center;font-size:.68rem;
  font-weight:800;color:#fff;flex-shrink:0}
.lf-foot{margin-top:24px;text-align:center;font-size:.89rem;color:var(--lf-muted)}
@media (max-width:400px){.lf-suffix{font-size:.85rem;padding-left:6px;padding-right:10px}}
@media (prefers-reduced-motion:reduce){.lf-combo,.lf-btn,.lf-prov{transition:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div class="lf d-grid">
<main class="card w-100">
  <div class="card-body">
    <div class="lf-mark" aria-hidden="true">N</div>
    <h1>Sign in to your workspace</h1>
    <p class="lf-sub text-body-secondary">Enter your team's Northwind address to be sent to your company's login.</p>
    <form onsubmit="event.preventDefault()">
      <label class="form-label" for="team">Workspace address</label>
      <div class="input-group flex-nowrap">
        <input class="form-control" id="team" name="workspace" type="text" placeholder="your-team" autocomplete="on" required
               spellcheck="false" autocapitalize="off" aria-describedby="team-suffix">
        <span class="input-group-text" id="team-suffix">.northwind.app</span>
      </div>
      <button class="btn btn-brand lf-submit w-100" type="submit">Continue with SSO</button>
    </form>
    <div class="lf-or d-flex align-items-center text-body-secondary text-uppercase" id="prov-label"><span>or use</span></div>
    <div class="lf-provs d-grid" role="group" aria-labelledby="prov-label">
      <button class="btn btn-prov d-flex align-items-center text-start" type="button"><span class="lf-ic" style="background:#00297a" aria-hidden="true">O</span> Okta</button>
      <button class="btn btn-prov d-flex align-items-center text-start" type="button"><span class="lf-ic" style="background:#0078d4" aria-hidden="true">M</span> Microsoft Entra ID</button>
      <button class="btn btn-prov d-flex align-items-center text-start" type="button"><span class="lf-ic" style="background:#1a73e8" aria-hidden="true">G</span> Google Workspace</button>
    </div>
    <p class="lf-foot text-body-secondary text-center mb-0">Not on a team plan? <a href="#">Sign in with a password</a></p>
  </div>
</main>
</div>
CSS
/* Bootstrap .card, .input-group, .form-control and .btn, recoloured through Bootstrap's CSS variables.
   The whole .input-group takes the focus ring, so the suffix reads as part of the field. */
.lf{--lf-brand:#4f46e5;--lf-brand-dark:#4338ca;--lf-ink:#111827;--lf-muted:#6b7280;--lf-line:#e5e7eb;--lf-edge:#868c99;
  --bs-body-color:var(--lf-ink);--bs-secondary-color:var(--lf-muted);--bs-border-color:var(--lf-edge);
  --bs-link-color-rgb:79,70,229;--bs-link-hover-color-rgb:67,56,202;
  min-height:100vh;grid-template-columns:minmax(0,1fr);place-items:center;padding:28px 20px;
  background:#f5f6fa;color:var(--lf-ink);line-height:normal}
.lf a{font-weight:600;text-decoration:none}
.lf a:hover{text-decoration:underline}
.lf :focus-visible{outline:2px solid var(--lf-brand);outline-offset:2px}
.lf .card{--bs-card-border-color:var(--lf-line);--bs-card-border-radius:16px;--bs-card-spacer-y:38px;--bs-card-spacer-x:34px;
  max-width:430px;box-shadow:0 10px 34px rgba(17,24,39,.06)}
.lf-mark{width:42px;height:42px;border-radius:12px;background:var(--lf-brand);display:grid;place-items:center;
  color:#fff;font-weight:800;margin-bottom:22px}
.lf h1{font-size:1.4rem;font-weight:700;line-height:normal;letter-spacing:-.02em;margin-bottom:7px}
.lf-sub{font-size:.93rem;line-height:1.6;margin-bottom:26px}
.lf .form-label{font-size:.85rem;font-weight:600;margin-bottom:6px}
.lf .input-group{border-radius:10px;transition:box-shadow .15s}
.lf .input-group:focus-within{box-shadow:0 0 0 3px rgba(79,70,229,.15)}
.lf .input-group:focus-within>*{border-color:var(--lf-brand)}
.lf .input-group .form-control{padding:12px 4px 12px 14px;border-right:0;border-radius:10px 0 0 10px;font-size:.95rem;line-height:normal}
.lf .input-group .form-control:focus{box-shadow:none;outline:none}
.lf .input-group .form-control::placeholder{color:var(--lf-muted)}
.lf .input-group-text{padding:12px 14px 12px 2px;border-radius:0 10px 10px 0;font-size:.95rem;color:#636a77;background:#f5f6fa;
  border-left:1px solid var(--lf-line)!important;margin-left:0!important}
.lf .btn-brand{--bs-btn-line-height:normal;--bs-btn-border-width:0;--bs-btn-padding-y:13px;--bs-btn-font-size:.97rem;--bs-btn-font-weight:700;--bs-btn-border-radius:10px;
  --bs-btn-bg:var(--lf-brand);--bs-btn-border-color:var(--lf-brand);--bs-btn-color:#fff;
  --bs-btn-hover-bg:var(--lf-brand-dark);--bs-btn-hover-border-color:var(--lf-brand-dark);--bs-btn-hover-color:#fff;
  --bs-btn-active-bg:var(--lf-brand-dark);--bs-btn-active-border-color:var(--lf-brand-dark);--bs-btn-active-color:#fff;
  --bs-btn-focus-box-shadow:none;transition:background-color .15s}
.lf-submit{margin-top:20px}
.lf-or{gap:14px;margin:24px 0 4px;font-size:.8rem;letter-spacing:.08em}
.lf-or::before,.lf-or::after{content:"";flex:1;height:1px;background:var(--lf-line)}
.lf-provs{gap:9px;margin-top:24px}
.lf .btn-prov{--bs-btn-line-height:normal;--bs-btn-padding-y:12px;--bs-btn-padding-x:14px;--bs-btn-font-size:.92rem;--bs-btn-font-weight:600;--bs-btn-border-radius:11px;
  --bs-btn-bg:#fff;--bs-btn-border-color:var(--lf-line);--bs-btn-color:var(--lf-ink);
  --bs-btn-hover-bg:#f5f6fa;--bs-btn-hover-border-color:#cbd0dd;--bs-btn-hover-color:var(--lf-ink);
  --bs-btn-active-bg:#f5f6fa;--bs-btn-active-border-color:#cbd0dd;--bs-btn-active-color:var(--lf-ink);--bs-btn-focus-box-shadow:none;
  gap:11px;transition:background-color .15s,border-color .15s}
.lf-ic{width:24px;height:24px;border-radius:6px;display:grid;place-items:center;font-size:.68rem;font-weight:800;color:#fff;flex-shrink:0}
.lf-foot{margin-top:24px;font-size:.89rem}
@media (max-width:400px){.lf .input-group-text{font-size:.85rem;padding-left:6px;padding-right:10px}}
@media (prefers-reduced-motion:reduce){.lf .input-group,.lf .btn{transition:none}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div class="grid min-h-screen grid-cols-[minmax(0,1fr)] place-items-center bg-page px-5 py-7 font-[-apple-system,BlinkMacSystemFont,'Segoe_UI',Roboto,Helvetica,Arial,sans-serif] leading-[normal] text-ink">
<main class="w-full max-w-[430px] rounded-2xl border border-line bg-white px-[34px] py-[38px] shadow-[0_10px_34px_rgba(17,24,39,.06)]">
  <div class="mb-[22px] grid size-[42px] place-items-center rounded-xl bg-brand font-extrabold text-white" aria-hidden="true">N</div>
  <h1 class="mb-[7px] text-[1.4rem] font-bold tracking-[-.02em]">Sign in to your workspace</h1>
  <p class="mb-[26px] text-[.93rem] leading-[1.6] text-muted">Enter your team's Northwind address to be sent to your company's login.</p>
  <form onsubmit="event.preventDefault()">
    <label class="mb-1.5 block text-[.85rem] font-semibold" for="team">Workspace address</label>
    <div class="flex items-center overflow-hidden rounded-[10px] border border-edge bg-white transition-[border-color,box-shadow] duration-150 focus-within:border-brand focus-within:shadow-[0_0_0_3px_rgba(79,70,229,.15)] motion-reduce:transition-none">
      <input class="min-w-0 flex-1 border-0 bg-transparent py-3 pr-1 pl-3.5 text-[.95rem] placeholder:text-muted focus:outline-none"
             id="team" name="workspace" type="text" placeholder="your-team" autocomplete="on" required
             spellcheck="false" autocapitalize="off" aria-describedby="team-suffix">
      <span class="flex items-center self-stretch border-l border-line bg-page py-3 pr-2.5 pl-1.5 text-[.85rem] whitespace-nowrap text-suffix min-[401px]:pr-3.5 min-[401px]:pl-0.5 min-[401px]:text-[.95rem]" id="team-suffix">.northwind.app</span>
    </div>
    <button class="mt-5 w-full cursor-pointer rounded-[10px] bg-brand p-[13px] text-[.97rem] font-bold text-white transition-[background-color,border-color,color] duration-150 hover:bg-brand-dark focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand motion-reduce:transition-none" type="submit">Continue with SSO</button>
  </form>
  <div class="mt-6 mb-1 flex items-center gap-3.5 text-[.8rem] tracking-[.08em] text-muted uppercase before:h-px before:flex-1 before:bg-line after:h-px after:flex-1 after:bg-line" id="prov-label"><span>or use</span></div>
  <div class="mt-6 grid gap-[9px]" role="group" aria-labelledby="prov-label">
    <button class="flex cursor-pointer items-center gap-[11px] rounded-[11px] border border-line bg-white px-3.5 py-3 text-left text-[.92rem] font-semibold text-ink transition-[background-color,border-color,color] duration-150 hover:border-[#cbd0dd] hover:bg-page focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand motion-reduce:transition-none" type="button"><span class="grid size-6 shrink-0 place-items-center rounded-md bg-[#00297a] text-[.68rem] font-extrabold text-white" aria-hidden="true">O</span> Okta</button>
    <button class="flex cursor-pointer items-center gap-[11px] rounded-[11px] border border-line bg-white px-3.5 py-3 text-left text-[.92rem] font-semibold text-ink transition-[background-color,border-color,color] duration-150 hover:border-[#cbd0dd] hover:bg-page focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand motion-reduce:transition-none" type="button"><span class="grid size-6 shrink-0 place-items-center rounded-md bg-[#0078d4] text-[.68rem] font-extrabold text-white" aria-hidden="true">M</span> Microsoft Entra ID</button>
    <button class="flex cursor-pointer items-center gap-[11px] rounded-[11px] border border-line bg-white px-3.5 py-3 text-left text-[.92rem] font-semibold text-ink transition-[background-color,border-color,color] duration-150 hover:border-[#cbd0dd] hover:bg-page focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand motion-reduce:transition-none" type="button"><span class="grid size-6 shrink-0 place-items-center rounded-md bg-[#1a73e8] text-[.68rem] font-extrabold text-white" aria-hidden="true">G</span> Google Workspace</button>
  </div>
  <p class="mt-6 text-center text-[.89rem] text-muted">Not on a team plan? <a class="font-semibold text-brand hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand" href="#">Sign in with a password</a></p>
</main>
</div>
CSS
@theme {
  --color-brand: #4f46e5;
  --color-brand-dark: #4338ca;
  --color-ink: #111827;
  --color-muted: #6b7280;
  --color-line: #e5e7eb;
  --color-edge: #868c99;
  --color-page: #f5f6fa;
  --color-suffix: #636a77;
}

About this set

A sign-in screen for team plans that authenticate through a company identity provider. The main field takes the workspace subdomain with a fixed .northwind.app suffix drawn inside the same box, followed by a Continue with SSO button. Under an or use divider, three provider buttons name Okta, Microsoft Entra ID and Google Workspace, each with a small coloured initial badge, and a footer link sends people without a team plan to password sign-in. Use it for B2B products where the workspace decides which identity provider to redirect to. The field and suffix are wrapped in one container that takes the border, and :focus-within moves the focus ring to the whole box, so the suffix reads as part of the input. The suffix is linked to the input with aria-describedby, so screen readers announce the full address format. The field turns off spellcheck and autocapitalisation, which would otherwise mangle subdomains. In Bootstrap the field is an .input-group with .input-group-text; in Tailwind it is a flex row with focus-within utilities.

What’s included

  • Workspace field with a fixed domain suffix inside the box
  • Focus ring on the whole field via :focus-within
  • Named provider buttons grouped under an accessible label
  • Spellcheck and autocapitalise off for subdomains
  • Suffix shrinks on screens under 400px wide

Accessibility

The workspace field has a visible label and is described by the suffix text; the provider buttons sit in a group labelled by the or use divider and each has its provider's name as visible text. The whole field shows a brand ring on focus and every button and link has a 2px outline. Transitions are removed under prefers-reduced-motion.

Customise it

Change the suffix text in the markup and its colour (#636a77, chosen for 4.5:1 on the grey band). Brand colour is --lf-brand (plain CSS, Bootstrap) or --color-brand (Tailwind). Provider badge colours are inline background values.