Skip to content

Settings → Team: swap cost banner for seat-cap alert#10272

Open
IsaiahWitzke wants to merge 5 commits intomasterfrom
iw/seat-caps-changes
Open

Settings → Team: swap cost banner for seat-cap alert#10272
IsaiahWitzke wants to merge 5 commits intomasterfrom
iw/seat-caps-changes

Conversation

@IsaiahWitzke
Copy link
Copy Markdown
Contributor

@IsaiahWitzke IsaiahWitzke commented May 6, 2026

implementing the header designs from here... see tech doc here

this pr just replaces the "additional members are billed at ..." UI at the top since if you're at/near your team limit already, you should already know this:

image

testing

team full (admin)

image

team full (non-admin)

image

team almost full (admin)

image

team almost full (non-admin)

image

on build plan the cta changes from sales mailto to /upgrade link

image

When a team is at or near (cap - 1) its seat cap, replace the per-seat
cost callout in the team invitation section with an alert banner that
warns the admin/non-admin about the cap and points them at the right
remediation:

- Non-admins (any plan): muted "contact your admin" body and no CTA.
- Admins on Build / Build Max: "Upgrade" CTA opening /upgrade.
- Admins on Build Business: "Contact sales" CTA opening
  mailto:sales@warp.dev.

Layout matches the existing cost banner: alert icon + vertical
title/body stack on the left and the CTA right-aligned via
MainAxisAlignment::SpaceBetween. Title text uses the same subsection
header styling as the cost banner. Adds a `contact_sales` helper next
to the existing `contact_support` helper in admin_actions and a
matching `TeamsPageAction::ContactSales` action.

Co-Authored-By: Oz <oz-agent@warp.dev>
@cla-bot cla-bot Bot added the cla-signed label May 6, 2026
IsaiahWitzke and others added 4 commits May 6, 2026 13:21
Aligns the at/over-cap seat alert with the existing red full-panel
treatment in render_cloud_mode_error_screen (10% opacity background,
full-opacity red border).

Co-Authored-By: Oz <oz-agent@warp.dev>
The Secondary variant's hover state uses surface_3 (grey), which clashed
visually with the red-tinted at-cap banner. Outlined keeps a transparent
background and only animates its border on hover, letting the red panel
tint show through. The almost-full banner stays neutral, so it keeps the
Secondary variant.

Co-Authored-By: Oz <oz-agent@warp.dev>
Previously the at/over-cap banner used Outlined to avoid the grey hover
on the red panel, but Outlined's hover border defaults to the accent
color (blue) which still looked off. Switch back to Secondary for both
banner states so idle styling is consistent, and override the at-cap
button's hovered styles to use ui_error_color (10% bg, full-opacity
border) so hovering intensifies the red panel tint instead of fighting
it.

Co-Authored-By: Oz <oz-agent@warp.dev>
@IsaiahWitzke IsaiahWitzke requested a review from jefflloyd May 6, 2026 21:49
@IsaiahWitzke IsaiahWitzke marked this pull request as ready for review May 6, 2026 21:49
@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented May 6, 2026

@IsaiahWitzke

I'm starting a first review of this pull request.

You can view the conversation on Warp.

I completed the review and no human review was requested for this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overview

This PR replaces the paid-seat pricing banner in Settings → Team with a seat-cap alert and admin CTA when the workspace is full or one seat away from full.

Concerns

  • The new CTA sends every non-Business capped team to the upgrade flow, instead of preserving the existing distinction between self-serve upgradeable tiers and capped tiers that need sales/support/admin handling.
  • The seat-cap alert is selected before delinquency-specific invite messaging, so full delinquent teams can receive an upgrade/sales CTA that conflicts with the billing-recovery path shown lower in the section.

Verdict

Found: 0 critical, 2 important, 0 suggestions

Request changes

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

} else {
(
"Upgrade",
TeamsPageAction::GenerateUpgradeLink { team_uid: team.uid },
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [IMPORTANT] This sends every non-Business capped team to the self-serve upgrade flow, but the existing invite-limit handling only uses upgrade when the tier is upgradeable and otherwise falls back to contact-admin/support copy. Non-upgradeable capped tiers can now get a broken or misleading CTA; gate this on upgrade eligibility and fall back to sales/support when not self-serve.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will address

&& workspace_size_policy.limit >= 1
&& team_size_i64 == workspace_size_policy.limit - 1;

if is_full || is_almost_full {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ [IMPORTANT] This alert is selected before the delinquency-specific invite copy runs, so PastDue/Unpaid teams that are full or almost full will see an Upgrade/Contact sales CTA even though the actionable path below is manage billing/contact admin. Keep the alert action aligned with delinquency_status or skip the seat-cap CTA for delinquent teams.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fair ig

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant