From 363d3b0bb2ff8fbe40e899b0441c27289b076a27 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 18:24:30 +0530 Subject: [PATCH 01/19] docs: add fluid layout + sidebar Tailwind removal design spec Co-Authored-By: Claude Sonnet 4.6 --- ...05-fluid-layout-tailwind-removal-design.md | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 docs/superpowers/specs/2026-06-05-fluid-layout-tailwind-removal-design.md diff --git a/docs/superpowers/specs/2026-06-05-fluid-layout-tailwind-removal-design.md b/docs/superpowers/specs/2026-06-05-fluid-layout-tailwind-removal-design.md new file mode 100644 index 0000000..3f184dd --- /dev/null +++ b/docs/superpowers/specs/2026-06-05-fluid-layout-tailwind-removal-design.md @@ -0,0 +1,147 @@ +# Fluid Layout Fix + Sidebar Tailwind Removal + +**Date:** 2026-06-05 +**Branch:** `enh/design-revamp` +**Source:** REST-Lab Direction A – Handoff (claude.ai/design) + +--- + +## Problem + +Fixed-pixel spacing in `src/webview/request/styles.css` clips the UI when VS Code's editor font is large (e.g. `"editor.fontSize": 20`). Specifically: + +- The 5 request tabs overflow off-screen and get clipped +- The URL bar squashes the Send/Save buttons off to the right +- The method-select, buttons, and env-select have hard-coded `px` heights that don't scale + +The root cause: every control height, padding, and gap is set in `px`. VS Code's `--vscode-font-size` is already wired to `body { font-size }`, but the child elements ignore it and stay fixed. + +The sidebar (Tailwind-based) has the same class of problem — Tailwind utilities like `py-2.5 px-3` are in `px`, so tree rows and badges don't scale either. Additionally, the sidebar uses Tailwind (v4 with `@import "tailwindcss"`) which the project is gradually moving away from. + +--- + +## Solution: Direction A – Fluid Classic + +Replace fixed `px` sizing with `em`-based tokens everywhere that touches text. Because `body { font-size: var(--vscode-font-size, 13px) }` is already set, `em` values automatically scale with the user's VS Code font setting. `flex-wrap` on the request bar and `overflow-x: auto` on the tab strip absorb whatever doesn't fit instead of clipping. + +--- + +## Design Decisions + +### Em token scale + +One spacing ramp defined in `:root`, referenced everywhere: + +| Token | Value | ~px @13 | ~px @19 | Use | +|---|---|---|---|---| +| `--rl-sp1` | `0.30em` | 4 | 6 | hairline gaps | +| `--rl-sp2` | `0.46em` | 6 | 9 | tight / icon↔label | +| `--rl-sp3` | `0.62em` | 8 | 12 | base gap / row padding | +| `--rl-sp4` | `0.92em` | 12 | 17 | control padding | +| `--rl-sp5` | `1.23em` | 16 | 23 | section / side padding | +| `--rl-ctrl` | `2.35em` | ~31 | ~45 | height of every input & button | +| `--rl-icon` | `1.25em` | ~16 | ~24 | icon glyph size | + +Rule: **never set a px value that contains text or sits next to text.** Borders stay `1px`. + +### Request bar wrapping + +`.request-bar` gets `flex-wrap: wrap`. When the URL field can't hold `16em`, it drops to its own row rather than squashing the Send button off screen. + +### Scrollable tab strip + +`.tabs` becomes `overflow-x: auto; scrollbar-width: none`. Tabs keep `flex-shrink: 0` so they stay full-width rather than squishing. A JS hook in `RequestEditor.tsx` adds a `.tabstrip-wrap` parent and toggles `scroll-start / scroll-mid / scroll-end` state classes that the CSS uses for fade-edge indicators. + +### Sidebar: Tailwind removal + +The sidebar bundle (`dist/sidebar/`) currently imports `tailwind.css`. We replace that with a new `sidebar.css` that: + +1. Carries all the brand/VS Code tokens (same as `tailwind.css :root`) +2. Defines `--rl-*` fluid tokens on `body` (matching font-size anchor) +3. Replaces every Tailwind utility class used in the sidebar components with semantic CSS class names +4. Migrates the component classes from `tailwind.css @layer components` (`btn-primary`, `action-btn`, `header-action-btn`, `dropdown-*`, `method-badge`, `method-*`, `custom-tooltip`, animations) — updated to use `em` sizing + +`tailwind.css` is untouched; it continues to serve the editor and folder-settings bundles. + +`drag-drop.css` is untouched. + +--- + +## Files + +### New +- `src/webview/sidebar/sidebar.css` — complete custom CSS for the sidebar; owns all layout, component, and fluid-sizing rules + +### Modified +- `src/webview/request/styles.css` — add `--rl-*` tokens to `:root`; replace px in `.request-bar`, `.method-select`, `.url-input`, `.send-btn`, `.save-btn`, `.request-more-btn`, `.layout-toggle-btn`, `.request-env-select`, `.tabs`, `.tab`, `.badge`, response section (padding, meta pills, toolbar), key-value rows (`.header-key`, `.header-value`, `.form-data-key`, `.form-data-value`, `.content-type-select`, `.remove-btn`, `.type-toggle`); delete the `@media (max-width:700px)` and `@media (max-width:500px)` font-shrink overrides (the wrap behavior replaces them — keep the vertical→horizontal split reflow rule only) +- `src/webview/request/RequestEditor.tsx` — add `useRef` + `useState` for scroll edge; wrap `
` in `
` with `ref={stripRef} onScroll={onScroll}`; add `useEffect(onScroll, [config.method])` +- `src/webview/sidebar/index.tsx` — replace `import "../tailwind.css"` with `import "./sidebar.css"` +- `src/webview/sidebar/Sidebar.tsx` — replace Tailwind utility classnames with new semantic class names from `sidebar.css` +- `src/webview/sidebar/FolderActionsDropdown.tsx` — remove residual Tailwind utility strings (`relative inline-flex`, `min-w-[180px]`, `text-red-500`) +- `src/webview/sidebar/ImportDropdown.tsx` — remove `relative` +- `src/webview/sidebar/RequestActionsDropdown.tsx` — remove `relative inline-flex`, `w-5 h-5`, hover utilities + +### Untouched +- `src/webview/tailwind.css` +- `src/webview/sidebar/drag-drop.css` + +--- + +## Sidebar CSS class map + +New semantic class names replacing Tailwind utility strings: + +| Old (Tailwind) | New (semantic) | +|---|---| +| `flex flex-col h-screen` | `.sb` | +| `p-4 border-b border-glass bg-gradient-to-b ...` | `.sb-head` | +| `flex items-center gap-2 text-[13px] font-bold ...` | `.sb-title` | +| `flex items-center gap-2` (button row) | `.sb-head-actions` | +| `flex-1 overflow-y-auto py-3 px-2 scrollbar-thin` | `.sb-tree` | +| `group flex items-center gap-2.5 py-2.5 px-3 mb-1 ...` | `.tree-row` | +| `tree-row` open state | `.tree-row.open` | +| `relative before:content-[''] before:absolute ...` (children wrap) | `.tree-children` | +| `pl-5 ...` (request zone) | `.req-zone` | +| `group flex items-center gap-2 py-2 px-2.5 ...` (request row) | `.req-row` | +| `req-row` active state | `.req-row.active` | +| `flex flex-col items-center justify-center py-12` | `.empty-state` | +| `relative inline-flex` (dropdown wrapper) | `.dropdown-wrap` | +| `relative` (import wrapper) | `.dropdown-wrap` | +| `text-red-500` on delete item | `.dropdown-item.danger` | +| `w-5 h-5` on action-btn | handled by `.action-btn` sizing directly | + +`.mb-0.5` wrapper divs around folder items → `.folder-item` + +--- + +## JS hook (RequestEditor.tsx) + +```tsx +const stripRef = useRef(null); +const [edge, setEdge] = useState(""); + +const onScroll = () => { + const el = stripRef.current; if (!el) return; + const max = el.scrollWidth - el.clientWidth; + if (max < 2) return setEdge(""); + if (el.scrollLeft < 4) setEdge("scroll-start"); + else if (el.scrollLeft > max - 4) setEdge("scroll-end"); + else setEdge("scroll-mid"); +}; +useEffect(onScroll, [config.method]); +``` + +Markup change: wrap `
` with `
`. + +--- + +## Porting checklist (verification) + +- [ ] Type-check passes: `npx tsc --noEmit` +- [ ] Sidebar renders with no Tailwind classes in DOM (inspect element) +- [ ] Drag-and-drop still works (drag a request between folders) +- [ ] Dropdown menus open and close correctly +- [ ] Request editor at `editor.fontSize: 13` — no visual regression +- [ ] Request editor at `editor.fontSize: 20` — tabs scroll, bar wraps, nothing clips +- [ ] Sidebar rows and method badges scale visually at large font +- [ ] Light theme still renders (VS Code light theme — test both sidebars and request editor) From c8e70912ad47bb5ba669336826ff3d246936a980 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 18:41:58 +0530 Subject: [PATCH 02/19] feat: add --rl-* fluid tokens and update request bar controls Replace hard-coded px values in the request bar with em-based CSS custom properties so all controls scale proportionally when the user changes editor.fontSize in VS Code. Co-Authored-By: Claude Sonnet 4.6 --- src/webview/request/styles.css | 87 +++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/src/webview/request/styles.css b/src/webview/request/styles.css index c881a3c..9479aa8 100644 --- a/src/webview/request/styles.css +++ b/src/webview/request/styles.css @@ -52,6 +52,18 @@ /* Glass effect */ --glass-bg: rgba(255, 255, 255, 0.03); --glass-border: rgba(255, 255, 255, 0.08); + + /* Fluid spacing tokens — all em, scale with --vscode-font-size */ + --rl-sp1: 0.30em; + --rl-sp2: 0.46em; + --rl-sp3: 0.62em; + --rl-sp4: 0.92em; + --rl-sp5: 1.23em; + --rl-ctrl: 2.35em; + --rl-icon: 1.25em; + --rl-r1: 0.35em; + --rl-r2: 0.50em; + --rl-r3: 0.65em; } * { @@ -75,7 +87,7 @@ body { height: 100vh; /* max-width: 1200px; */ margin: 0 auto; - padding: 0 24px; + padding: 0 var(--rl-sp5); position: relative; overflow: hidden; } @@ -169,25 +181,28 @@ body { /* Request Bar */ .request-bar { display: flex; - gap: 6px; - padding: 4px 0; + gap: var(--rl-sp3); + padding: var(--rl-sp4) 0 var(--rl-sp3); align-items: center; + flex-wrap: wrap; } +.request-bar > * { min-height: var(--rl-ctrl); } .method-select { - padding: 5px 10px; + height: var(--rl-ctrl); + padding: 0 0.7em; border: 2px solid var(--glass-border); - border-radius: 7px; + border-radius: var(--rl-r3); background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); font-family: inherit; - font-size: 12px; + font-size: 0.92em; font-weight: 700; cursor: pointer; - min-width: 96px; + min-width: 6.2em; transition: all 0.2s ease; text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.05em; } .method-select:focus { @@ -236,18 +251,17 @@ body { } .url-input { - flex: 1; + flex: 1 1 16em; min-width: 0; - padding: 6px 12px; + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: 1px solid var(--glass-border); - border-radius: 7px; + border-radius: var(--rl-r3); background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); font-family: "SF Mono", "Fira Code", "Consolas", monospace; - font-size: 13px; + font-size: 0.92em; transition: all 0.2s ease; - word-break: break-all; - overflow-wrap: anywhere; } .url-input:focus { @@ -261,13 +275,14 @@ body { .send-btn { display: flex; align-items: center; - gap: 6px; - padding: 7px 10px; + gap: var(--rl-sp2); + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: none; - border-radius: 7px; + border-radius: var(--rl-r3); background: var(--restlab-gradient); color: #ffffff; - font-size: 13px; + font-size: 0.92em; font-weight: 600; cursor: pointer; transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); @@ -275,6 +290,7 @@ body { position: relative; overflow: hidden; } +.send-btn svg { width: var(--rl-icon); height: var(--rl-icon); } .send-btn::before { content: ""; @@ -315,18 +331,20 @@ body { .save-btn { display: flex; align-items: center; - gap: 6px; - padding: 6px 8px; + gap: var(--rl-sp2); + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: 1px solid var(--glass-border); - border-radius: 7px; + border-radius: var(--rl-r3); background: var(--glass-bg); color: var(--vscode-foreground); - font-size: 13px; + font-size: 0.92em; font-weight: 600; cursor: pointer; transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); backdrop-filter: blur(8px); } +.save-btn svg { width: var(--rl-icon); height: var(--rl-icon); } .save-btn:hover:not(:disabled) { background: rgba(255, 255, 255, 0.06); @@ -377,11 +395,11 @@ body { display: flex; align-items: center; justify-content: center; - width: 30px; - height: 30px; + width: var(--rl-ctrl); + height: var(--rl-ctrl); padding: 0; border: 1px solid var(--glass-border); - border-radius: 7px; + border-radius: var(--rl-r3); background: var(--glass-bg); color: var(--vscode-foreground); cursor: pointer; @@ -478,11 +496,11 @@ body { display: flex; align-items: center; justify-content: center; - width: 30px; - height: 30px; + width: var(--rl-ctrl); + height: var(--rl-ctrl); padding: 0; border: 1px solid var(--glass-border); - border-radius: 7px; + border-radius: var(--rl-r3); background: var(--glass-bg); color: var(--vscode-foreground); cursor: pointer; @@ -506,9 +524,9 @@ body { } .base-url-hint { - font-size: 12px; + font-size: 0.92em; color: var(--vscode-descriptionForeground); - padding-bottom: 6px; + padding-bottom: var(--rl-sp3); } .base-url-hint code { @@ -520,18 +538,19 @@ body { /* ── Inline Environment Selector (inside request-bar) ──────────────── */ .request-env-select { - padding: 6px 8px; + height: var(--rl-ctrl); + padding: 0 0.6em; border: 1px solid var(--glass-border); - border-radius: 7px; + border-radius: var(--rl-r3); background: var(--vscode-input-background); color: var(--vscode-descriptionForeground); - font-size: 11px; + font-size: 0.82em; font-weight: 600; cursor: pointer; transition: border-color 0.15s, color 0.15s; - max-width: 130px; + max-width: 9em; flex-shrink: 0; } From 438ded955e33d25b5cceabd3ceed3f86f7ddb221 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 18:56:03 +0530 Subject: [PATCH 03/19] fix: url-input uses min-height + vertical padding for useAutoGrow compatibility Co-Authored-By: Claude Sonnet 4.6 --- src/webview/request/styles.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/webview/request/styles.css b/src/webview/request/styles.css index 9479aa8..5f84d8f 100644 --- a/src/webview/request/styles.css +++ b/src/webview/request/styles.css @@ -253,8 +253,8 @@ body { .url-input { flex: 1 1 16em; min-width: 0; - height: var(--rl-ctrl); - padding: 0 var(--rl-sp4); + min-height: var(--rl-ctrl); + padding: var(--rl-sp2) var(--rl-sp4); border: 1px solid var(--glass-border); border-radius: var(--rl-r3); background-color: var(--vscode-input-background); @@ -262,6 +262,7 @@ body { font-family: "SF Mono", "Fira Code", "Consolas", monospace; font-size: 0.92em; transition: all 0.2s ease; + overflow-wrap: anywhere; } .url-input:focus { From 3e19cbebeca0c559e319ee72533cb17906861525 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 18:58:06 +0530 Subject: [PATCH 04/19] feat: fluid tab strip with scroll + fade edges --- src/webview/request/styles.css | 55 +++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/webview/request/styles.css b/src/webview/request/styles.css index 5f84d8f..5d8e5b2 100644 --- a/src/webview/request/styles.css +++ b/src/webview/request/styles.css @@ -640,28 +640,61 @@ body { } /* Tabs */ +.tabstrip-wrap { + position: relative; + border-bottom: 1px solid var(--glass-border); + margin-bottom: var(--rl-sp5); +} +.tabstrip-wrap::before, +.tabstrip-wrap::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + width: 1.6em; + pointer-events: none; + z-index: 2; + opacity: 0; + transition: opacity 0.15s; +} +.tabstrip-wrap::before { + left: 0; + background: linear-gradient(90deg, var(--vscode-editor-background), transparent); +} +.tabstrip-wrap::after { + right: 0; + background: linear-gradient(270deg, var(--vscode-editor-background), transparent); +} +.tabstrip-wrap.scroll-start::after { opacity: 1; } +.tabstrip-wrap.scroll-mid::before, +.tabstrip-wrap.scroll-mid::after { opacity: 1; } +.tabstrip-wrap.scroll-end::before { opacity: 1; } + .tabs { display: flex; - gap: 4px; - border-bottom: 1px solid var(--glass-border); - margin-bottom: 16px; + gap: var(--rl-sp1); + overflow-x: auto; + scrollbar-width: none; position: relative; } +.tabs::-webkit-scrollbar { height: 0; } .tab { display: flex; align-items: center; - gap: 6px; - padding: 12px 18px; + gap: var(--rl-sp2); + padding: var(--rl-sp3) var(--rl-sp4); border: none; border-bottom: 2px solid transparent; background: transparent; color: var(--vscode-descriptionForeground); - font-size: 13px; + font-size: 0.92em; font-weight: 500; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); position: relative; + flex-shrink: 0; + white-space: nowrap; } .tab::before { @@ -694,14 +727,14 @@ body { display: inline-flex; align-items: center; justify-content: center; - min-width: 18px; - height: 18px; - padding: 0 6px; - font-size: 10px; + min-width: 1.4em; + height: 1.4em; + padding: 0 0.42em; + font-size: 0.72em; font-weight: 700; background: var(--restlab-gradient); color: #ffffff; - border-radius: 9px; + border-radius: 0.8em; } /* Split Container */ From dc167e643bcf29ed7008bff85dbeeafce55a1485 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:01:21 +0530 Subject: [PATCH 05/19] feat: fluid response section and key-value rows Co-Authored-By: Claude Sonnet 4.6 --- src/webview/request/styles.css | 85 +++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/src/webview/request/styles.css b/src/webview/request/styles.css index 5d8e5b2..7360f76 100644 --- a/src/webview/request/styles.css +++ b/src/webview/request/styles.css @@ -950,9 +950,9 @@ body { .header-row { display: flex; - gap: 8px; - align-items: flex-start; - margin-bottom: 8px; + gap: var(--rl-sp3); + align-items: center; + margin-bottom: var(--rl-sp2); } .header-row.inherited { @@ -962,13 +962,14 @@ body { .header-key, .header-value { flex: 1; - padding: 8px 12px; + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: 1px solid var(--vscode-panel-border); - border-radius: 6px; + border-radius: var(--rl-r2); background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); font-family: inherit; - font-size: 13px; + font-size: 0.9em; } .header-key:focus, @@ -1006,10 +1007,10 @@ body { display: flex; align-items: center; justify-content: center; - width: 28px; - height: 28px; + width: var(--rl-ctrl); + height: var(--rl-ctrl); border: none; - border-radius: 4px; + border-radius: var(--rl-r2); background: transparent; color: var(--vscode-descriptionForeground); cursor: pointer; @@ -1054,13 +1055,14 @@ body { .content-type-select { flex: 1; max-width: 350px; - padding: 8px 12px; + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: 1px solid var(--vscode-panel-border); - border-radius: 6px; + border-radius: var(--rl-r2); background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); font-family: inherit; - font-size: 13px; + font-size: 0.9em; cursor: pointer; } @@ -1215,20 +1217,21 @@ body { .form-data-row { display: flex; - gap: 8px; - align-items: flex-start; + gap: var(--rl-sp3); + align-items: center; } .form-data-key, .form-data-value { flex: 1; - padding: 8px 12px; + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: 1px solid var(--vscode-panel-border); - border-radius: 6px; + border-radius: var(--rl-r2); background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); font-family: inherit; - font-size: 13px; + font-size: 0.9em; } .form-data-key:focus, @@ -1242,10 +1245,10 @@ body { display: flex; align-items: center; justify-content: center; - width: 32px; - height: 32px; + width: var(--rl-ctrl); + height: var(--rl-ctrl); border: 1px solid var(--vscode-panel-border); - border-radius: 6px; + border-radius: var(--rl-r2); background-color: var(--vscode-input-background); color: var(--vscode-descriptionForeground); cursor: pointer; @@ -1317,7 +1320,7 @@ body { /* Response Section */ .response-section { - padding: 16px; + padding: var(--rl-sp5); border: 1px solid var(--glass-border); border-radius: 12px; background: var(--glass-bg); @@ -1345,7 +1348,9 @@ body { display: flex; align-items: center; justify-content: space-between; - margin-bottom: 16px; + margin-bottom: var(--rl-sp5); + flex-wrap: wrap; + gap: var(--rl-sp3); } .response-header h2 { @@ -1361,7 +1366,8 @@ body { .response-meta { display: flex; - gap: 8px; + gap: var(--rl-sp2); + flex-wrap: wrap; } .response-header-right { @@ -1404,7 +1410,9 @@ body { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 12px; + margin-bottom: var(--rl-sp4); + flex-wrap: wrap; + gap: var(--rl-sp3); } .response-actions { @@ -1415,13 +1423,14 @@ body { .response-actions .action-btn { display: flex; align-items: center; - gap: 6px; - padding: 8px 14px; + gap: var(--rl-sp2); + height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); border: 1px solid var(--glass-border); - border-radius: 6px; + border-radius: var(--rl-r2); background: var(--glass-bg); color: var(--vscode-foreground); - font-size: 12px; + font-size: 0.8em; font-weight: 500; cursor: pointer; opacity: 1; @@ -1441,9 +1450,9 @@ body { } .status-badge { - padding: 6px 14px; - border-radius: 20px; - font-size: 12px; + padding: 0.35em 0.8em; + border-radius: 1.4em; + font-size: 0.76em; font-weight: 700; letter-spacing: 0.3px; } @@ -1494,9 +1503,9 @@ body { } .time-badge { - padding: 6px 14px; - border-radius: 20px; - font-size: 12px; + padding: 0.35em 0.8em; + border-radius: 1.4em; + font-size: 0.76em; font-weight: 600; background: var(--glass-bg); color: var(--vscode-foreground); @@ -1504,9 +1513,9 @@ body { } .size-badge { - padding: 6px 14px; - border-radius: 20px; - font-size: 12px; + padding: 0.35em 0.8em; + border-radius: 1.4em; + font-size: 0.76em; font-weight: 600; background: linear-gradient( 90deg, @@ -1631,7 +1640,7 @@ body { .response-header-row .header-name { font-weight: 700; - min-width: 200px; + min-width: 11em; background: var(--restlab-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; From c368c1bba60512ed364e6a9d06fc32190dd451c2 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:03:02 +0530 Subject: [PATCH 06/19] chore: remove px font-shrink media overrides (fluid sizing replaces them) --- src/webview/request/styles.css | 117 --------------------------------- 1 file changed, 117 deletions(-) diff --git a/src/webview/request/styles.css b/src/webview/request/styles.css index 7360f76..95cec68 100644 --- a/src/webview/request/styles.css +++ b/src/webview/request/styles.css @@ -1741,88 +1741,7 @@ body { display: inline; } -/* Responsive Styles */ -@media (max-width: 700px) { - .request-editor { - padding: 0 16px; - } - - .request-bar { - flex-wrap: wrap; - gap: 8px; - } - - .method-select { - min-width: 90px; - padding: 10px 10px; - font-size: 12px; - } - - .url-input { - flex: 1 1 100%; - order: -1; - padding: 10px 12px; - font-size: 12px; - } - - .send-btn, - .save-btn { - padding: 10px 12px; - font-size: 12px; - } - - .send-btn .btn-text, - .save-btn .btn-text, - .beautify-btn .btn-text { - display: none; - } - - .send-btn, - .save-btn, - .beautify-btn { - gap: 0; - } -} - @media (max-width: 500px) { - .request-editor { - padding: 0 12px; - } - - .request-header { - padding: 12px 0; - } - - .request-name-input { - font-size: 16px; - max-width: 100%; - } - - .request-bar { - padding: 12px 0; - gap: 6px; - } - - .method-select { - min-width: 80px; - padding: 8px 8px; - } - - .url-input { - padding: 8px 10px; - } - - .send-btn, - .beautify-btn, - .save-btn { - padding: 8px 10px; - } - - .layout-toggle-btn { - width: 32px; - height: 32px; - } - /* Force horizontal layout on very small screens */ .split-container.vertical { flex-direction: column; @@ -1854,40 +1773,4 @@ body { width: 48px; height: 4px; } - - .response-meta { - flex-wrap: wrap; - gap: 4px; - } - - .status-badge, - .time-badge, - .size-badge { - font-size: 10px; - padding: 4px 8px; - } - - .response-toolbar { - flex-direction: column; - align-items: stretch; - gap: 8px; - } - - .response-actions { - justify-content: flex-end; - } - - .response-actions .action-btn { - padding: 6px 10px; - font-size: 11px; - } - - .error-display { - padding: 20px 12px; - } - - .error-message { - padding: 12px 14px; - font-size: 12px; - } } From b077345a17b669e2a1608f1b59ae52e3866d6a64 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:05:15 +0530 Subject: [PATCH 07/19] feat: tab strip scroll hook with fade-edge indicators --- src/webview/request/RequestEditor.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/webview/request/RequestEditor.tsx b/src/webview/request/RequestEditor.tsx index 15c3443..233b1fa 100644 --- a/src/webview/request/RequestEditor.tsx +++ b/src/webview/request/RequestEditor.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import CodeIcon from "../components/icons/CodeIcon"; import MoreActionIcon from "../components/icons/MoreActionIcon"; import SaveIcon from "../components/icons/SaveIcon"; @@ -18,6 +18,18 @@ import VarInput from "./VarInput"; const RequestEditorContent: React.FC = () => { const [moreOpen, setMoreOpen] = useState(false); const moreRef = useRef(null); + const stripRef = useRef(null); + const [edge, setEdge] = useState(""); + + const onScroll = () => { + const el = stripRef.current; + if (!el) return; + const max = el.scrollWidth - el.clientWidth; + if (max < 2) return setEdge(""); + if (el.scrollLeft < 4) setEdge("scroll-start"); + else if (el.scrollLeft > max - 4) setEdge("scroll-end"); + else setEdge("scroll-mid"); + }; React.useEffect(() => { if (!moreOpen) return; @@ -57,6 +69,8 @@ const RequestEditorContent: React.FC = () => { handleSetActiveEnvironment, } = useRequestContext(); + useEffect(onScroll, [config.method]); + return (
@@ -205,7 +219,8 @@ const RequestEditorContent: React.FC = () => { } >
-
+
+
{METHODS_WITH_BODY.includes(config.method) && (
+
{activeTab === "body" && ( From 76f3aadd9b766dc352e9c5cd239eb6e62c394d0a Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:12:33 +0530 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20create=20sidebar.css=20=E2=80=94?= =?UTF-8?q?=20custom=20CSS=20replacing=20Tailwind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webview/sidebar/sidebar.css | 578 ++++++++++++++++++++++++++++++++ 1 file changed, 578 insertions(+) create mode 100644 src/webview/sidebar/sidebar.css diff --git a/src/webview/sidebar/sidebar.css b/src/webview/sidebar/sidebar.css new file mode 100644 index 0000000..86ae784 --- /dev/null +++ b/src/webview/sidebar/sidebar.css @@ -0,0 +1,578 @@ +/* ============================================================ + REST-Lab Sidebar — Custom CSS (replaces Tailwind) + All sizing in em relative to body { font-size: var(--vscode-font-size) } + ============================================================ */ + +/* ---- Reset ---- */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +/* ---- Base ---- */ +body { + font-family: var( + --vscode-font-family, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + sans-serif + ); + font-size: var(--vscode-font-size, 13px); + color: var(--vscode-foreground); + background-color: var(--vscode-sideBar-background); + line-height: 1.45; +} + +/* ---- Brand & VS Code tokens ---- */ +:root { + --restlab-gradient: linear-gradient(90deg, #38bdf8 0%, #6366f1 100%); + --restlab-gradient-hover: linear-gradient(90deg, #0ea5e9 0%, #4f46e5 100%); + --restlab-accent: #38bdf8; + --restlab-accent-hover: #0ea5e9; + --restlab-accent-subtle: rgba(56, 189, 248, 0.1); + --restlab-accent-glow: rgba(56, 189, 248, 0.4); + --restlab-danger: #ef4444; + --restlab-danger-subtle: rgba(239, 68, 68, 0.1); + --glass-bg: rgba(255, 255, 255, 0.03); + --glass-border: rgba(255, 255, 255, 0.08); + /* Method colors */ + --method-get: #22c55e; + --method-post: #3b82f6; + --method-put: #f59e0b; + --method-patch: #a855f7; + --method-delete: #ef4444; + /* Fluid spacing tokens */ + --rl-sp1: 0.30em; + --rl-sp2: 0.46em; + --rl-sp3: 0.62em; + --rl-sp4: 0.92em; + --rl-sp5: 1.23em; + --rl-ctrl: 2.35em; + --rl-icon: 1.25em; + --rl-r1: 0.35em; + --rl-r2: 0.50em; + --rl-r3: 0.65em; + --rl-tap: 2.1em; +} + +/* ============================================================ + SIDEBAR SHELL + ============================================================ */ +.sb { + display: flex; + flex-direction: column; + height: 100vh; + overflow: hidden; +} + +/* ---- Header ---- */ +.sb-head { + padding: var(--rl-sp4); + border-bottom: 1px solid var(--glass-border); + background: linear-gradient(180deg, rgba(56, 189, 248, 0.05), transparent); + position: relative; + flex-shrink: 0; +} +.sb-head::after { + content: ""; + position: absolute; + bottom: -1px; + left: var(--rl-sp4); + right: var(--rl-sp4); + height: 1px; + background: var(--restlab-gradient); + opacity: 0.3; +} + +.sb-title { + display: flex; + align-items: center; + gap: var(--rl-sp2); + font-size: 0.86em; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.12em; + background: var(--restlab-gradient); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + margin-bottom: var(--rl-sp4); +} +.sb-title::before { + content: ""; + display: inline-block; + width: 0.62em; + height: 0.62em; + flex-shrink: 0; + border-radius: 2px; + background: var(--restlab-gradient); + box-shadow: 0 0 8px var(--restlab-accent-glow); + /* Reset gradient-text clip so the dot renders as a solid box */ + -webkit-background-clip: unset; + background-clip: unset; + -webkit-text-fill-color: unset; +} + +.sb-head-actions { + display: flex; + align-items: center; + gap: var(--rl-sp2); +} + +/* ---- Tree ---- */ +.sb-tree { + flex: 1; + min-height: 0; + overflow-y: auto; + padding: var(--rl-sp3) var(--rl-sp2); +} +.sb-tree::-webkit-scrollbar { width: 0.54em; } +.sb-tree::-webkit-scrollbar-track { background: transparent; } +.sb-tree::-webkit-scrollbar-thumb { + background: var(--vscode-scrollbarSlider-background, rgba(121, 121, 121, 0.35)); + border-radius: 0.27em; +} +.sb-tree::-webkit-scrollbar-thumb:hover { + background: var(--vscode-scrollbarSlider-hoverBackground, rgba(121, 121, 121, 0.55)); +} + +/* ============================================================ + FOLDER ROW + ============================================================ */ +.folder-item { margin-bottom: 2px; } + +.tree-row { + display: flex; + align-items: center; + gap: var(--rl-sp3); + padding: var(--rl-sp3); + margin-bottom: var(--rl-sp1); + cursor: pointer; + border-radius: var(--rl-r2); + border: 1px solid transparent; + position: relative; + transition: background 0.15s ease, border-color 0.15s ease; +} +.tree-row::before { + content: ""; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 0; + border-radius: 0 2px 2px 0; + background: var(--restlab-gradient); + transition: height 0.2s ease; +} +.tree-row:hover, +.tree-row:focus-visible { + background: var(--glass-bg); + border-color: var(--glass-border); + outline: none; +} +.tree-row:hover::before, +.tree-row:focus-visible::before { height: 60%; } +.tree-row:focus-visible { + border-color: var(--restlab-accent); + background: var(--restlab-accent-subtle); +} + +.tree-icon { + flex-shrink: 0; + width: var(--rl-icon); + height: var(--rl-icon); + color: var(--vscode-descriptionForeground); + transition: color 0.15s ease; + display: block; +} +.tree-row:hover .tree-icon { color: var(--restlab-accent); } + +.tree-label { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.95em; + font-weight: 600; +} + +.tree-actions { + display: flex; + align-items: center; + gap: var(--rl-sp1); + margin-left: auto; + flex-shrink: 0; +} + +/* ---- Tree children connector ---- */ +.tree-children { + position: relative; +} +.tree-children::before { + content: ""; + position: absolute; + left: calc(var(--rl-sp4) + 0.3em); + top: 0; + bottom: var(--rl-sp3); + width: 1px; + background: linear-gradient(var(--glass-border), transparent); +} + +/* ============================================================ + REQUEST ROW + ============================================================ */ +.req-zone { /* container only — layout handled by inline paddingLeft */ } + +.req-row { + display: flex; + align-items: center; + gap: var(--rl-sp2); + padding: var(--rl-sp2) var(--rl-sp3); + margin-bottom: 1px; + margin-left: 0.6em; + cursor: pointer; + border-radius: var(--rl-r2); + border: 1px solid transparent; + position: relative; + transition: background 0.15s ease, border-color 0.15s ease; +} +.req-row::before { + content: ""; + position: absolute; + left: -0.6em; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 0; + border-radius: 0 2px 2px 0; + background: var(--restlab-gradient); + transition: height 0.2s ease; +} +.req-row:hover { background: var(--glass-bg); border-color: var(--glass-border); } +.req-row:hover::before { height: 55%; } +.req-row.active { + background: rgba(56, 189, 248, 0.15); + border-color: rgba(56, 189, 248, 0.3); +} +.req-row.active::before { height: 55%; } + +.req-label { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.88em; +} + +/* ============================================================ + EMPTY STATES + ============================================================ */ +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 3em 1.5em; + text-align: center; + gap: var(--rl-sp3); +} +.empty-state svg { + width: 3.2em; + height: 3.2em; + color: var(--restlab-accent); + opacity: 0.5; + margin-bottom: var(--rl-sp2); +} +.empty-state-title { + font-size: 0.95em; + font-weight: 600; + color: var(--vscode-foreground); + margin-bottom: var(--rl-sp1); +} +.empty-state-hint { + font-size: 0.82em; + color: var(--vscode-descriptionForeground); + opacity: 0.8; + line-height: 1.5; + max-width: 18em; +} + +.req-empty-hint { + padding: var(--rl-sp2) var(--rl-sp3); + font-size: 0.82em; + color: var(--vscode-descriptionForeground); + opacity: 0.7; + font-style: italic; +} + +/* ============================================================ + METHOD BADGE + ============================================================ */ +.method-badge { + flex-shrink: 0; + font-size: 0.62em; + font-weight: 800; + padding: 0.32em 0.55em; + border-radius: 0.5em; + text-transform: uppercase; + letter-spacing: 0.06em; + border: 1px solid transparent; + line-height: 1; + min-width: 3.6em; + text-align: center; +} +.method-get { + color: var(--method-get); + background: rgba(34, 197, 94, 0.14); + border-color: rgba(34, 197, 94, 0.32); +} +.method-post { + color: var(--method-post); + background: rgba(59, 130, 246, 0.14); + border-color: rgba(59, 130, 246, 0.32); +} +.method-put { + color: var(--method-put); + background: rgba(245, 158, 11, 0.14); + border-color: rgba(245, 158, 11, 0.32); +} +.method-patch { + color: var(--method-patch); + background: rgba(168, 85, 247, 0.14); + border-color: rgba(168, 85, 247, 0.32); +} +.method-delete { + color: var(--method-delete); + background: rgba(239, 68, 68, 0.14); + border-color: rgba(239, 68, 68, 0.32); +} + +/* ============================================================ + BUTTONS + ============================================================ */ +.btn-primary { + display: flex; + align-items: center; + justify-content: center; + gap: var(--rl-sp3); + flex: 1; + min-height: var(--rl-ctrl); + padding: 0 var(--rl-sp4); + border: none; + border-radius: var(--rl-r3); + background: var(--restlab-gradient); + color: #ffffff; + font: inherit; + font-size: 0.92em; + font-weight: 600; + cursor: pointer; + box-shadow: 0 2px 8px var(--restlab-accent-glow); + position: relative; + overflow: hidden; + white-space: nowrap; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} +.btn-primary::before { + content: ""; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s ease; +} +.btn-primary:hover::before { left: 100%; } +.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 24px var(--restlab-accent-glow); } +.btn-primary:active { transform: translateY(0); } +.btn-primary:focus { outline: 2px solid var(--restlab-accent); outline-offset: 2px; } +.btn-primary svg { flex-shrink: 0; width: var(--rl-icon); height: var(--rl-icon); } + +.header-action-btn { + display: flex; + align-items: center; + justify-content: center; + width: var(--rl-ctrl); + height: var(--rl-ctrl); + flex-shrink: 0; + padding: 0; + border: 1px solid var(--glass-border); + border-radius: var(--rl-r3); + background: var(--glass-bg); + color: var(--vscode-foreground); + cursor: pointer; + transition: all 0.2s ease; +} +.header-action-btn:hover { + background: var(--restlab-accent-subtle); + border-color: var(--restlab-accent); + color: var(--restlab-accent); +} +.header-action-btn svg { width: var(--rl-icon); height: var(--rl-icon); } + +.action-btn { + display: flex; + align-items: center; + justify-content: center; + width: var(--rl-tap); + height: var(--rl-tap); + flex-shrink: 0; + border: none; + border-radius: var(--rl-r1); + background: transparent; + color: var(--vscode-icon-foreground, var(--vscode-foreground)); + cursor: pointer; + opacity: 0; + transition: all 0.15s ease; +} +.tree-row:hover .action-btn, +.req-row:hover .action-btn { opacity: 0.6; } +.action-btn:hover { opacity: 1 !important; background: var(--restlab-accent-subtle); color: var(--restlab-accent); } +.action-btn svg { width: var(--rl-icon); height: var(--rl-icon); display: block; } + +/* ---- Chevron rotation utility ---- */ +.rotate-90 { transform: rotate(90deg); transition: transform 0.2s ease; } + +/* ============================================================ + DROPDOWN + ============================================================ */ +.dropdown-wrap { + position: relative; + display: inline-flex; +} + +.dropdown-menu { + position: absolute; + top: calc(100% + 4px); + right: 0; + min-width: 180px; + background: var(--vscode-dropdown-background, #3c3c3c); + border: 1px solid var(--vscode-dropdown-border, #454545); + border-radius: var(--rl-r3); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4); + z-index: 1000; + overflow: hidden; + animation: sbFadeIn 0.15s ease-out; +} + +.dropdown-header { + padding: var(--rl-sp3) var(--rl-sp4); + font-size: 0.84em; + font-weight: 600; + color: var(--vscode-descriptionForeground, #858585); + text-transform: uppercase; + letter-spacing: 0.05em; + border-bottom: 1px solid var(--vscode-dropdown-border, #454545); +} + +.dropdown-item { + display: flex; + align-items: center; + gap: var(--rl-sp3); + width: 100%; + padding: var(--rl-sp3) var(--rl-sp4); + border: none; + background: transparent; + color: var(--vscode-dropdown-foreground, #cccccc); + font: inherit; + font-size: 0.92em; + cursor: pointer; + text-align: left; + transition: background 0.12s ease; +} +.dropdown-item:hover { background: var(--vscode-list-hoverBackground, #2a2d2e); } +.dropdown-item:active { background: var(--vscode-list-activeSelectionBackground, #094771); } +.dropdown-item.danger { color: var(--restlab-danger); } +.dropdown-item.danger:hover { background: var(--restlab-danger-subtle); } + +.dropdown-divider { + height: 1px; + background: var(--vscode-dropdown-border, #454545); + margin: 2px 0; +} + +.dropdown-item-icon { + display: flex; + align-items: center; + justify-content: center; + width: var(--rl-icon); + height: var(--rl-icon); + opacity: 0.8; + flex-shrink: 0; +} + +/* ============================================================ + TOOLTIP + ============================================================ */ +.custom-tooltip { + padding: 4px 8px; + margin: 2px; + border-radius: var(--rl-r1); + font-size: 0.84em; + font-weight: 500; + white-space: nowrap; + pointer-events: none; + background: var(--vscode-editorWidget-background, #252526); + color: var(--vscode-editorWidget-foreground, #cccccc); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + border: 1px solid var(--vscode-editorWidget-border, #454545); + z-index: 2147483647; + animation: sbTooltipFadeIn 0.15s ease-out; +} +.custom-tooltip.tooltip-top::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%); + border: 4px solid transparent; + border-top-color: var(--vscode-editorWidget-background, #252526); +} +.custom-tooltip.tooltip-bottom::after { + content: ""; + position: absolute; + bottom: 100%; + left: 50%; + transform: translateX(-50%); + border: 4px solid transparent; + border-bottom-color: var(--vscode-editorWidget-background, #252526); +} +.custom-tooltip.tooltip-left::after { + content: ""; + position: absolute; + left: 100%; + top: 50%; + transform: translateY(-50%); + border: 4px solid transparent; + border-left-color: var(--vscode-editorWidget-background, #252526); +} +.custom-tooltip.tooltip-right::after { + content: ""; + position: absolute; + right: 100%; + top: 50%; + transform: translateY(-50%); + border: 4px solid transparent; + border-right-color: var(--vscode-editorWidget-background, #252526); +} + +/* ============================================================ + ANIMATIONS + ============================================================ */ +@keyframes sbFadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes sbTooltipFadeIn { + from { opacity: 0; } + to { opacity: 1; } +} From f00ee64b15d313e67f9add56e866dd12c29d314c Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:17:44 +0530 Subject: [PATCH 09/19] feat: sidebar bundle now uses sidebar.css instead of tailwind --- src/webview/sidebar/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webview/sidebar/index.tsx b/src/webview/sidebar/index.tsx index d471f45..75e1c6e 100644 --- a/src/webview/sidebar/index.tsx +++ b/src/webview/sidebar/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import { createRoot } from "react-dom/client"; -import "../tailwind.css"; +import "./sidebar.css"; import { Sidebar } from "./Sidebar"; import "./drag-drop.css"; From af545372f7b3c8fe50ceffaaa87f48b12d236ff8 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:20:05 +0530 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20Sidebar.tsx=20=E2=80=94=20replace?= =?UTF-8?q?=20Tailwind=20utilities=20with=20semantic=20CSS=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- src/webview/sidebar/Sidebar.tsx | 44 +++++++++++++++------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/webview/sidebar/Sidebar.tsx b/src/webview/sidebar/Sidebar.tsx index 6f89772..4c0748d 100644 --- a/src/webview/sidebar/Sidebar.tsx +++ b/src/webview/sidebar/Sidebar.tsx @@ -121,9 +121,9 @@ const FolderItem: React.FC = ({ const isDropTarget = dragOverFolderId === folder.id; return ( -
+
onToggleFolder(folder.id)} role="button" tabIndex={0} @@ -136,18 +136,18 @@ const FolderItem: React.FC = ({ onDrop={(e) => onDrop(e, folder.id)} > {depth === 0 ? ( - + ) : ( - + )} - + {folder.name} -
+
{expandedFolders.has(folder.id) && ( -
+
{/* Render subfolders first */} {folder.subfolders && folder.subfolders.map((subfolder) => ( @@ -205,7 +205,7 @@ const FolderItem: React.FC = ({ {/* Render requests */}
onDragOver(e, folder.id)} onDrop={(e) => onDrop(e, folder.id)} @@ -213,7 +213,7 @@ const FolderItem: React.FC = ({ {(!folder.requests || folder.requests.length === 0) && (!folder.subfolders || folder.subfolders.length === 0) ? (
{isDropTarget ? "Drop here to add" : "No items yet"} @@ -223,11 +223,7 @@ const FolderItem: React.FC = ({ folder.requests?.map((request) => (
onOpenRequest(request)} role="button" tabIndex={0} @@ -248,7 +244,7 @@ const FolderItem: React.FC = ({ > {request.method} - + {request.name} { }; return ( -
-
-

+
+
+

REST Lab

-
+
{ if (e.dataTransfer.types.includes(DRAG_TYPE_FOLDER)) { e.preventDefault(); @@ -620,10 +616,10 @@ export const Sidebar: React.FC = () => { onDrop={handleDropOnRoot} > {folders.length === 0 ? ( -
+
-

No collections yet

-

+

No collections yet

+

Create your first collection to get started

From 4640b39415bf75f08e591e19b07d71e1f33a67e4 Mon Sep 17 00:00:00 2001 From: Shambhu Lal Verma Date: Fri, 5 Jun 2026 19:22:21 +0530 Subject: [PATCH 11/19] =?UTF-8?q?feat:=20FolderActionsDropdown=20=E2=80=94?= =?UTF-8?q?=20remove=20Tailwind=20utility=20strings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webview/sidebar/FolderActionsDropdown.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/webview/sidebar/FolderActionsDropdown.tsx b/src/webview/sidebar/FolderActionsDropdown.tsx index 41062b7..b0f31aa 100644 --- a/src/webview/sidebar/FolderActionsDropdown.tsx +++ b/src/webview/sidebar/FolderActionsDropdown.tsx @@ -80,7 +80,7 @@ const FolderActionsDropdown: React.FC<{ }; return ( -
+
)} {isOpen && showExport && ( -
+
{isOpen && ( -
+