summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-10-17 01:15:23 -0400
committerFrank <[email protected]>2025-10-17 01:15:25 -0400
commitc25b9bf65ab95fc948734ab85d2aacc3a372316b (patch)
tree616a57e3d67919e4b3435660e7cab39b0ecbc444 /packages
parentddb2e6957c7e19d1ef7eb3c2da6da2c7d08eaf64 (diff)
downloadopencode-c25b9bf65ab95fc948734ab85d2aacc3a372316b.tar.gz
opencode-c25b9bf65ab95fc948734ab85d2aacc3a372316b.zip
wip: zen
Diffstat (limited to 'packages')
-rw-r--r--packages/console/app/src/routes/workspace/[id].css141
-rw-r--r--packages/console/app/src/routes/workspace/[id].tsx59
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>