Skip to content

Commit 64f82d8

Browse files
DavidsonGomesclaude
andcommitted
release: v0.18.6 — share CSS isolation + workspace responsiveness + Makefile fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b5545fd commit 64f82d8

File tree

8 files changed

+96
-57
lines changed

8 files changed

+96
-57
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.18.6] - 2026-04-12
9+
10+
### Fixed
11+
12+
- **Share viewer CSS isolation** — shared HTML files now render inside an `<iframe>` with `srcDoc` instead of `dangerouslySetInnerHTML`, preventing Tailwind preflight and global dashboard styles from overriding the shared file's internal CSS (e.g., centered headers appearing left-aligned)
13+
- **Workspace file manager responsiveness** — FileTree sidebar now collapses into a slide-over drawer on mobile (`<lg` breakpoint) with overlay and toggle button. Toolbar buttons show icons-only on small screens (`<sm`). Selecting a file auto-closes the sidebar on mobile
14+
- **Makefile `make run` IndentationError** — multiline Python `-c` commands had tab characters from Makefile indentation leaking into the Python source, causing `IndentationError: unexpected indent`. Collapsed to single-line commands
15+
816
## [0.18.5] - 2026-04-12
917

1018
### Added

Makefile

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,30 +60,10 @@ learn-weekly: ## 📚 Learning loop weekly report — overdue facts + stat
6060
# make run R=community-week
6161

6262
run: ## ▶️ Run any routine: make run R=<id> (e.g. make run R=fin-pulse)
63-
@$(PYTHON) -c "\
64-
import sys; sys.path.insert(0, 'dashboard/backend'); \
65-
from routes._helpers import get_routine_scripts; \
66-
scripts = get_routine_scripts(); \
67-
r = '$(R)'; \
68-
s = scripts.get(r) or next((v for k,v in scripts.items() if r.replace('-','_') in v), None); \
69-
print(f'Running: {s}') if s else (print(f'Unknown routine: {r}. Available: {\" \".join(sorted(scripts.keys()))}'), exit(1)); \
70-
" && $(PYTHON) $(ADW_DIR)/$$($(PYTHON) -c "\
71-
import sys; sys.path.insert(0, 'dashboard/backend'); \
72-
from routes._helpers import get_routine_scripts; \
73-
scripts = get_routine_scripts(); \
74-
r = '$(R)'; \
75-
s = scripts.get(r) or next((v for k,v in scripts.items() if r.replace('-','_') in v), ''); \
76-
print(s); \
77-
")
63+
@$(PYTHON) -c "import sys; sys.path.insert(0, 'dashboard/backend'); from routes._helpers import get_routine_scripts; scripts = get_routine_scripts(); r = '$(R)'; s = scripts.get(r) or next((v for k,v in scripts.items() if r.replace('-','_') in v), None); print(f'Running: {s}') if s else (print(f'Unknown routine: {r}'), exit(1))" && $(PYTHON) $(ADW_DIR)/$$($(PYTHON) -c "import sys; sys.path.insert(0, 'dashboard/backend'); from routes._helpers import get_routine_scripts; scripts = get_routine_scripts(); r = '$(R)'; s = scripts.get(r) or next((v for k,v in scripts.items() if r.replace('-','_') in v), ''); print(s)")
7864

7965
list-routines: ## 📋 List all available routines (dynamic from scripts)
80-
@$(PYTHON) -c "\
81-
import sys; sys.path.insert(0, 'dashboard/backend'); \
82-
from routes._helpers import discover_routines; \
83-
routines = discover_routines(); \
84-
[print(f' \033[36m{k:20s}\033[0m {v[\"name\"]:30s} @{v[\"agent\"]:<10s} {v[\"script\"]}') for k,v in sorted(routines.items())]; \
85-
print(f'\n {len(routines)} routines available — run with: make run R=<id>'); \
86-
"
66+
@$(PYTHON) -c "import sys; sys.path.insert(0, 'dashboard/backend'); from routes._helpers import discover_routines; routines = discover_routines(); [print(f' \033[36m{k:20s}\033[0m {v[\"name\"]:30s} @{v[\"agent\"]:<10s} {v[\"script\"]}') for k,v in sorted(routines.items())]; print(f'\n {len(routines)} routines available — run with: make run R=<id>')"
8767

8868
# ── Agent Teams (experimental, opt-in) ───
8969
# Parallel multi-agent versions of consolidation routines.

cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@evoapi/evo-nexus",
3-
"version": "0.18.5",
3+
"version": "0.18.6",
44
"description": "Unofficial open source toolkit for Claude Code — AI-powered business operating system",
55
"keywords": [
66
"claude-code",

dashboard/frontend/src/components/workspace/FileToolbar.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ function ToolbarButton({ icon, label, onClick, variant = 'default', disabled = f
122122
onMouseUp={handleMouseUp}
123123
>
124124
{icon}
125-
<span>{label}</span>
125+
<span className="hidden sm:inline">{label}</span>
126126
</button>
127127
)
128128
}
@@ -166,8 +166,6 @@ export default function FileToolbar({
166166
<div
167167
className="flex items-center gap-0.5 px-3 py-2 overflow-x-auto"
168168
style={{
169-
background: 'var(--bg-card)',
170-
borderBottom: '1px solid var(--border)',
171169
minHeight: '44px',
172170
flexShrink: 0,
173171
}}

dashboard/frontend/src/pages/ShareView.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,22 @@ export default function ShareView() {
9494
load()
9595
}, [token])
9696

97-
// Full-page HTML rendering
97+
// Full-page HTML rendering — use iframe to isolate CSS
9898
if (state.status === 'html') {
9999
return (
100-
<div style={{ position: 'relative', minHeight: '100vh' }}>
101-
<div dangerouslySetInnerHTML={{ __html: state.content }} />
100+
<div style={{ position: 'relative', minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
101+
<iframe
102+
srcDoc={state.content}
103+
style={{
104+
flex: 1,
105+
width: '100%',
106+
minHeight: 'calc(100vh - 40px)',
107+
border: 'none',
108+
background: '#0C111D',
109+
}}
110+
title="Arquivo compartilhado"
111+
sandbox="allow-same-origin allow-scripts"
112+
/>
102113
<PoweredByFooter />
103114
</div>
104115
)

dashboard/frontend/src/pages/Workspace.tsx

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState, useEffect, useRef, useCallback } from 'react'
22
import { useLocation, useNavigate } from 'react-router-dom'
3-
import { CheckCircle, Copy, Check } from 'lucide-react'
3+
import { CheckCircle, Copy, Check, PanelLeftOpen } from 'lucide-react'
44
import { api } from '../lib/api'
55
import FileTree from '../components/workspace/FileTree'
66
import FileToolbar, { type EditorMode } from '../components/workspace/FileToolbar'
@@ -587,6 +587,9 @@ export default function Workspace() {
587587
})
588588
}, [])
589589

590+
// Mobile sidebar toggle
591+
const [sidebarOpen, setSidebarOpen] = useState(false)
592+
590593
const [copiedPath, setCopiedPath] = useState(false)
591594

592595
const handleCopyPath = useCallback(() => {
@@ -603,34 +606,73 @@ export default function Workspace() {
603606

604607
return (
605608
<div className="flex h-full overflow-hidden" style={{ background: 'var(--bg-primary)' }}>
606-
{/* FileTree */}
607-
<FileTree
608-
selectedPath={selectedPath}
609-
onSelect={handleSelect}
610-
onNavigate={(path) => handleSelect(path, true)}
611-
refreshTrigger={refreshTrigger}
612-
/>
609+
{/* Mobile overlay */}
610+
{sidebarOpen && (
611+
<div
612+
className="fixed inset-0 bg-black/60 z-40 lg:hidden"
613+
onClick={() => setSidebarOpen(false)}
614+
/>
615+
)}
613616

614-
{/* Main area */}
615-
<div className="flex flex-col flex-1 min-w-0 overflow-hidden">
616-
{/* FileToolbar */}
617-
<FileToolbar
617+
{/* FileTree — desktop: static sidebar, mobile: slide-over */}
618+
<div
619+
className={`
620+
fixed inset-y-0 left-0 z-50 transition-transform duration-200
621+
lg:static lg:translate-x-0 lg:z-auto
622+
${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}
623+
`}
624+
>
625+
<FileTree
618626
selectedPath={selectedPath}
619-
isDir={isDir}
620-
mode={mode}
621-
isDirty={isDirty}
622-
onNewFile={handleNewFile}
623-
onNewFolder={handleNewFolder}
624-
onUpload={() => setShowUpload(true)}
625-
onRefresh={() => setRefreshTrigger(t => t + 1)}
626-
onEdit={handleEdit}
627-
onSave={() => handleSave()}
628-
onCancel={handleCancel}
629-
onRename={handleRename}
630-
onDelete={handleDelete}
631-
onDownload={handleDownload}
632-
onShare={handleShare}
627+
onSelect={(path, dir) => {
628+
handleSelect(path, dir)
629+
setSidebarOpen(false)
630+
}}
631+
onNavigate={(path) => {
632+
handleSelect(path, true)
633+
setSidebarOpen(false)
634+
}}
635+
refreshTrigger={refreshTrigger}
633636
/>
637+
</div>
638+
639+
{/* Main area */}
640+
<div className="flex flex-col flex-1 min-w-0 overflow-hidden">
641+
{/* FileToolbar with mobile toggle */}
642+
<div className="flex items-center flex-shrink-0" style={{ background: 'var(--bg-card)', borderBottom: '1px solid var(--border)' }}>
643+
{/* Mobile sidebar toggle */}
644+
<button
645+
onClick={() => setSidebarOpen(true)}
646+
className="lg:hidden flex items-center justify-center flex-shrink-0"
647+
style={{
648+
width: '44px',
649+
height: '44px',
650+
color: 'var(--text-secondary)',
651+
borderRight: '1px solid var(--border)',
652+
}}
653+
>
654+
<PanelLeftOpen size={18} />
655+
</button>
656+
<div className="flex-1 min-w-0">
657+
<FileToolbar
658+
selectedPath={selectedPath}
659+
isDir={isDir}
660+
mode={mode}
661+
isDirty={isDirty}
662+
onNewFile={handleNewFile}
663+
onNewFolder={handleNewFolder}
664+
onUpload={() => setShowUpload(true)}
665+
onRefresh={() => setRefreshTrigger(t => t + 1)}
666+
onEdit={handleEdit}
667+
onSave={() => handleSave()}
668+
onCancel={handleCancel}
669+
onRename={handleRename}
670+
onDelete={handleDelete}
671+
onDownload={handleDownload}
672+
onShare={handleShare}
673+
/>
674+
</div>
675+
</div>
634676

635677
{/* File tabs */}
636678
<FileTabs

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "evo-nexus"
3-
version = "0.18.5"
3+
version = "0.18.6"
44
description = "Unofficial open source toolkit for Claude Code — AI-powered business operating system"
55
requires-python = ">=3.10"
66
dependencies = [

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)