Skip to content

fix: Changed tailwind space to gap#5237

Merged
MichaelUnkey merged 9 commits intomainfrom
eng-2550-vertical-spacing-off-in-modal-after-tailwind-migration
Mar 10, 2026
Merged

fix: Changed tailwind space to gap#5237
MichaelUnkey merged 9 commits intomainfrom
eng-2550-vertical-spacing-off-in-modal-after-tailwind-migration

Conversation

@MichaelUnkey
Copy link
Collaborator

What does this PR do?

  • Replaced Tailwind space-x-* / space-y-* utility classes with gap-* equivalents across ~60 files in the dashboard app
  • Fixes vertical spacing inconsistencies in modals and other UI components introduced after the Tailwind migration

Background

The space-* utilities in Tailwind apply margins to child elements via a sibling combinator (> * + ), which can behave unexpectedly with certain flex/grid layouts —
particularly inside modals. Switching to gap-
provides more predictable and consistent spacing behavior that works correctly regardless of child element visibility
or DOM order.

Fixes # (issue)
ENG-2550

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • Chore (refactoring code, technical debt, workflow improvements)
  • Enhancement (small improvements)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How should this be tested?

  • Open modals throughout the dashboard (create key, billing plan selection, team invite, etc.) and verify vertical spacing looks correct
  • Check sheet/drawer components for correct header/footer spacing
  • Verify no layout regressions in the RBAC, permissions, deployments, and ratelimits sections
  • Spot-check in both light and dark mode

Checklist

Required

  • Filled out the "How to test" section in this PR
  • Read Contributing Guide
  • Self-reviewed my own code
  • Commented on my code in hard-to-understand areas
  • Ran pnpm build
  • Ran pnpm fmt
  • Ran make fmt on /go directory
  • Checked for warnings, there are none
  • Removed all console.logs
  • Merged the latest changes from main onto my branch with git pull origin main
  • My changes don't cause any responsiveness issues

Appreciated

image
  • If a UI change was made: Added a screen recording or screenshots to this PR
  • Updated the Unkey Docs if changes were necessary

@linear
Copy link

linear bot commented Mar 6, 2026

@vercel
Copy link

vercel bot commented Mar 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
dashboard Ready Ready Preview, Comment Mar 10, 2026 1:30pm

Request Review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 6, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 8f5f66d6-1032-4fbb-8bf0-11b4a69d6186

📥 Commits

Reviewing files that changed from the base of the PR and between bba397a and 7de0bff.

📒 Files selected for processing (2)
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/domain_list.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/domain_list.tsx

📝 Walkthrough

Walkthrough

This pull request systematically refactors CSS spacing utilities across the dashboard codebase, converting Tailwind's legacy space-y-* and space-x-* utilities to modern flex flex-col/row layouts with explicit gap-* values. Additionally, some fixed height values are standardized using Tailwind's size scale. No functional or behavioral changes are introduced.

Changes

