Skip to content

fix(admin): Admin org design fixes#1799

Open
Shreyag02 wants to merge 6 commits into
mainfrom
admin-org-design-fixes
Open

fix(admin): Admin org design fixes#1799
Shreyag02 wants to merge 6 commits into
mainfrom
admin-org-design-fixes

Conversation

@Shreyag02

@Shreyag02 Shreyag02 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Design polish for the IAM Admin Console organization flow. This PR applies the outstanding design-review fixes to the org listing, detail tabs, and project members flow. Each design item is a self-contained commit for easy review.

No backend/Go changes — frontend only (web/sdk/admin/views/organizations/*).

Changes

  • Org listing navbar — hide the "New org" button while search is active; pin navbar height to 48px.
  • Member role titles — strip the "Organization" prefix so the Role field shows just Owner / Member / Admin.
  • Detail tabs zero state — show a zero state (with headers hidden) when a tab has no data by default; the empty state now only shows for no-match searches.
  • Row action menu — the three-dot kebab in detail listings is revealed on row hover (and while its menu is open) instead of always visible.
  • Project "Add member" — disabled when the org has a single member (no one to invite yet), and the row stays highlighted while its menu is open.
  • View Invoice link — removed the underline.

Technical Details

  • Role prefix stripping is centralized in a small formatRoleTitle() helper (web/sdk/admin/utils/helper.ts) and used by the members columns.
  • Zero state vs. empty state is driven by the Apsara DataTable.Content zeroState / emptyState props — zeroState renders when there's no data at all, emptyState only when a search returns nothing. Table headers auto-hide in both, so no extra handling was needed.
  • Hover reveal is pure CSS: the action column is opacity: 0 by default and goes to 1 on tr:hover, :focus-within, and :has([data-popup-open]) (keeps it visible while the menu is open and for keyboard users). The open row is highlighted via tr:has([data-test-id="…"][data-popup-open]).
  • canAddMember is derived from orgMembersMap (> 1 member) and threaded through the project actions menu and the project-members dialog to disable the trigger.
  • The drawer heading colour item needed no change — the drawer title already renders in Foreground/Base/Primary.

Test Plan

  • Manual testing completed
  • Build and type checking passes

Manual checks

  • Navbar: "New org" hidden during search, height is 48px.
  • Members: role shows Owner / Member / Admin with no prefix.
  • Empty tabs show the zero state (no headers); searching with no match shows the empty state.
  • Kebab appears only on hover / while open; row stays highlighted with menu open.
  • Single-member org: project "Add member" is disabled.
  • Invoices: "View Invoice" link has no underline.

SQL Safety (if your PR touches *_repository.go or goqu.*)

Not applicable — this PR is frontend-only and touches no *_repository.go / goqu.* code.


Items fixed

# Item Status What changed
1 Navbar: hide "New org" during search + fix height to 48px ✅ Fixed list/navbar.tsx, list/list.module.css
2 Side-panel heading aligned with cells ✅ Already correct No change
3 Listing avatar 4px radius (not circular) ✅ Already correct No change
4 Listing background = Background/Base/Primary ✅ Already correct No change
5 Drawer heading text = Foreground/Base/Primary ✅ No change needed Title already Primary; section labels use Apsara DS default (tertiary)
6 Role field: strip "Org" prefix ✅ Fixed formatRoleTitle() in utils/helper.ts + members/columns.tsx
7 Zero state for empty tabs + hide headers ✅ Fixed apis, invoices, members, projects, tokens index + module.css
8 Listing kebab visible only on hover ✅ Fixed members, projects, projects/members columns + module.css
9 Disable project "Add member" for single-member orgs + keep row selected ✅ Fixed projects/columns.tsx, projects/index.tsx, projects/members/*
10 "View Invoice" link without underline ✅ Fixed invoices/columns.tsx, invoices.module.css

@vercel

vercel Bot commented Jul 23, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
frontier Ready Ready Preview, Comment Jul 23, 2026 7:19pm

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added clear zero-state messages for APIs, invoices, members, projects, and tokens.
    • Improved project and member action menus with clearer controls, keyboard focus support, and hover feedback.
    • Disabled member additions when no eligible members are available.
    • Improved role name display by removing technical organization prefixes.
  • Bug Fixes

    • Prevented the organization creation button from conflicting with search.
    • Refined invoice links and dialog interactions for a cleaner experience.
  • Style

    • Updated empty-state spacing and table action visibility across organization views.

Walkthrough

Organization admin tables receive dedicated zero-state views and spacing. Project actions gain conditional member-add controls, improved action buttons, popup styling, and dialog focus handling. Role labels, invoice links, PAT dialogs, and organization navigation presentation are also updated.

Changes

Organization admin UI

Layer / File(s) Summary
Dedicated table zero states
web/sdk/admin/views/organizations/details/{apis,invoices,members,projects,tokens}/...
API credentials, invoices, members, projects, and tokens tables now render contextual EmptyState components for zero-result states with shared spacing styles.
Project action and dialog interactions
web/sdk/admin/views/organizations/details/projects/...
Member-add actions are disabled when fewer than two organization members exist; project action triggers use IconButton, popup states are styled, and the member dialog receives initial focus handling.
Role, invoice, dialog, and navigation display updates
web/sdk/admin/utils/helper.ts, web/sdk/admin/views/organizations/details/members/..., web/sdk/admin/views/organizations/details/invoices/..., web/sdk/admin/views/organizations/details/pat/..., web/sdk/admin/views/organizations/list/...
Role titles are formatted for display, invoice links lose underlines, PAT dialog close buttons are removed, and organization navigation sizing and conditional controls are updated.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested reviewers: rohilsurana

🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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.

@coveralls

Copy link
Copy Markdown

Coverage Report for CI Build 30037257485

Coverage remained the same at 46.739%

Details

  • Coverage remained the same as the base build.
  • Patch coverage: No coverable lines changed in this PR.
  • No coverage regressions found.

Uncovered Changes

No uncovered changes found.

Coverage Regressions

No coverage regressions found.


Coverage Stats

Coverage Status
Relevant Lines: 38970
Covered Lines: 18214
Line Coverage: 46.74%
Coverage Strength: 14.32 hits per line

💛 - Coveralls

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 4

🧹 Nitpick comments (8)
web/sdk/admin/views/organizations/details/apis/index.tsx (1)

39-52: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated ZeroState component across org detail views.

This ZeroState implementation is structurally identical to the ones added in invoices/index.tsx (and, per the referenced graph context, members/index.tsx, projects/index.tsx, tokens/index.tsx), differing only in icon/heading/subHeading. Wiring it into DataTable.Content via zeroState={<ZeroState />} (Line 208) is correct and consistent with the existing pattern.

Consider extracting a shared <TableZeroState icon heading subHeading /> component to avoid maintaining five near-identical copies.

Also applies to: 208-208

web/sdk/admin/views/organizations/details/apis/apis.module.css (1)

10-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated zero-state CSS across five module files.

.zero-state-container and .zero-state are copy-pasted identically into invoices.module.css, members.module.css, projects.module.css, and tokens.module.css. Extract these into a shared CSS module (e.g., shared/zero-state.module.css) to avoid drift.

web/sdk/admin/views/organizations/details/invoices/index.tsx (1)

73-86: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated ZeroState component (same pattern as other org detail views).

Same structural duplication as apis/index.tsx's ZeroState. Wiring at Line 197 is correct.

Also applies to: 197-197

web/sdk/admin/views/organizations/details/invoices/invoices.module.css (1)

10-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated zero-state CSS.

Same duplication as apis.module.css; see consolidated comment.

web/sdk/admin/views/organizations/details/members/members.module.css (2)

18-25: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated zero-state CSS.

Same as apis.module.css; see consolidated comment.


45-55: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated table-action-column reveal pattern.

This hover/focus-within/popup-open reveal block is duplicated near-verbatim in projects.module.css and projects/members/members.module.css. Otherwise the logic is correct — :focus-within preserves keyboard accessibility for the hidden actions.

web/sdk/admin/views/organizations/details/projects/projects.module.css (1)

18-25: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated zero-state CSS.

Same as apis.module.css; see consolidated comment.

web/sdk/admin/views/organizations/details/tokens/tokens.module.css (1)

10-17: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated zero-state CSS.

Same as apis.module.css; see consolidated comment.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 34c79bf7-d076-4b17-b018-24c0eeb45599

📥 Commits

Reviewing files that changed from the base of the PR and between a0618e0 and 2a49926.

📒 Files selected for processing (21)
  • web/sdk/admin/utils/helper.ts
  • web/sdk/admin/views/organizations/details/apis/apis.module.css
  • web/sdk/admin/views/organizations/details/apis/index.tsx
  • web/sdk/admin/views/organizations/details/invoices/columns.tsx
  • web/sdk/admin/views/organizations/details/invoices/index.tsx
  • web/sdk/admin/views/organizations/details/invoices/invoices.module.css
  • web/sdk/admin/views/organizations/details/members/columns.tsx
  • web/sdk/admin/views/organizations/details/members/index.tsx
  • web/sdk/admin/views/organizations/details/members/members.module.css
  • web/sdk/admin/views/organizations/details/pat/components/pat-details-dialog.tsx
  • web/sdk/admin/views/organizations/details/projects/columns.tsx
  • web/sdk/admin/views/organizations/details/projects/index.tsx
  • web/sdk/admin/views/organizations/details/projects/members/add-members-dropdown.tsx
  • web/sdk/admin/views/organizations/details/projects/members/columns.tsx
  • web/sdk/admin/views/organizations/details/projects/members/index.tsx
  • web/sdk/admin/views/organizations/details/projects/members/members.module.css
  • web/sdk/admin/views/organizations/details/projects/projects.module.css
  • web/sdk/admin/views/organizations/details/tokens/index.tsx
  • web/sdk/admin/views/organizations/details/tokens/tokens.module.css
  • web/sdk/admin/views/organizations/list/list.module.css
  • web/sdk/admin/views/organizations/list/navbar.tsx
💤 Files with no reviewable changes (1)
  • web/sdk/admin/views/organizations/details/pat/components/pat-details-dialog.tsx

import { DotsHorizontalIcon, UpdateIcon } from "@radix-ui/react-icons";
import { DeleteIcon } from "~/admin/assets/icons/DeleteIcon";
import { formatTimestamp, TimeStamp } from "~/admin/utils/connect-timestamp";
import { formatRoleTitle } from "~/admin/utils/helper";

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Normalize all member-facing role labels.

The table uses formatRoleTitle, but the filter options at Lines 99-101 and assignment actions at Lines 154-167 still render raw role.title. This leaves users seeing inconsistent values such as Owner in the table and Organization Owner elsewhere. Apply the helper to those display labels while preserving the raw title in API payloads.

Also applies to: 47-50

Comment on lines +193 to +199
<IconButton
size={3}
onClick={preventClickBubbling}
data-test-id="admin-project-actions"
/>
>
<DotsHorizontalIcon />
</IconButton>

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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Files:"
git ls-files | rg 'web/sdk/admin/views/organizations/details/projects/(columns|members/columns)\.tsx$|IconButton|DotsHorizontalIcon' || true

echo
echo "Target snippets:"
for f in \
  web/sdk/admin/views/organizations/details/projects/columns.tsx \
  web/sdk/admin/views/organizations/details/projects/members/columns.tsx
do
  if [ -f "$f" ]; then
    echo "--- $f"
    sed -n '160,215p' "$f"
    echo "--- $f members"
    sed -n '80,125p' "$f"
  fi
done

echo
echo "IconButton definitions/usages nearby:"
rg -n "function IconButton|const IconButton|IconButton|DotsHorizontalIcon|aria-label|title=" web/sdk/admin | head -200 || true

Repository: raystack/frontier

Length of output: 16491


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Read-only behavioral/structural probe for icon-only button accessibility indicators.
python3 - <<'PY'
import re, pathlib

xs = {
 "web/sdk/admin/views/organizations/details/projects/columns.tsx": (188, 204),
 "web/sdk/admin/views/organizations/details/projects/members/columns.tsx": (97, 113),
}
for path, (start, end) in xs.items():
    text = pathlib.Path(path).read_text()
    lines = text.splitlines()
    block = "\n".join(lines[start-1:end])
    print(f"--- {path}: lines {start}-{end}")
    print(block)
    print("contains aria-label/aria-labelledby:", bool(re.search(r"aria-(label|labelled-by)\s*=", block)))
    print("contains title:", bool(re.search(r"\btitle\s*=", block)))
    print("contains IconButton:", "IconButton" in block)
    print("contains icon trigger:", bool(re.search(r"<(DotsHorizontalIcon)|<.*Icon", block, re.S)))
PY

Repository: raystack/frontier

Length of output: 1552


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "IconButton packages/usages:"
rg -n 'from "`@raystack/apsara`"|from .*apsara.*|IconButton' package.json web/sdk/admin/package.json pnpm-lock.yaml package-lock.json yarn.lock 2>/dev/null || true
echo
rg -n 'export .*IconButton|const IconButton|function IconButton|IconButton =|IconButton(' . --glob '!node_modules' --glob '!dist' --glob '!build' | head -300

echo
echo "Imports in target files:"
sed -n '1,30p' web/sdk/admin/views/organizations/details/projects/columns.tsx
sed -n '1,30p' web/sdk/admin/views/organizations/details/projects/members/columns.tsx

Repository: raystack/frontier

Length of output: 397


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Imports in target files:"
sed -n '1,30p' web/sdk/admin/views/organizations/details/projects/columns.tsx
sed -n '1,30p' web/sdk/admin/views/organizations/details/projects/members/columns.tsx

echo
echo "IconButton usages in target package paths:"
rg -n 'from "`@raystack/apsara`"|IconButton|title=/aria-label=|data-test-id="admin-project-(actions|member-action-menu)"' web/sdk/admin/views/organizations/details/projects/columns.tsx web/sdk/admin/views/organizations/details/projects/members/columns.tsx

echo
echo "Local IconButton-like component definitions excluding generated/package dirs:"
rg -n 'const IconButton|function IconButton|export .*IconButton|IconButton\s*=' web/sdk . --glob '!node_modules' --glob '!dist' --glob '!build' --glob '!*.lock' | head -200

Repository: raystack/frontier

Length of output: 3299


🌐 Web query:

@raystack/apsara IconButton aria-label accessible name icon button documentation

💡 Result:

In the @raystack/apsara component library, the IconButton component is designed specifically for icon-only buttons [1][2]. Because these buttons lack visible text, providing an accessible name is mandatory to ensure assistive technologies can convey the button's purpose to users [3][1]. You must use the aria-label attribute to provide this accessible name [4][1]. Example usage: import { IconButton } from '@raystack/apsara'; import { TrashIcon } from '@radix-ui/react-icons'; function Actions { return ( ); } The documentation for IconButton highlights that this attribute is required for accessibility [1][2]. Additionally, the library advises considering the use of tooltips to complement the aria-label for improved usability [3]. As the IconButton component extends standard HTML button attributes, it also supports other standard ARIA attributes for managing state and behavior [3][1].

Citations:


Add accessible names to both icon-only action triggers.

Both triggers render only DotsHorizontalIcon, so IconButton has no accessible name.

  • web/sdk/admin/views/organizations/details/projects/columns.tsx: add aria-label="Project actions".
  • web/sdk/admin/views/organizations/details/projects/members/columns.tsx: add aria-label="Member actions".
📍 Affects 2 files
  • web/sdk/admin/views/organizations/details/projects/columns.tsx#L193-L199 (this comment)
  • web/sdk/admin/views/organizations/details/projects/members/columns.tsx#L102-L110

Comment on lines +206 to 216
<Dialog.Content
className={styles["dialog-content"]}
initialFocus={() => initialFocusRef.current}
>
<Dialog.Header>
{isProjectLoading ? (
<Skeleton containerClassName={styles["flex1"]} width={"200px"} />
) : (
<Dialog.Title>{project?.title ?? ""}</Dialog.Title>
)}
<Dialog.CloseButton data-test-id="close-button" />
</Dialog.Header>

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate and inspect the reviewed file around the dialog construction and close-control references.
file="web/sdk/admin/views/organizations/details/projects/members/index.tsx"
if [ -f "$file" ]; then
  echo "== file exists =="
  wc -l "$file"
  echo
  echo "== reviewed section =="
  sed -n '160,250p' "$file" | nl -ba -v160
  echo
  echo "== dialog close button references in file =="
  rg -n "Dialog\.CloseButton|CloseButton|initialFocus|Dismiss|onClick"| "$file" || true
else
  echo "file not found: $file"
  echo "candidate files:"
  fd -i '.*members.*index\.tsx$|.*members.*ts$' web 2>/dev/null | head -50
fi

echo
echo "== project member dialogs usages =="
rg -n "ProjectMember|members" web/sdk/admin/views/organizations/details/projects -g '*.tsx' -g '*.ts' | head -120

Repository: raystack/frontier

Length of output: 311


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="web/sdk/admin/views/organizations/details/projects/members/index.tsx"

echo "== reviewed section =="
sed -n '160,250p' "$file"

echo
echo "== dialog close button references in file =="
rg -n "Dialog\.CloseButton|CloseButton|initialFocus|Dismiss|onClick"| "$file" || true

echo
echo "== project member dialogs usages =="
rg -n "ProjectMember|members" web/sdk/admin/views/organizations/details/projects -g '*.tsx' -g '*.ts' | head -120

echo
echo "== Dialog implementation references =="
rg -n "CloseButton|class .*Dialog|function .*Dialog|const .*Dialog" web/sdk/admin web/sdk/shared -g '*.tsx' -g '*.ts' | head -200

Repository: raystack/frontier

Length of output: 3205


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== dialog close button references in reviewed file =="
rg -n "Dialog\.CloseButton|CloseButton|initialFocus|Dismiss|onClick" web/sdk/admin/views/organizations/details/projects/members/index.tsx || true

echo
echo "== other dialog usages with close buttons =="
rg -n "Dialog\.CloseButton|<Dialog\.CloseButton|CloseButton" web/sdk/admin/views web/sdk/shared -g '*.tsx' -g '*.ts' | head -200

echo
echo "== Dialog component definition candidates =="
rg -n "function Dialog|const Dialog|export .*Dialog|Dialog = " web/sdk -g '*.tsx' -g '*.ts' | head -200

Repository: raystack/frontier

Length of output: 10265


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate Dialog component and header button props =="
rg -n "interface .*Dialog|type .*Dialog|export namespace Dialog|ShowCloseButton|CloseButton|Header|HeaderClose" web/sdk -g '*.tsx' -g '*.ts' | head -250

echo
echo "== Dialog import path in reviewed file =="
sed -n '1,80p' web/sdk/admin/views/organizations/details/projects/members/index.tsx

echo
echo "== nearby dialogs with close buttons in admin =="
sed -n '1,80p' web/sdk/admin/views/users/details/security/security-sessions-revoke-session-confirm.tsx
sed -n '90,170p' web/sdk/admin/views/roles/index.tsx | sed -n '/<Drawer.Content/,/<\/Drawer>/p'

Repository: raystack/frontier

Length of output: 28533


🌐 Web query:

raystack apsara Dialog CloseButton Dialog.Content showCloseButton API

💡 Result:

In the Raystack Apsara UI library, the handling of the dialog close button has evolved. Recent updates (specifically around the rc.8 release) deprecated or removed the showCloseButton prop [1]. Instead of using a prop on Dialog.Content to toggle visibility, the library now favors an explicit composition pattern using the Dialog.CloseButton component [2][3]. To include a close button in your dialog, you should explicitly place the Dialog.CloseButton component within your Dialog.Header [3]. Example usage: tsx import { Dialog } from '`@raystack/apsara`' <Dialog> <Dialog.Trigger /> <Dialog.Content> <Dialog.Header> <Dialog.Title>Title</Dialog.Title> <Dialog.CloseButton /> </Dialog.Header> <Dialog.Body> <Dialog.Description /> </Dialog.Body> <Dialog.Footer /> </Dialog.Content> </Dialog> The Dialog.CloseButton is a styled component that renders an X icon and is automatically positioned in the top-right corner of the dialog [2][4][3]. You should avoid looking for a showCloseButton API on Dialog.Content, as that approach has been superseded by this component-based architecture [1].

Citations:


Restore a close control for the project-member dialog.

Dialog.CloseButton is the intended Apsara composition, and no other close action is present. Add it to the header, or replace the removed button with another labeled close trigger so users are not limited to keyboard/overlay dismissal.

Proposed fix
           <Dialog.Header>
             {isProjectLoading ? (
               <Skeleton containerClassName={styles["flex1"]} width={"200px"} />
             ) : (
               <Dialog.Title>{project?.title ?? ""}</Dialog.Title>
             )}
+            <Dialog.CloseButton />
           </Dialog.Header>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Dialog.Content
className={styles["dialog-content"]}
initialFocus={() => initialFocusRef.current}
>
<Dialog.Header>
{isProjectLoading ? (
<Skeleton containerClassName={styles["flex1"]} width={"200px"} />
) : (
<Dialog.Title>{project?.title ?? ""}</Dialog.Title>
)}
<Dialog.CloseButton data-test-id="close-button" />
</Dialog.Header>
<Dialog.Content
className={styles["dialog-content"]}
initialFocus={() => initialFocusRef.current}
>
<Dialog.Header>
{isProjectLoading ? (
<Skeleton containerClassName={styles["flex1"]} width={"200px"} />
) : (
<Dialog.Title>{project?.title ?? ""}</Dialog.Title>
)}
<Dialog.CloseButton />
</Dialog.Header>

Comment on lines +47 to +50
.table-content-wrapper:focus,
.table-content-wrapper:focus-visible {
outline: none;
}

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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Focus outline removed without a replacement indicator.

.table-content-wrapper:focus/:focus-visible sets outline: none with no alternative visible focus style (e.g. box-shadow/outline on a different color). If this wrapper is keyboard-focusable (e.g., for scrolling), this removes the only visual indication of focus for keyboard users.

♿ Proposed fix to restore a visible focus indicator
 .table-content-wrapper:focus,
 .table-content-wrapper:focus-visible {
-    outline: none;
+    outline: 2px solid var(--rs-color-border-focus, currentColor);
+    outline-offset: -2px;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.table-content-wrapper:focus,
.table-content-wrapper:focus-visible {
outline: none;
}
.table-content-wrapper:focus,
.table-content-wrapper:focus-visible {
outline: 2px solid var(--rs-color-border-focus, currentColor);
outline-offset: -2px;
}

@Shreyag02 Shreyag02 mentioned this pull request Jul 23, 2026
6 tasks
@Shreyag02
Shreyag02 requested a review from rohanchkrabrty July 23, 2026 19:29
@Shreyag02 Shreyag02 changed the title Admin org design fixes fix(admin): Admin org design fixes Jul 23, 2026
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.

2 participants