@@ -283,22 +283,25 @@ function generate() {
283283 pill ( EX , E2y , EW , EH , "LLM Providers" , C . slate , "OpenAI / Anthropic / Ollama" ) ;
284284 pill ( EX , E3y , EW , EH , "S3 / MinIO" , C . slate , "Artifact Storage" ) ;
285285
286- // ── External → API (horizontal elbows into left edge of API) ──
286+ // ── External → API ──
287+ // Route all external arrows BELOW the Frontend row so no edges cross nodes.
288+ // Each path: right from ext box → down to a channel below services → right to API bottom edge
287289 const extRight = EX + EW ;
288290 const apiLeft = s2x ;
291+ const channelX = s1x - 8 ; // just left of Frontend box
292+ const underRow = R1 + sH ; // bottom of service boxes
289293
290- // GitHub → API (straight horizontal — same Y as API row)
291- lineH ( extRight , E1y + EH / 2 , apiLeft , "Model fetch" , { color : C . slate . border , arrow : "both" } ) ;
294+ // GitHub → API: right to channel, down under Frontend, right to API bottom
295+ p . push ( `<path d="M${ extRight } ,${ E1y + EH / 2 } H${ channelX } V${ underRow + 6 } H${ a_cx - 15 } V${ underRow } " fill="none" stroke="${ C . slate . border } " stroke-width="1" marker-start="url(#ah-r)" marker-end="url(#ah)"/>` ) ;
296+ txt ( ( channelX + a_cx ) / 2 , underRow + 18 , "Model fetch" , { size : 8 , fill : TEXT_DIM } ) ;
292297
293- // LLM → API (elbow: goes right, up to API mid, then right into API)
294- const llmMidX = extRight + 30 ;
295- p . push ( `<path d="M${ extRight } ,${ E2y + EH / 2 } H${ llmMidX } V${ R1 + 20 } H${ apiLeft } " fill="none" stroke="${ C . slate . border } " stroke-width="1" marker-start="url(#ah-r)" marker-end="url(#ah)"/>` ) ;
296- txt ( llmMidX + 4 , R1 + 16 , "HTTPS" , { size : 8 , fill : TEXT_DIM , anchor : "start" } ) ;
298+ // LLM → API: right to channel, down under Frontend, right to API bottom
299+ p . push ( `<path d="M${ extRight } ,${ E2y + EH / 2 } H${ channelX - 8 } V${ underRow + 14 } H${ a_cx } V${ underRow } " fill="none" stroke="${ C . slate . border } " stroke-width="1" marker-start="url(#ah-r)" marker-end="url(#ah)"/>` ) ;
300+ txt ( ( channelX + a_cx ) / 2 , underRow + 26 , "HTTPS" , { size : 8 , fill : TEXT_DIM } ) ;
297301
298- // S3 → API (elbow: goes right, up to API bottom area, then right into API)
299- const s3MidX = extRight + 50 ;
300- p . push ( `<path d="M${ extRight } ,${ E3y + EH / 2 } H${ s3MidX } V${ R1 + 40 } H${ apiLeft } " fill="none" stroke="${ C . slate . border } " stroke-width="1" marker-start="url(#ah-r)" marker-end="url(#ah)"/>` ) ;
301- txt ( s3MidX + 4 , R1 + 36 , "Presigned URLs" , { size : 8 , fill : TEXT_DIM , anchor : "start" } ) ;
302+ // S3 → API: right to channel, down under Frontend, right to API bottom
303+ p . push ( `<path d="M${ extRight } ,${ E3y + EH / 2 } H${ channelX - 16 } V${ underRow + 22 } H${ a_cx + 15 } V${ underRow } " fill="none" stroke="${ C . slate . border } " stroke-width="1" marker-start="url(#ah-r)" marker-end="url(#ah)"/>` ) ;
304+ txt ( ( channelX + a_cx ) / 2 , underRow + 34 , "Presigned URLs" , { size : 8 , fill : TEXT_DIM } ) ;
302305
303306 // ═══════════════════════════════════════════════════════════════════
304307 // LEGEND (bottom)
0 commit comments