Cohort / File(s) Summary
API Key Management - Create Key
web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/*
Layout refactored from space-y-* to flex flex-col gap-* utilities. First input height standardized to h-9.
API Key Management - Edit Key
web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/*
Container layouts converted from space-y-* to flex flex-col gap-*. Fixed widths normalized (e.g., w-[320px]w-80).
RBAC - Permissions & Roles
web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/components/*/..., web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/roles/components/upsert-role/components/*/...
Vertical spacing refactored from space-y-* to flex flex-col gap-* in permission and role field containers. Tooltip content widths simplified.
API Overview & Logs
web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/settings/components/delete-*.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/logs/components/table/runtime-log-details/index.tsx
Layout spacing converted to flex columns with gaps. Header padding adjusted to maintain alignment. Loading skeleton gaps updated.
Deployment & Domain Management
web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/*/...
Container layouts refactored from space-y-* to flex flex-col gap-* across promotion, rollback, and redeployment dialogs. Domain list tooltip widths optimized.
OpenAPI Diff Components
web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/openapi-diff/components/*.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/openapi-diff/page.tsx
Vertical spacing converted to flex column layouts. Maximum widths reduced from max-w-[280px] to max-w-70.
Rate Limit Components
web/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/_components/*.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/overrides/last-used-cell.tsx
Form container spacing refactored from space-y-* to flex flex-col gap-*. Loading skeleton horizontal gaps updated.
Billing & Settings
web/apps/dashboard/app/(app)/[workspaceSlug]/settings/billing/components/*.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/settings/team/invite*.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/identities/_components/dialogs/general-setup.tsx
Layout containers refactored from space-y-* to flex flex-col gap-*. Invite form field wrappers restructured with height constraints and row-based alignment.
Auth & Onboarding
web/apps/dashboard/app/auth/sign-up/[[...sign-up]]/page.tsx, web/apps/dashboard/app/new/components/onboarding-fallback.tsx, web/apps/dashboard/app/new/hooks/use-workspace-step.tsx, web/apps/dashboard/components/auth/turnstile-challenge.tsx
Vertical spacing utilities converted to flex column layouts with explicit gaps.
General Dashboard Components
web/apps/dashboard/components/dashboard/feedback-component.tsx, web/apps/dashboard/components/dashboard/metadata/metadata-setup.tsx, web/apps/dashboard/components/dashboard/ratelimits/ratelimit-setup.tsx, web/apps/dashboard/components/logs/filter-operator-input/index.tsx, web/apps/dashboard/components/selected-item-list.tsx, web/apps/dashboard/components/ui/sheet.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/region-badges.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/apis/_components/api-list-client.tsx, web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/permissions/components/upsert-permission/index.tsx
Consistent conversion of space-y-* and space-x-* to flex layouts with gap utilities. Minor width/size normalizations applied.
Projects Card Refactoring
web/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/projects-card.tsx
InfoTooltip props reformatted across multiple instances. Added security attribute rel="noopener noreferrer" to domain anchor tag.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title clearly describes the main change: replacing Tailwind space-* utilities with gap-* utilities to fix spacing inconsistencies.
Description check ✅ Passed The PR description is comprehensive and well-structured, covering all required template sections including what the PR does, type of change, testing instructions, and a completed checklist.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch eng-2550-vertical-spacing-off-in-modal-after-tailwind-migration

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…-vertical-spacing-off-in-modal-after-tailwind-migration
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/[deploymentId]/network/unkey-flow/components/simulate/tree-generate.tsx (1)

184-221: ⚠️ Potential issue | 🟠 Major

Replace type assertions with a parser at the input boundary.

Lines 194 and 211 use as "vertical" | "horizontal" to assert unvalidated DOM strings directly into state. Per repository guidelines, this compromises type safety and makes invalid states representable.

♻️ Minimal fix
+type LayoutDirection = GeneratorConfig["regionDirection"];
+
+const parseLayoutDirection = (value: string): LayoutDirection | null => {
+  switch (value) {
+    case "horizontal":
+    case "vertical":
+      return value;
+    default:
+      return null;
+  }
+};
+
 export function InternalDevTreeGenerator({ onGenerate, onReset }: DevTreeGeneratorProps) {
@@
                 <select
                   value={customConfig.regionDirection}
-                  onChange={(e) =>
-                    setCustomConfig((c) => ({
-                      ...c,
-                      regionDirection: e.target.value as "vertical" | "horizontal",
-                    }))
-                  }
+                  onChange={(e) => {
+                    const regionDirection = parseLayoutDirection(e.target.value);
+                    if (!regionDirection) return;
+                    setCustomConfig((c) => ({
+                      ...c,
+                      regionDirection,
+                    }));
+                  }}
@@
                 <select
                   value={customConfig.instanceDirection}
-                  onChange={(e) =>
-                    setCustomConfig((c) => ({
-                      ...c,
-                      instanceDirection: e.target.value as "vertical" | "horizontal",
-                    }))
-                  }
+                  onChange={(e) => {
+                    const instanceDirection = parseLayoutDirection(e.target.value);
+                    if (!instanceDirection) return;
+                    setCustomConfig((c) => ({
+                      ...c,
+                      instanceDirection,
+                    }));
+                  }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/[deploymentId]/network/unkey-flow/components/simulate/tree-generate.tsx
around lines 184 - 221, The onChange handlers for the two select elements are
using type assertions (e.target.value as "vertical" | "horizontal") which allows
invalid DOM strings into state; replace these assertions with an input-bound
parser/validator that checks e.target.value and only returns "horizontal" or
"vertical" (or a safe default) before calling setCustomConfig; implement a small
type-guard/parse function (e.g., parseDirection) and use it in the onChange for
the regionDirection and instanceDirection updates, leaving
generateMutation.disabled logic unchanged.
web/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx (1)

83-89: ⚠️ Potential issue | 🔴 Critical

Deletion confirmation is still bypassable.

The exact-name check only disables the footer button. Because the schema currently accepts any string, pressing Enter in the input still reaches onSubmit and deletes the namespace without a matching confirmation value. Please enforce the name === namespace.name check in the submit path as well.

🛡️ Minimal guard
-  const onSubmit = async () => {
+  const onSubmit = async ({ name }: FormValues) => {
+    if (name !== namespace.name) {
+      return;
+    }
     collection.ratelimitNamespaces.delete(namespace.id);
     router.push(`/${workspace.slug}/ratelimits`);
 
     //await deleteNamespace.mutateAsync({ namespaceId: namespace.id });
   };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx
around lines 83 - 89, The form currently only disables the footer button but
doesn't enforce the confirmation on submit; update the submit handler (the
function passed as onSubmit to handleSubmit, i.e., onSubmit) to verify that the
registered field value (registered via register("name")) exactly equals
namespace.name before proceeding with deletion; if it does not match, abort the
deletion flow and surface an error via the form API (e.g., setError) or return
early so pressing Enter cannot bypass confirmation in the
"delete-namespace-form".
web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/credits-setup.tsx (1)

139-167: ⚠️ Potential issue | 🟠 Major

Missing flex context breaks spacing.

The gap-y-1.5 utility requires a flex or grid context to work. Without flex flex-col, the gap will have no effect and the label, Select, and FormDescription will have no vertical spacing between them.

Proposed fix
-         <div className="gap-y-1.5">
+         <div className="flex flex-col gap-y-1.5">
            <div className="text-gray-11 text-[13px] flex items-center">Refill Rate</div>
            <Select
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/credits-setup.tsx
around lines 139 - 167, The container div currently using the utility
"gap-y-1.5" has no flex/grid context so gaps do nothing; update the div wrapping
the label, Select and FormDescription (the div with className "gap-y-1.5" in
credits-setup.tsx) to include a layout context such as "flex flex-col gap-y-1.5"
so vertical spacing between the label, Select (Select, SelectTrigger,
SelectContent, SelectItem) and FormDescription is applied.
web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/permissions/components/upsert-permission/index.tsx (1)

203-212: ⚠️ Potential issue | 🟡 Minor

CSS selector won't match textarea element.

The selector [&_input:first-of-type] targets <input> elements, but FormTextarea renders a <textarea>. This height class will have no effect.

Proposed fix
              <FormTextarea
-               className="[&_input:first-of-type]:h-9"
+               className="[&_textarea:first-of-type]:h-9"
                label="Description"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/authorization/permissions/components/upsert-permission/index.tsx
around lines 203 - 212, The height utility is targeting inputs but FormTextarea
renders a <textarea>, so update the class on the FormTextarea (the className
that currently contains "[&_input:first-of-type]:h-9") to target the textarea
element instead (e.g. use a selector that matches textarea such as
"[&_textarea:first-of-type]:h-9" or an equivalent selector that correctly
selects the rendered <textarea>) so the height rule applies.
🧹 Nitpick comments (1)
web/apps/dashboard/components/ui/sheet.tsx (1)

97-102: Consider adding base gap for mobile layout.

The sm:gap-2 only applies gap on small screens and up. In mobile view (flex-col-reverse), there will be no gap between footer items. If this is intentional for tight mobile spacing, this is fine; otherwise, consider adding a base gap-2.

Optional: Add base gap for consistency
  <div
-   className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2", className)}
+   className={cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className)}
    {...props}
  />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/apps/dashboard/components/ui/sheet.tsx` around lines 97 - 102,
SheetFooter currently uses "flex flex-col-reverse sm:flex-row sm:justify-end
sm:gap-2" so the gap only applies at sm and above; add a base gap (e.g. "gap-2")
to apply spacing in the mobile flex-col-reverse layout. Update the className
string in the SheetFooter component (the JSX div using cn) to include the base
gap alongside the existing sm:gap-2 so mobile and larger screens both get
consistent spacing.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/apis/_components/api-list-client.tsx:
- Line 82: The footer's spacing was tightened by changing the utility from
space-y-4 to gap-1; restore the original spacing by using gap-4 (or the original
space-y-4 equivalent) on the container div (the element with className "flex
flex-col items-center justify-center mt-8 pb-8 ...") so the vertical spacing
between the count label and CTA matches the previous design.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx:
- Around line 27-32: The Roles section has a 2px horizontal padding mismatch
between the empty-state container (uses class "px-[14px]") and the populated
header (uses "px-4"); update the empty-state element in roles-permissions.tsx to
use "px-4" (or alternatively change the header to "px-3.5" if you prefer 14px
total) so both the header and empty state share the same horizontal padding
class for visual consistency.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/projects/new/steps/deployment-live.tsx:
- Line 94: The div in deployment-live.tsx uses an invalid Tailwind class "w-225"
which will be ignored; revert this by replacing "w-225" in the className string
on the div (the one currently set to "w-225 flex flex-col gap-6") with the
original valid width utility "w-[900px]" so the container regains its 900px
constraint (leave the "flex flex-col gap-6" change intact).

---

Outside diff comments:
In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/credits-setup.tsx:
- Around line 139-167: The container div currently using the utility "gap-y-1.5"
has no flex/grid context so gaps do nothing; update the div wrapping the label,
Select and FormDescription (the div with className "gap-y-1.5" in
credits-setup.tsx) to include a layout context such as "flex flex-col gap-y-1.5"
so vertical spacing between the label, Select (Select, SelectTrigger,
SelectContent, SelectItem) and FormDescription is applied.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/authorization/permissions/components/upsert-permission/index.tsx:
- Around line 203-212: The height utility is targeting inputs but FormTextarea
renders a <textarea>, so update the class on the FormTextarea (the className
that currently contains "[&_input:first-of-type]:h-9") to target the textarea
element instead (e.g. use a selector that matches textarea such as
"[&_textarea:first-of-type]:h-9" or an equivalent selector that correctly
selects the rendered <textarea>) so the height rule applies.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/[deploymentId]/network/unkey-flow/components/simulate/tree-generate.tsx:
- Around line 184-221: The onChange handlers for the two select elements are
using type assertions (e.target.value as "vertical" | "horizontal") which allows
invalid DOM strings into state; replace these assertions with an input-bound
parser/validator that checks e.target.value and only returns "horizontal" or
"vertical" (or a safe default) before calling setCustomConfig; implement a small
type-guard/parse function (e.g., parseDirection) and use it in the onChange for
the regionDirection and instanceDirection updates, leaving
generateMutation.disabled logic unchanged.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx:
- Around line 83-89: The form currently only disables the footer button but
doesn't enforce the confirmation on submit; update the submit handler (the
function passed as onSubmit to handleSubmit, i.e., onSubmit) to verify that the
registered field value (registered via register("name")) exactly equals
namespace.name before proceeding with deletion; if it does not match, abort the
deletion flow and surface an error via the form API (e.g., setError) or return
early so pressing Enter cannot bypass confirmation in the
"delete-namespace-form".

---

Nitpick comments:
In `@web/apps/dashboard/components/ui/sheet.tsx`:
- Around line 97-102: SheetFooter currently uses "flex flex-col-reverse
sm:flex-row sm:justify-end sm:gap-2" so the gap only applies at sm and above;
add a base gap (e.g. "gap-2") to apply spacing in the mobile flex-col-reverse
layout. Update the className string in the SheetFooter component (the JSX div
using cn) to include the base gap alongside the existing sm:gap-2 so mobile and
larger screens both get consistent spacing.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 29445580-112d-4c0b-b96d-062c95b43a21

📥 Commits

Reviewing files that changed from the base of the PR and between 7802460 and f1f288b.

📒 Files selected for processing (60)
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/credits-setup.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/expiration-setup.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_components/create-key/components/general-setup.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-key-name.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/components/assign-permission/create-permission-options.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/components/assign-permission/permissions-field.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/components/assign-role/create-key-options.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/components/assign-role/role-field.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/components/granted-access.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/actions/components/edit-rbac/index.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/last-used.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/skeletons.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/keys/[keyAuthId]/_components/components/table/components/status-cell/index.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/settings/components/delete-api.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/settings/components/delete-protection.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/_components/api-list-client.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/permissions/components/upsert-permission/index.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/roles/components/upsert-role/components/assign-key/create-key-options.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/roles/components/upsert-role/components/assign-key/key-field.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/roles/components/upsert-role/components/assign-permission/create-permission-options.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/roles/components/upsert-role/components/assign-permission/permissions-field.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/authorization/roles/components/upsert-role/index.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/identities/_components/dialogs/general-setup.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/identities/_components/table/last-used.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/[deploymentId]/network/unkey-flow/components/canvas/canvas-boundary.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/[deploymentId]/network/unkey-flow/components/simulate/tree-generate.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/promotion-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/rollback-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/actions/components/deployment-section.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/actions/components/domains-section.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/actions/promotion-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/actions/redeploy-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/actions/rollback-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/deployments/components/table/components/domain_list.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/details/project-details-expandables/project-details-content.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/logs/components/table/runtime-log-details/index.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/openapi-diff/components/client.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/openapi-diff/components/empty.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/openapi-diff/page.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/[projectId]/(overview)/settings/components/advanced-settings/custom-domains/custom-domain-row.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/_components/list/region-badges.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/projects/new/steps/deployment-live.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/_components/delete-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/ratelimits/[namespaceId]/overrides/last-used-cell.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/settings/billing/components/current-plan-card.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/settings/billing/components/plan-selection-modal.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/settings/team/invite-form.tsx
  • web/apps/dashboard/app/(app)/[workspaceSlug]/settings/team/invite.tsx
  • web/apps/dashboard/app/auth/sign-up/[[...sign-up]]/page.tsx
  • web/apps/dashboard/app/new/components/onboarding-fallback.tsx
  • web/apps/dashboard/app/new/hooks/use-workspace-step.tsx
  • web/apps/dashboard/components/auth/turnstile-challenge.tsx
  • web/apps/dashboard/components/dashboard/feedback-component.tsx
  • web/apps/dashboard/components/dashboard/metadata/metadata-setup.tsx
  • web/apps/dashboard/components/dashboard/ratelimits/ratelimit-setup.tsx
  • web/apps/dashboard/components/logs/filter-operator-input/index.tsx
  • web/apps/dashboard/components/selected-item-list.tsx
  • web/apps/dashboard/components/ui/sheet.tsx

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx (1)

71-76: LGTM - spacing changes are consistent with PR objective.

The PermissionsSection correctly adopts the same flex flex-col gap-* pattern. Header padding is consistent (px-3.5) between empty and populated states here.

Minor optional note: Content area padding differs between empty (px-4 at Line 76) and populated (px-3.5 at Line 106) states, mirroring the same pattern in RolesSection. This creates a subtle 2px horizontal shift, but is likely imperceptible in practice.

,

♻️ Optional: Align content padding for consistency

If desired, unify content padding across both empty and populated states:

-          <div className="border-gray-4 border-t rounded-[10px] bg-white dark:bg-black px-4 py-2">
+          <div className="border-gray-4 border-t rounded-[10px] bg-white dark:bg-black px-3.5 py-2">

Apply similarly at Lines 18 and 76 to match their populated counterparts.

Also applies to: 85-106

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx
around lines 71 - 76, The content area in the PermissionsSection uses px-4 for
the empty state container while populated state uses px-3.5, causing a minor 2px
horizontal shift; update the container padding to match the populated state by
changing the class on the empty-state content div (the div wrapping the
permissions content inside PermissionsSection in roles-permissions.tsx) from
px-4 to px-3.5 so both empty and populated states use the same horizontal
padding.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@web/apps/dashboard/app/`(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx:
- Around line 71-76: The content area in the PermissionsSection uses px-4 for
the empty state container while populated state uses px-3.5, causing a minor 2px
horizontal shift; update the container padding to match the populated state by
changing the class on the empty-state content div (the div wrapping the
permissions content inside PermissionsSection in roles-permissions.tsx) from
px-4 to px-3.5 so both empty and populated states use the same horizontal
padding.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 913f6b51-2135-4084-af37-e7028c7ebd2d

📥 Commits

Reviewing files that changed from the base of the PR and between 3e01f8c and 19a977e.

📒 Files selected for processing (1)
  • web/apps/dashboard/app/(app)/[workspaceSlug]/apis/[apiId]/_overview/components/table/components/log-details/components/roles-permissions.tsx

@MichaelUnkey MichaelUnkey enabled auto-merge March 9, 2026 15:58
Copy link
Collaborator

@mcstepp mcstepp left a comment

Choose a reason for hiding this comment

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

🚢

@MichaelUnkey MichaelUnkey added this pull request to the merge queue Mar 10, 2026
Merged via the queue into main with commit b78e316 Mar 10, 2026
16 checks passed
@MichaelUnkey MichaelUnkey deleted the eng-2550-vertical-spacing-off-in-modal-after-tailwind-migration branch March 10, 2026 16:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants