From 0f7facdfc2b543153d42e8300c207c53ee55385a Mon Sep 17 00:00:00 2001 From: stevep0z <255929980+stevep0z@users.noreply.github.com> Date: Tue, 6 Oct 2026 16:54:12 -0500 Subject: [PATCH 1/2] feat(home): add Role Manager card to Open Source Tools Adds a fourth card to the Open Source Tools section of the docs homepage, linking to the Role Manager docs at /role-manager (matching Relayer, Monitor and UI Builder, which all point at their docs rather than their app). The supplied SVG hardcoded a #0A0A0A stroke, which would have been invisible in dark mode. The icon component uses currentColor instead, following the convention of the other icons in src/components/icons. Co-Authored-By: Claude Opus 5 --- src/app/page.tsx | 8 +++++ src/components/icons/index.ts | 1 + src/components/icons/role-manager-icon.tsx | 42 ++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/components/icons/role-manager-icon.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 54fcd40b..79300ddd 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -22,6 +22,7 @@ import { MonitorIcon, PolkadotIcon, RelayersIcon, + RoleManagerIcon, StarknetIcon, StellarIcon, SuiIcon, @@ -170,6 +171,13 @@ export default function HomePage() { title="UI Builder" description="Spin up user interfaces for any deployed contract. Select the function, auto-generate a React UI with wallet-connect and multi-network support, and export a complete app." /> + + } + title="Role Manager" + description="Manage contract permissions from one interface to define role-based access, set multi-level hierarchies, and assign granular admin controls for any team or governance model." + /> diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index fb4f2b00..6c20c5eb 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -12,6 +12,7 @@ export { MidnightIcon } from "./midnight-icon"; export { MonitorIcon } from "./monitor-icon"; export { PolkadotIcon } from "./polkadot-icon"; export { RelayersIcon } from "./relayers-icon"; +export { RoleManagerIcon } from "./role-manager-icon"; export { StarknetIcon } from "./starknet-icon"; export { StellarIcon } from "./stellar-icon"; export { SuiIcon } from "./sui-icon"; diff --git a/src/components/icons/role-manager-icon.tsx b/src/components/icons/role-manager-icon.tsx new file mode 100644 index 00000000..ba9c25b3 --- /dev/null +++ b/src/components/icons/role-manager-icon.tsx @@ -0,0 +1,42 @@ +export function RoleManagerIcon({ className }: { className: string }) { + return ( + + Role Manager Icon + + + + + + ); +} From 98cf7dc2c6e064c358056adeeaabc12450a94813 Mon Sep 17 00:00:00 2001 From: stevep0z <255929980+stevep0z@users.noreply.github.com> Date: Tue, 6 Oct 2026 16:54:19 -0500 Subject: [PATCH 2/2] fix(nav): show the ecosystem toggle on /role-manager /role-manager appears in both the Stellar and Ethereum & EVM navigation trees, so getEcosystemFromPath() treats it as ambiguous and returns null. But unlike the other cross-ecosystem pages (/monitor, /relayer, /ui-builder, /ecosystem-adapters, /tools) it was missing from the shared-path lists, and from every tab's `urls` set. The result: isTabActive() matched no tab on /role-manager, RootToggle's findLast() returned undefined, and the toggle fell back to its empty placeholder - the switcher rendered blank instead of showing the current ecosystem. Adds /role-manager to the shared-path checks and to the Ethereum and Stellar url sets, mirroring how /ui-builder is handled. The toggle now shows Ethereum & EVM by default, and stays on Stellar when the reader arrived from the Stellar docs. Co-Authored-By: Claude Opus 5 --- src/components/layout/docs-layout-client.tsx | 3 +++ src/hooks/use-navigation-tree.ts | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/layout/docs-layout-client.tsx b/src/components/layout/docs-layout-client.tsx index a4721ce1..b6083827 100644 --- a/src/components/layout/docs-layout-client.tsx +++ b/src/components/layout/docs-layout-client.tsx @@ -54,6 +54,7 @@ export function DocsLayoutClient({ children }: DocsLayoutClientProps) { pathname.startsWith("/monitor") || pathname.startsWith("/relayer") || pathname.startsWith("/ui-builder") || + pathname.startsWith("/role-manager") || pathname.startsWith("/ecosystem-adapters") || pathname.startsWith("/tools"); @@ -65,6 +66,7 @@ export function DocsLayoutClient({ children }: DocsLayoutClientProps) { "/monitor", "/relayer", "/ui-builder", + "/role-manager", "/ecosystem-adapters", "/tools", ]) @@ -103,6 +105,7 @@ export function DocsLayoutClient({ children }: DocsLayoutClientProps) { "/relayer", "/monitor", "/ui-builder", + "/role-manager", "/upgrades", ]); if ( diff --git a/src/hooks/use-navigation-tree.ts b/src/hooks/use-navigation-tree.ts index f1de9ffc..4932dd59 100644 --- a/src/hooks/use-navigation-tree.ts +++ b/src/hooks/use-navigation-tree.ts @@ -57,7 +57,8 @@ export function useNavigationTree() { ) { sessionStorage.setItem("lastEcosystem", "ethereum"); } else { - // Shared paths (/ui-builder, /monitor, /relayer, /ecosystem-adapters, /tools) + // Shared paths (/ui-builder, /monitor, /relayer, /role-manager, + // /ecosystem-adapters, /tools) // have no ecosystem in their prefix. If the specific page is uniquely owned // by one ecosystem (e.g. /relayer/.../guides/stellar-channels-guide -> Stellar), // persist that so later navigation to ambiguous shared pages (quickstart, api/*) @@ -105,6 +106,7 @@ export function useNavigationTree() { pathname.startsWith("/monitor") || pathname.startsWith("/relayer") || pathname.startsWith("/ui-builder") || + pathname.startsWith("/role-manager") || pathname.startsWith("/ecosystem-adapters") || pathname.startsWith("/tools") ) {