π¨ Diagrama Visual: PadrΓ£o Arquitetural
Data: 26 de fevereiro de 2026
Status: Validado em Locations + Testing Center
π VisΓ£o Geral: Hierarquia de Componentesβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BROWSER WINDOW β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β AdminLayout (Global) β β
β β ββββββββββββ ββββββββββββββββββββββββββββββββββββββββ β β
β β β Sidebar β β Page Content β β β
β β β (Global) β β β β β
β β β β β βββββββββββββββββββββββββββββββββββ β β β
β β β β’ Home β β β AdminSectionLayout β β β β
β β β β’ Locais β β β (Feature-Specific Wrapper) β β β β
β β β β’ Staff β β β β β β β
β β β β’ Tests β β β βββββββββββ ββββββββββββββ β β β β
β β ββββββββββββ β β β β β Sidebar β β β β β
β β β β β Content β β (Right) β β β β β
β β β β β Area β β β β β β β
β β β β β β β ββββββββββ β β β β β
β β β β β (Tabs β β β π Listβ β β β β β
β β β β β render β β ββββββββββ€ β β β β β
β β β β β here) β β β β New β β β β β β
β β β β β β β ββββββββββ€ β β β β β
β β β β β β β β π Statβ β β β β β
β β β β βββββββββββ β ββββββββββ β β β β β
β β β β ββββββββββββββ β β β β
β β β βββββββββββββββββββββββββββββββββββ β β β
β β ββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Fluxo de Dados: State Managementβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β {Feature}Page.tsx β
β (ORQUESTRADOR) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β STATE β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β const [items, setItems] = useState([]) β β β
β β β const [selectedItem, setSelectedItem] = useState(null)β β β
β β β const [activeRightId, setActiveRightId] = useState() β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β HANDLERS β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β handleRightMenuSelect(id) β setActiveRightId(id) β β β
β β β handleCreate(data) β API call β setItems([new, ...]) β β β
β β β handleDelete(id) β API call β setItems(filtered) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β EFFECTS β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β useEffect(() => { β β β
β β β api.list().then(setItems) β β β
β β β }, []) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β RENDER β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β <AdminSectionLayout β β β
β β β rightMenu={rightMenu} β β β
β β β activeRightId={activeRightId} β β β
β β β onRightSelect={handleRightMenuSelect} β β β
β β β > β β β
β β β {activeRightId === 'list' && <ListTab items={...}/>}β β
β β β {activeRightId === 'new' && <FormTab onSubmit={...}/>}β β
β β β </AdminSectionLayout> β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β²
β props down β callbacks up
βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AdminSectionLayout.tsx β
β (APRESENTAΓΓO) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β PROPS RECEBIDAS β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β title, rightMenu[], activeRightId, onRightSelect β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β RENDER GRID β β
β β ββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ β β
β β β Content (children) β Sidebar (rightMenu) β β β
β β β β β β β
β β β {children} β {rightMenu.map(item => ( β β β
β β β β β <button β β β
β β β β β onClick={() => β β β
β β β Tabs renderizam aqui β onRightSelect(item.id)β β
β β β β } β β β
β β β β className={ β β β
β β β β activeRightId === id β β β
β β β β ? 'active' : '' β β β
β β β β } β β β
β β β β /> β β β
β β β β ))} β β β
β β ββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β²
β render β events
βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Tab Components β
β (COMPORTAMENTO) β
β β
β ββββββββββββββββββββββββ ββββββββββββββββββββββββ β
β β ListTab.tsx β β FormTab.tsx β β
β β ββββββββββββββββββ β β ββββββββββββββββββ β β
β β β PROPS β β β β PROPS β β β
β β β items[] β β β β onSubmit() β β β
β β β onDelete() β β β β onCancel() β β β
β β ββββββββββββββββββ β β ββββββββββββββββββ β β
β β β β β β
β β RENDER β β RENDER β β
β β ββββββββββββββββββ β β ββββββββββββββββββ β β
β β β {items.map()} β β β β <form> β β β
β β β <Card> β β β β <input> β β β
β β β {item} β β β β <button β β β
β β β <button β β β β onClick={ β β β
β β β onClick={β β β β onSubmit} β β β
β β β onDelete}β β β β /> β β β
β β β /> β β β β </form> β β β
β β β </Card> β β β ββββββββββββββββββ β β
β β β )}} β β β β β
β β ββββββββββββββββββ β β β β
β ββββββββββββββββββββββββ ββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π― Fluxo de InteraΓ§Γ£o: User Click β State Update β Re-renderβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 1: User clicks sidebar button "β New" β
β β
β ββββββββββββββββββββββββββββββββββββββ β
β β AdminSectionLayout β β
β β ββββββββββββββββββββββββββββββββ β β
β β β <button β β β
β β β onClick={() => β β β
β β β onRightSelect('new') ββββΌβββΌβββ USER CLICK β
β β β } β β β
β β β /> β β β
β β ββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββ β
β β β
β β callback invoked β
β βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 2: Handler updates state β
β β
β ββββββββββββββββββββββββββββββββββββββ β
β β {Feature}Page β β
β β ββββββββββββββββββββββββββββββββ β β
β β β function handleRightMenuSelectβ β β
β β β (id: string) { β β β
β β β setActiveRightId(id) βββββββΌβββΌβββ CALLED β
β β β } β β with 'new' β
β β ββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββ β
β β β
β β state updated β
β βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 3: React re-renders component β
β β
β ββββββββββββββββββββββββββββββββββββββ β
β β {Feature}Page β β
β β ββββββββββββββββββββββββββββββββ β β
β β β const activeRightId = 'new' β β βββ STATE NOW β
β β ββββββββββββββββββββββββββββββββ β 'new' β
β β β β
β β CONDITIONAL EVALUATION: β β
β β ββββββββββββββββββββββββββββββββ β β
β β β {activeRightId === 'list' && β β βββ FALSE β β
β β β <ListTab />} β β (skipped) β
β β β β β β
β β β {activeRightId === 'new' && β β βββ TRUE β
β
β β β <FormTab />} β β (renders) β
β β ββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββ β
β β β
β β FormTab rendered β
β βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 4: UI updates (user sees FormTab) β
β β
β ββββββββββββββββββββββββββββββββββββββ β
β β Browser renders FormTab β β
β β ββββββββββββββββββββββββββββββββ β β
β β β <form> β β β
β β β <input name="name" /> β β β
β β β <input name="description" β β β
β β β <button>Salvar</button> β β β
β β β <button>Cancelar</button> β β β
β β β </form> β β β
β β ββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββ β
β β
β Sidebar button "β New" now has active styling (green border) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ποΈ Arquitetura Backend: API β Databaseβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β {feature}Api.create(data) β β
β β β axios.post('/api/{feature}', data) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β HTTP POST /api/{feature}
β { name: "Test", ... }
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BACKEND - FastAPI β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β routes.py β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β @router.post("/") β β β
β β β async def create_item( β β β
β β β data: CreateItemDto, ββββββββββββββββββββββββββββΌβββΌββ Pydantic
β β β db: Session = Depends(get_db) β β validation
β β β ): β β β
β β β service = MyFeatureService(db) β β β
β β β return service.create(data) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β β calls service β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β service.py β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β class MyFeatureService: β β β
β β β def create(self, data: CreateItemDto): β β β
β β β item = MyFeatureItem(**data.dict()) β β β
β β β self.db.add(item) ββββββββββββββββββββββββββββββΌβββΌββ SQLAlchemy
β β β self.db.commit() β β ORM
β β β self.db.refresh(item) β β β
β β β return item β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β SQL INSERT INTO
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATABASE - PostgreSQL β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β {feature}_items table β β
β β ββββββ¬βββββββββ¬βββββββββββββββ¬βββββββββββββ¬ββββββββββββ β β
β β β id β name β description β status β created_atβ β β
β β ββββββΌβββββββββΌβββββββββββββββΌβββββββββββββΌββββββββββββ€ β β
β β β 1 β Test β Lorem ipsum β active β 2026-... β β ββ NEW ROW
β β ββββββ΄βββββββββ΄βββββββββββββββ΄βββββββββββββ΄ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β return ItemResponse
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BACKEND RESPONSE β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β HTTP 201 Created β β
β β { id: 1, name: "Test", status: "active", ... } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β axios resolves promise
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β const newItem = await api.create(data) β β
β β setItems(prev => [newItem, ...prev]) ββββββββββββββββββββΌββ State
β β setActiveRightId('list') β β updated
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β React re-renders
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β UI UPDATES β
β - FormTab unmounts β
β - ListTab renders β
β - New item appears at top of list β
β - Success toast: "Item criado com sucesso" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π¦ Estrutura de MΓ³dulos: DependΓͺnciasβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROJECT ROOT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β β
ββββββββ΄βββββββββ βββββββ΄βββββββ
β FRONTEND β β BACKEND β
βββββββββββββββββ ββββββββββββββ
β β
ββββββββ΄βββββββββββββββββ ββββββββ΄βββββββββββββββ
β β β β β β β β
βββββΌβββ βββΌββββ ββββΌβββ βββΌβββ ββββΌββββ βββΌββββ βββΌββββ ββββΌβββ
βpages β βcomp.β βserv.β βtypesβ βroutesβ βmodelsβ βschm.β βserv.β
ββββββββ βββββββ βββββββ βββββββ ββββββββ ββββββββ βββββββ βββββββ
β β β β β β β
βΌ βΌ β βΌ βΌ βΌ β
β β β β β β β
ββββββββββ΄ββββββββΌββββββββββββββββββββ β β β
β β β β
β β β β
ββββββββββββββββββββββββββββββ΄ββββββββ΄ββββββββ
β
βΌ
βββββββββββββββββ
β DATABASE β
β (PostgreSQL) β
βββββββββββββββββ
LEGENDA:
pages β Page Components (orquestradores)
comp. β Tab Components (puros)
serv. β API Clients (axios)
types β TypeScript interfaces
routes β FastAPI endpoints
models β SQLAlchemy models
schm. β Pydantic schemas
serv. β Business logic services
Regras de dependΓͺncia:
- β pages β components (pode importar)
- β pages β services (pode importar)
- β pages β types (pode importar)
- β components β pages (NUNCA importar)
- β components β services (NUNCA - recebe via props)
- β routes β service (pode importar)
- β service β models (pode importar)
- β routes β schemas (pode importar)
- β models β service (NUNCA - circular)
π¨ Layout Responsivo: Grid Systemβ
Desktop (β₯1280px)β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Header β
ββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββ€
β β β
β Content Area β Sidebar β
β (Tabs render) β (320px) β
β β β
β [1fr] β [320px] β
β β β
β {activeRightId === 'list' && <ListTab/>} β βββββββββββββ β
β β β π List β β
β β βββββββββββββ€ β
β β β β New β β
β β βββββββββββββ€ β
β β β π Stats β β
β β βββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββ
Grid: xl:grid-cols-[1fr_320px]
Gap: gap-6 (24px)
Tablet (768px - 1279px)β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Header β
ββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββ€
β β β
β Content Area β Sidebar β
β (Tabs render) β (280px) β
β β β
β [1fr] β [280px] β
β β β
β β Buttons β
β β stacked β
β β β
ββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββ
Grid: md:grid-cols-[1fr_280px]
Mobile (<768px)β
ββββββββββββββββββββββββββββββββββββ
β Header β
ββββββββββββββββββββββββββββββββββββ€
β Sidebar (Full Width) β
β ββββββ¬βββββ¬βββββ¬βββββββββββββ β
β βπ ββ βπ ββοΈ β β β Horizontal scroll
β βListβNew βStatβSettings β β
β ββββββ΄βββββ΄βββββ΄βββββββββββββ β
ββββββββββββββββββββββββββββββββββββ€
β β
β Content Area β
β (Full Width) β
β β
β {activeRightId === 'list' && β
β <ListTab />} β
β β
β β
ββββββββββββββββββββββββββββββββββββ
Grid: grid-cols-1
Sidebar: Horizontal scrollable buttons strip
π¦ Estado do BotΓ£o: Visual Feedbackβ
BotΓ£o Inativo (default)β
βββββββββββββββββββββββββββββββββββ
β π Listar β β bg-slate-800/30
β β border-slate-700/30
βββββββββββββββββββββββββββββββββββ text-slate-400
BotΓ£o Hover (mouse over)β
βββββββββββββββββββββββββββββββββββ
β π Listar β β bg-slate-800/50 (lighter)
β β cursor-pointer
βββββββββββββββββββββββββββββββββββ transition smooth
BotΓ£o Ativo (selected)β
βββββββββββββββββββββββββββββββββββ
β π Listar β β bg-blue-500/20
β β border-blue-500/50
βββββββββββββββββββββββββββββββββββ text-blue-400
β² glow effect
βββ activeRightId === 'list'
CΓ³digo:
className={`
w-full flex items-center gap-3 px-4 py-3 rounded-lg
transition-all duration-200 border
${activeRightId === item.id
? `bg-${item.color}-500/20 border-${item.color}-500/50 text-${item.color}-400`
: 'bg-slate-800/30 border-slate-700/30 text-slate-400 hover:bg-slate-800/50'
}
`}
π Ciclo de Vida Completo: Create β Listβ
T0: User estΓ‘ em ListTab
ββββββββββββββββββββββββββββββββββ
β activeRightId = 'list' β
β items = [existing items...] β
ββββββββββββββββββββββββββββββββββ
T1: User clica "β New"
ββββββββββββββββββββββββββββββββββ
β onRightSelect('new') called β
β β handleRightMenuSelect('new') β
β β setActiveRightId('new') β
ββββββββββββββββββββββββββββββββββ
T2: React re-renders
ββββββββββββββββββββββββββββββββββ
β activeRightId = 'new' β
β FormTab renders β
β ListTab unmounts β
ββββββββββββββββββββββββββββββββββ
T3: User fills form & submits
ββββββββββββββββββββββββββββββββββ
β onSubmit(data) called β
β β handleCreate(data) β
β β api.create(data) β
ββββββββββββββββββββββββββββββββββ
T4: API call in progress
ββββββββββββββββββββββββββββββββββ
β setLoading(true) β
β Button disabled β
β Spinner shows β
ββββββββββββββββββββββββββββββββββ
T5: API responds 201
ββββββββββββββββββββββββββββββββββ
β const newItem = response.data β
β setItems([newItem, ...prev]) β
β setActiveRightId('list') β
β setLoading(false) β
ββββββββββββββββββββββββββββββββββ
T6: React re-renders
ββββββββββββββββββββββββββββββββββ
β activeRightId = 'list' β
β items = [newItem, ...existing] β
β ListTab renders β
β FormTab unmounts β
β Toast: "Criado com sucesso" β
ββββββββββββββββββββββββββββββββββ
T7: User sees updated list
ββββββββββββββββββββββββββββββββββ
β New item appears at top β
β Success feedback visible β
β "β New" button inactive β
β "π List" button active β
ββββββββββββββββββββββββββββββββββ
π― Este diagrama deve ser referΓͺncia visual ao implementar novas features.
Para cΓ³digo detalhado e templates, consultar: