Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

refactor(site/src): migrate shared Pill to Badge - #27638

#27638
Draft
jakehwll wants to merge 1 commit into
maincoder/coder:mainfrom
jakehwll/migrate-pill-to-badgecoder/coder:jakehwll/migrate-pill-to-badgeCopy head branch name to clipboard
Draft

refactor(site/src): migrate shared Pill to Badge#27638
jakehwll wants to merge 1 commit into
maincoder/coder:mainfrom
jakehwll/migrate-pill-to-badgecoder/coder:jakehwll/migrate-pill-to-badgeCopy head branch name to clipboard

Conversation

@jakehwll

Copy link
Copy Markdown
Contributor

🤖 This PR was written by Coder Agents on behalf of Jake Howell.

Summary

Deletes the shared Pill component (site/src/components/Pill/) and migrates every consumer to Badge. Accepts the intentional visual shift (rounded-fullrounded-md, slightly different color tokens). No ThemeRole variants were added to Badge.

Key changes

  • Added site/src/components/Badge/themeRoleToBadgeVariant.ts, a small mapper used at call sites that receive a ThemeRole (e.g. StatusBadge, TemplateVersionStatusBadge).
  • Exported BadgeProps from Badge.tsx so the mapper and status helpers can reference the variant type.
  • Replaced PillSpinner with <Spinner loading />.
  • Renamed StatusPillStatusBadge (folder, file, and export) and updated the audit log and connection log imports.
  • Extended Badge.stories.tsx with a status + spinner icon pattern (rather than porting the full Pill story).

Variant mapping applied

Pill type Badge variant
success green
error destructive
warning, danger warning
active, notice info
inactive, muted, info default
preview purple

Out of scope

The local Health-page Pill in site/src/pages/HealthPage/Content.tsx is a separate component with no shared import; it will be migrated in a follow-up.

Validation

  • pnpm check (biome) passes
  • pnpm lint (biome + tsc + circular-deps + compiler + knip) passes
  • pnpm test:storybook for Badge, TemplatePageHeader, and AuditLogRow stories: 30/30 pass
  • Grep for components/Pill and PillSpinner in site/src returns nothing
Implementation plan

Migrate Pill to Badge

Goal

Delete site/src/components/Pill/Pill.tsx and migrate every shared-Pill consumer to site/src/components/Badge/Badge.tsx. Accept the visual shift (rounded-fullrounded-md, slightly different color tokens). Do not add ThemeRole variants to Badge.

Out of scope: the local Health-page Pill in site/src/pages/HealthPage/Content.tsx (separate component, no shared import). Rename/migrate that in a follow-up.

Variant mapping

Use this fixed mapping at every call site (Pill type → Badge variant):

Pill type Badge variant Notes
success green
error destructive
warning, danger warning Pill treats danger like orange warning
active, notice info sky / pending
inactive, muted, info default Pill info is neutral grey; Badge info is sky, so map Pill info to default
preview purple

Other remaps:

  • icon={node} → put node as the first child of Badge
  • size="lg"size="md" (closest); add a local className only if a specific layout breaks
  • PillSpinner<Spinner loading /> from site/src/components/Spinner/Spinner.tsx
  • Prefer existing wrappers when they already exist (e.g. DeprecatedBadge on the template header)

For ThemeRole-driven helpers (httpStatusColor, status getters), add a tiny shared mapper next to Badge (site/src/components/Badge/themeRoleToBadgeVariant.ts). Use it in StatusPill and any site that still receives ThemeRole rather than hardcoding variants twice.

Call-site work (ordered easy → hard)

  1. Trivial label chips (import swap + variant map): TemplatePageHeader (use DeprecatedBadge), VersionRow, ChangeWorkspaceVersionDialog, PermissionPillsList, IdpPillList, OrganizationPills
  2. Icon-as-child chips: Provisioner, ProvisionerTag (local BooleanPill becomes a Badge wrapper), TemplateExampleCard (keep clickable styles via className)
  3. Status + spinner: TemplateVersionStatusBadge (Badge + children icons; PillSpinnerSpinner), utils/workspace.tsx (replace PillSpinner imports only)
  4. Wrappers that own ThemeRole: StatusPill (switch to Badge + themeRoleToBadgeVariant(httpStatusColor(...)); rename to StatusBadge), Notifications (Badge with severity className overrides)
  5. Delete shared Pill: remove Pill.tsx, Pill.stories.tsx, and the components/Pill folder; extend Badge.stories.tsx only if a migrated pattern is missing (icon + spinner status)

Non-goals / constraints

  • Do not change Badge's default shape or add rounded-full
  • Do not broaden Badge's public API with type / icon props (that recreates Pill)
  • Do not rename IDP/permission "PillsList" filenames unless needed for imports
  • Modify Badge itself only for the new mapper helper (or stories)

Validation

  • pnpm check / pnpm lint under site/
  • Storybook smoke on Badge + affected pages
  • Grep for components/Pill and PillSpinner must be empty in site/src

Delete the shared Pill component and migrate every consumer to Badge.
Add a themeRoleToBadgeVariant helper for call sites that receive a
ThemeRole, replace PillSpinner with Spinner, and rename StatusPill to
StatusBadge. Accepts the visual shift from rounded-full to rounded-md.

The local Health-page Pill is intentionally out of scope.
@jakehwll jakehwll changed the title 🤖 refactor(site/src): migrate shared Pill to Badge refactor(site/src): migrate shared Pill to Badge Jul 29, 2026
@jakehwll jakehwll added the experimental Changes that might not necessarily be merged, until its approved to proceed with. label Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

experimental Changes that might not necessarily be merged, until its approved to proceed with.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Morty Proxy This is a proxified and sanitized view of the page, visit original site.