diff options
| author | Frank <[email protected]> | 2025-10-17 01:15:23 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-10-17 01:15:25 -0400 |
| commit | c25b9bf65ab95fc948734ab85d2aacc3a372316b (patch) | |
| tree | 616a57e3d67919e4b3435660e7cab39b0ecbc444 | |
| parent | ddb2e6957c7e19d1ef7eb3c2da6da2c7d08eaf64 (diff) | |
| download | opencode-c25b9bf65ab95fc948734ab85d2aacc3a372316b.tar.gz opencode-c25b9bf65ab95fc948734ab85d2aacc3a372316b.zip | |
wip: zen
| -rw-r--r-- | packages/console/app/src/routes/workspace/[id].css | 141 | ||||
| -rw-r--r-- | packages/console/app/src/routes/workspace/[id].tsx | 59 |
2 files changed, 154 insertions, 46 deletions
diff --git a/packages/console/app/src/routes/workspace/[id].css b/packages/console/app/src/routes/workspace/[id].css index e2aa0774c..a83e852b5 100644 --- a/packages/console/app/src/routes/workspace/[id].css +++ b/packages/console/app/src/routes/workspace/[id].css @@ -16,38 +16,110 @@ justify-content: flex-end; } -[data-component="workspace-nav-items"] { - display: flex; - flex-direction: column; - gap: var(--space-2); - - [data-nav-button] { - padding: var(--space-3) var(--space-4); - border-radius: var(--border-radius-sm); - color: var(--color-text-muted); - text-decoration: none; - font-size: var(--font-size-sm); - font-weight: 500; - transition: all 0.15s ease; - - &:hover { - color: var(--color-text); +/* Desktop Navigation */ +[data-component="nav-desktop"] { + display: block; + + @media (max-width: 48rem) { + display: none; + } + + [data-component="workspace-nav-items"] { + display: flex; + flex-direction: column; + gap: var(--space-2); + + [data-nav-button] { + padding: var(--space-3) var(--space-4); + border-radius: var(--border-radius-sm); + color: var(--color-text-muted); + text-decoration: none; + font-size: var(--font-size-sm); + font-weight: 500; + transition: all 0.15s ease; + + &:hover { + color: var(--color-text); + } + + &.active { + color: var(--color-text); + font-weight: 700; + position: relative; + + &::before { + content: ""; + position: absolute; + left: calc(-1 * var(--space-0-5)); + top: 0; + bottom: 0; + width: 2px; + background-color: var(--color-text); + border-radius: 0 2px 2px 0; + } + } + } + } +} + +/* Mobile Navigation */ +[data-component="nav-mobile"] { + display: none; + + @media (max-width: 48rem) { + display: flex; + align-items: stretch; + justify-content: flex-start; + width: 100%; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + display: none; } + } - &.active { - color: var(--color-text); - font-weight: 700; + [data-component="workspace-nav-items"] { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--space-1); + min-width: max-content; + height: 100%; + + [data-nav-button] { + padding: var(--space-2) var(--space-3); + padding-bottom: calc(var(--space-2) + 4px); + border-radius: var(--border-radius-sm); + color: var(--color-text-muted); + text-decoration: none; + font-size: var(--font-size-sm); + font-weight: 500; + transition: all 0.15s ease; + white-space: nowrap; + flex-shrink: 0; position: relative; - &::before { - content: ''; - position: absolute; - left: calc(-1 * var(--space-0-5)); - top: 0; - bottom: 0; - width: 2px; - background-color: var(--color-text); - border-radius: 0 2px 2px 0; + &:hover { + color: var(--color-text); + } + + &.active { + color: var(--color-text); + font-weight: 700; + + &::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 2px; + background-color: var(--color-text); + border-radius: 2px 2px 0 0; + } } } } @@ -221,5 +293,16 @@ border-right: none; border-bottom: 1px solid var(--color-border); padding: var(--space-4); + justify-content: flex-start; + overflow-x: auto; + overflow-y: hidden; + flex-shrink: 0; + min-height: fit-content; + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + display: none; + } } -}
\ No newline at end of file +} diff --git a/packages/console/app/src/routes/workspace/[id].tsx b/packages/console/app/src/routes/workspace/[id].tsx index 8347cd49c..327013aa4 100644 --- a/packages/console/app/src/routes/workspace/[id].tsx +++ b/packages/console/app/src/routes/workspace/[id].tsx @@ -6,29 +6,54 @@ import "./[id].css" export default function WorkspaceLayout(props: RouteSectionProps) { const params = useParams() const userInfo = createAsync(() => querySessionInfo(params.id)) + return ( <main data-page="workspace"> <div data-component="workspace-container"> <nav data-component="workspace-nav"> - <div data-component="workspace-nav-items"> - <A href={`/workspace/${params.id}`} end activeClass="active" data-nav-button> - Zen - </A> - <A href={`/workspace/${params.id}/keys`} activeClass="active" data-nav-button> - API Keys - </A> - <A href={`/workspace/${params.id}/members`} activeClass="active" data-nav-button> - Members - </A> - <Show when={userInfo()?.isAdmin}> - <A href={`/workspace/${params.id}/billing`} activeClass="active" data-nav-button> - Billing + <nav data-component="nav-desktop"> + <div data-component="workspace-nav-items"> + <A href={`/workspace/${params.id}`} end activeClass="active" data-nav-button> + Zen + </A> + <A href={`/workspace/${params.id}/keys`} activeClass="active" data-nav-button> + API Keys + </A> + <A href={`/workspace/${params.id}/members`} activeClass="active" data-nav-button> + Members + </A> + <Show when={userInfo()?.isAdmin}> + <A href={`/workspace/${params.id}/billing`} activeClass="active" data-nav-button> + Billing + </A> + <A href={`/workspace/${params.id}/settings`} activeClass="active" data-nav-button> + Settings + </A> + </Show> + </div> + </nav> + + <nav data-component="nav-mobile"> + <div data-component="workspace-nav-items"> + <A href={`/workspace/${params.id}`} end activeClass="active" data-nav-button> + Zen + </A> + <A href={`/workspace/${params.id}/keys`} activeClass="active" data-nav-button> + API Keys </A> - <A href={`/workspace/${params.id}/settings`} activeClass="active" data-nav-button> - Settings + <A href={`/workspace/${params.id}/members`} activeClass="active" data-nav-button> + Members </A> - </Show> - </div> + <Show when={userInfo()?.isAdmin}> + <A href={`/workspace/${params.id}/billing`} activeClass="active" data-nav-button> + Billing + </A> + <A href={`/workspace/${params.id}/settings`} activeClass="active" data-nav-button> + Settings + </A> + </Show> + </div> + </nav> </nav> <div data-component="workspace-content">{props.children}</div> </div> |
