- {/* Animated gradient border */}
-
-
-
+ {/* Hover/focus glow ring */}
+
+
+
+
+
setSearch(e.target.value)}
- className="w-full bg-transparent px-4 py-5 text-lg text-black dark:text-white placeholder:text-zinc-400 dark:placeholder:text-zinc-600 outline-none font-light"
+ className="w-full bg-transparent px-4 py-3.5 text-base text-black dark:text-white placeholder:text-zinc-400 dark:placeholder:text-zinc-500 outline-none focus-visible:outline-none font-medium tracking-wide"
/>
{search && (
)}
-
- {filtered.length} of {contributors.length} contributors
+
+
+ {filtered.length}
+ /
+ {contributors.length}
+ contributors
+
diff --git a/app/contributors/page.empty-fallback.test.tsx b/app/contributors/page.empty-fallback.test.tsx
index d1c52453d..7a8574fe0 100644
--- a/app/contributors/page.empty-fallback.test.tsx
+++ b/app/contributors/page.empty-fallback.test.tsx
@@ -88,10 +88,10 @@ describe('ContributorsPage empty fallback', () => {
it('renders fallback UI when contributors are empty', async () => {
const element = await ContributorsPage();
- render(element);
+ const { container } = render(element);
expect(screen.getByText(/No architects found/i)).toBeTruthy();
- expect(screen.getByText(/0 of 0 contributors/i)).toBeTruthy();
+ expect(container.textContent?.replace(/\s+/g, '')).toContain('0/0contributors');
expect(screen.getByRole('heading', { name: /THE COLLECTIVE/i })).toBeTruthy();
expect(screen.getByText(/READY TO BUILD\?/i)).toBeTruthy();
});
@@ -109,10 +109,10 @@ describe('ContributorsPage empty fallback', () => {
it('handles fetch failures gracefully and still renders fallback state', async () => {
global.fetch = vi.fn(() => Promise.reject(new Error('Network failure'))) as any;
const element = await ContributorsPage();
- render(element);
+ const { container } = render(element);
expect(screen.getByText(/No architects found/i)).toBeTruthy();
- expect(screen.getByText(/0 of 0 contributors/i)).toBeTruthy();
+ expect(container.textContent?.replace(/\s+/g, '')).toContain('0/0contributors');
});
it('handles non-ok API responses without breaking the page', async () => {
@@ -126,10 +126,10 @@ describe('ContributorsPage empty fallback', () => {
) as any;
const element = await ContributorsPage();
- render(element);
+ const { container } = render(element);
expect(screen.getByText(/No architects found/i)).toBeTruthy();
- expect(screen.getByText(/0 of 0 contributors/i)).toBeTruthy();
+ expect(container.textContent?.replace(/\s+/g, '')).toContain('0/0contributors');
});
it('does not emit console errors when the fallback page renders', async () => {
diff --git a/app/globals.css b/app/globals.css
index 4e4cbb053..31486db0f 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -379,14 +379,16 @@ body {
}
/* ── Accessibility: visible focus ring ── */
-:focus-visible {
- outline: 2px solid #58a6ff;
- outline-offset: 2px;
- border-radius: 4px;
-}
+@layer base {
+ :focus-visible {
+ outline: 2px solid #58a6ff;
+ outline-offset: 2px;
+ border-radius: 4px;
+ }
-:focus:not(:focus-visible) {
- outline: none;
+ :focus:not(:focus-visible) {
+ outline: none;
+ }
}
/* ── Accessibility: reduced motion ── */