2026-03-05 10:14:10 +00:00
# Fix Content Clipping + Hide Network Tabs in CloudFolder
2026-03-04 23:27:03 +00:00
## Context
2026-03-05 10:14:10 +00:00
Content clips/cuts off before reaching the bottom across CloudFolder, Marketplace, AppDetails — both desktop and mobile. Fixed UI elements (toolbars, search) must stay sticky while scrollable content extends to the tab bar (mobile) or viewport bottom (desktop). Also: hide Cloud/Network switcher on mobile in CloudFolder detail view.
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
## Root Cause
`.perspective-container-wrapper` has `height: 100%` + `overflow: hidden` + dynamic `pt-20` /`pt-40` . With `box-sizing: border-box` , the padding shrinks the content area by 80-160px on mobile.
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
```
<main flex-1 overflow-hidden pb-20> ← reserves tab bar space (correct)
.perspective-container-wrapper h-100% pt-20 ← padding SHRINKS content area (BUG)
.perspective-container h-100% overflow-hidden
.view-wrapper absolute inset-0
content div overflow-y-auto h-full ← scroll viewport 80-160px too small
```
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
## Solution: Move padding from wrapper to scroll container
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
### File 1: `neode-ui/src/views/Dashboard.vue` [DONE]
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
**A. Add computed** (~line 440):
```ts
const mobileTabPaddingTop = computed (() => {
if ( typeof window === 'undefined' || window . innerWidth >= 768 ) return 0
if ( showAppsTabs . value && showNetworkTabs . value ) return 160
if ( showAppsTabs . value || showNetworkTabs . value ) return 80
return 0
})
```
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
**B. Remove padding from wrapper** (line 258):
Remove `'pt-40': showAppsTabs && showNetworkTabs, 'pt-20': showAppsTabs !== showNetworkTabs` from `:class` .
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
**C. Apply offset to content div instead** (lines 269-277):
```html
< div v-else
:class = "['px-4 pt-4 md:pt-8 md:px-8 overflow-y-auto h-full',
needsMobileBackButtonSpace
? 'pb-[calc(var(--mobile-tab-bar-height,_72px)+96px)] md:pb-8'
: 'pb-4 md:pb-8'
]"
:style = "mobileTabPaddingTop ? { paddingTop: (mobileTabPaddingTop + 16) + 'px' } : undefined"
>
```
- When mobile tabs showing: `:style` overrides `pt-4` with dynamic value
- When no tabs (or desktop): `:style` is undefined, Tailwind `pt-4 md:pt-8` applies
- Bottom padding reduced from `pb-28 md:pb-24` to `pb-4 md:pb-8` (main's `pb-20` already handles tab bar)
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
**D. Hide Cloud/Network tabs in CloudFolder** (line 451):
```ts
if ( route . name === 'cloud-folder' ) return false
```
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
### File 2: `neode-ui/src/views/CloudFolder.vue` [DONE]
Delete spacer div at line 156.
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
### File 3: `neode-ui/src/views/AppDetails.vue` [DONE]
Delete spacer div at line 377.
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
### File 4: `neode-ui/src/views/MarketplaceAppDetails.vue` [DONE]
Delete spacer div at line 324.
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
### File 5: `neode-ui/src/views/Marketplace.vue` [DONE]
Change `pb-48` → `pb-4` on line 121.
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
## Safety
- 3D transitions preserved: `overflow: hidden` stays on wrapper + perspective-container
- Chat view unaffected: has its own branch bypassing the content div
- Desktop unaffected: `mobileTabPaddingTop` returns 0
- Back button space preserved: `needsMobileBackButtonSpace` still adds extra bottom padding
2026-03-04 23:27:03 +00:00
2026-03-05 10:14:10 +00:00
## Verification [DONE]
1. `cd neode-ui && npm run build`
2. `./scripts/deploy-to-target.sh --live`
3. Test all views on mobile + desktop: CloudFolder, Marketplace, AppDetails, Chat, Home, page transitions