Architettura www.novelli.me
Diagrammi UML generati con Mermaid.js che illustrano l'architettura del Virtual Desktop Site (VDS) Framework.
1. Architettura di Sistema (Component Diagram)
Interazione tra componenti: build statico Jekyll ↔ runtime VDS nel browser con AI locale
flowchart TB
subgraph SSB["Server-Side / Build Time"]
MD[Markdown Content]
Layouts[Liquid Layouts]
Jekyll[Jekyll Engine]
Assets[Static Assets]
MD --> Jekyll
Layouts --> Jekyll
Jekyll --> Assets
end
subgraph CSR["Client-Side / Runtime (Browser)"]
Boot[Boot Loader]
VDS[Virtual Desktop System]
DOM[DOM Interface]
LS[Local Storage]
AI_Local[AI Engine\nLocal/WASM]
Boot --> VDS
VDS --> DOM
VDS --> LS
VDS --> AI_Local
end
subgraph EXT["External Services"]
GH_API[GitHub API]
end
Assets -.->|HTTP| Boot
VDS -->|Blog Editor| GH_API
2. VDS Core - Class Diagram
Struttura modulare del "sistema operativo" nel browser
classDiagram
direction TB
class Boot {
+init()
+loadConfig()
}
class WindowManager {
-windows Array
-zIndexCounter int
+openWindow(id, content)
+closeWindow(id)
+minimizeWindow(id)
+bringToFront(id)
+tileWindows()
}
class DesktopRenderer {
+renderIcons(config)
+renderWallpaper()
+updateTheme()
}
class TaskbarManager {
+addTaskbarItem(windowId)
+removeTaskbarItem(windowId)
+updateClock()
+toggleStartMenu()
}
class NavigationHandler {
+handleURLChange()
+pushState(url)
+parseDeepLinks()
}
class DraggableMixin {
+makeDraggable(element)
}
class ResizableMixin {
+makeResizable(element)
}
Boot --> DesktopRenderer : Setup UI
Boot --> WindowManager : Init
Boot --> NavigationHandler : Routing
Boot --> TaskbarManager : Init
WindowManager --> TaskbarManager : Sync State
WindowManager ..> DraggableMixin : Uses
WindowManager ..> ResizableMixin : Uses
NavigationHandler --> WindowManager : Open Deep Link
3. Sequence Diagram: Avvio e Apertura Finestra
Flusso dall'apertura della pagina alla visualizzazione di una Pergamena
sequenceDiagram
actor User
participant Browser
participant Boot as core/boot.js
participant Nav as NavigationHandler
participant WM as WindowManager
participant DOM
User->>Browser: Apre URL (es. /blog/post-1)
Browser->>Boot: window.onload
Boot->>Boot: checkBrowserCompatibility()
Boot->>DOM: Render Desktop e Taskbar
Boot->>Nav: handleInitialState()
rect rgb(230, 240, 255)
Note right of Nav: Deep Linking Logic
Nav->>Nav: Parse URL for Content ID
Nav->>WM: openWindow('post-1', 'parchment')
end
WM->>DOM: Crea Elemento Finestra
WM->>DOM: Fetch Contenuto (AJAX/Fetch)
DOM-->>WM: Ritorna HTML Parziale
WM->>DOM: Inietta HTML nel Body della Finestra
WM->>DOM: Applica Draggable e Resizable
WM->>DOM: set z-index (Bring to Front)
WM-->>User: Visualizza Finestra
4. Blog Editor - Class Diagram
Sottosistema per modifica post e commit su GitHub
classDiagram
class EditorApp {
+init()
+loadPost(path)
+savePost()
}
class EditorUI {
+renderToolbar()
+renderMarkdownPreview()
+toggleSplitView()
+showStatus(msg)
}
class GitHubOAuth {
-clientId string
-token string
+login()
+logout()
+handleCallback()
+isAuthenticated()
}
class GitHubAPI {
-repo string
-branch string
+getFile(path)
+createBlob(content)
+createTree()
+createCommit()
+updateRef()
}
EditorApp --> EditorUI : Manages
EditorApp --> GitHubOAuth : Auth
EditorApp --> GitHubAPI : Data Persistence
GitHubAPI ..> GitHubOAuth : Uses Token
5. AI Assistant (Local RAG) - State Diagram
Pipeline AI locale/in-browser senza dipendenze API esterne
stateDiagram-v2
[*] --> Idle
Idle --> UserInput : User asks question
UserInput --> BrowserCheck : Validate
BrowserCheck --> Embedding : WebGPU/WASM OK
note right of Embedding : Local Model
Embedding --> Retrieval : Query Embedding Generated
note right of Retrieval
Vector Search in
media.json / chunks
end note
Retrieval --> Context : Top-K Chunks Selected
Context --> Inference : Process Prompt + Context
Inference --> Streaming : Stream Tokens to UI
Streaming --> Idle : Complete
6. Window Lifecycle - State Diagram
Stati e transizioni di una singola finestra gestita da windowManager.js
stateDiagram-v2
[*] --> Closed
state Open {
[*] --> Background
state Focused {
[*] --> IdleFocus
IdleFocus --> Dragging : Mouse Down Header
Dragging --> IdleFocus : Mouse Up
IdleFocus --> Resizing : Mouse Down Border
Resizing --> IdleFocus : Mouse Up
}
Background --> Focused : Click / Focus
Focused --> Background : Blur / Click other
}
state Minimized
Closed --> Open : openWindow()
Open --> Minimized : minimizeWindow()
Open --> Closed : closeWindow()
Minimized --> Open : restoreWindow()
note right of Focused : z-index più alto
7. Deployment Infrastructure
Distribuzione del codice: Dev → GitHub Actions CI/CD → GitHub Pages
flowchart LR
subgraph Dev["💻 Developer Environment"]
Code[VS Code / Local Git]
LocalPreview[Local Jekyll Serve]
Code --> LocalPreview
end
subgraph GitHub["☁️ GitHub Ecosystem"]
Repo[Git Repository]
subgraph Actions["⚙️ GitHub Actions"]
TestUnit[Unit Tests]
TestE2E[E2E Tests]
Build[Jekyll Build]
end
Pages[GitHub Pages]
end
subgraph Client["📱 User Device"]
Browser[Browser]
end
Code -->|Push| Repo
Repo --> TestUnit
Repo --> TestE2E
TestUnit --> Build
TestE2E --> Build
Build -->|Deploy| Pages
Pages -->|HTTPS| Browser
8. Snake Game Loop - Sequence Diagram
Loop di gioco real-time per l'applicazione Snake nel VDS
sequenceDiagram
participant User
participant DOM
participant Snake as snake.js
participant GameLoop as Game Loop
User->>DOM: Apre Snake App
DOM->>Snake: init()
Snake->>Snake: setupCanvas()
Snake->>GameLoop: setInterval(gameLoop, speed)
loop Every Tick 100ms
GameLoop->>Snake: update()
activate Snake
Snake->>Snake: handleInput(direction)
Snake->>Snake: moveSnake()
alt Collision Wall or Self
Snake->>Snake: gameOver()
Snake->>GameLoop: clearInterval()
Snake-->>User: Show Game Over
else Ate Food
Snake->>Snake: grow()
Snake->>Snake: spawnFood()
Snake->>DOM: Update Score
end
Snake->>Snake: draw()
Snake->>DOM: Render Canvas
deactivate Snake
end