2626 </ script >
2727 < style >
2828 /* ==========================================================
29- THEME VARIABLES - switch by toggling [data-theme] on <html>
30- ========================================================== */
29+ THEME VARIABLES - switch by toggling [data-theme] on <html>
30+ ========================================================== */
3131 : root ,
3232 [data-theme = "dark" ] {
3333 --bg : # 020617 ;
4747 --arrow-emphasis : # 34d399 ;
4848
4949 /* Opaque mask color used behind semi-transparent component fills
50- so the arrows drawn underneath are properly hidden. */
50+ so the arrows drawn underneath are properly hidden. */
5151 --mask : # 0f172a ;
5252
5353 --frontend-fill : rgba (8 , 51 , 68 , 0.4 );
226226 }
227227
228228 /* ==========================================================
229- Print stylesheet - hide interactive controls, force light,
230- drop the grid so the diagram doesn't waste ink, use landscape
231- so wide diagrams fit, pack summary cards into 2 columns to
232- avoid an orphan card on a trailing page.
233- ========================================================== */
229+ Print stylesheet - hide interactive controls, force light,
230+ drop the grid so the diagram doesn't waste ink, use landscape
231+ so wide diagrams fit, pack summary cards into 2 columns to
232+ avoid an orphan card on a trailing page.
233+ ========================================================== */
234234 @page { size : landscape; margin : 1.5cm ; }
235235
236236 @media print {
237237 /* Force the FULL light palette - including component fills/strokes and
238- lane/arrow colors - so printing from dark theme doesn't put neon
239- strokes and translucent dark fills on white paper. */
238+ lane/arrow colors - so printing from dark theme doesn't put neon
239+ strokes and translucent dark fills on white paper. */
240240 : root , [data-theme = "dark" ], [data-theme = "light" ] {
241241 --bg : # ffffff ;
242242 --grid : transparent;
278278 }
279279
280280 /* ==========================================================
281- TOOLBAR (theme toggle + export menu)
282- ========================================================== */
281+ TOOLBAR (theme toggle + export menu)
282+ ========================================================== */
283283 .toolbar {
284284 position : fixed;
285285 top : 1rem ;
405405 }
406406
407407 /* ==========================================================
408- SVG SEMANTIC CLASSES - use these instead of inline fill/stroke
409- ========================================================== */
408+ SVG SEMANTIC CLASSES - use these instead of inline fill/stroke
409+ ========================================================== */
410410 .c-grid { stroke : var (--grid ); fill : none; }
411411 .c-mask { fill : var (--mask ); stroke : none; }
412412
448448 .c-lane { fill : var (--lane-fill ); stroke : var (--lane-stroke ); stroke-dasharray : 6 , 6 ; }
449449
450450 /* Optional trace animation, enabled only by meta.animation = "trace".
451- Static diagrams do not carry data-animation and render exactly as before. */
451+ Static diagrams do not carry data-animation and render exactly as before. */
452452 svg [data-animation = "trace" ] [data-animate = "edge" ] {
453453 stroke-dasharray : 10 8 ;
454454 stroke-dashoffset : 54 ;
481481</ head >
482482< body >
483483 <!-- Toolbar: theme toggle + export menu (present on every generated diagram)
484- Keyboard: T toggles theme, E opens export menu (when no input focused) -->
484+ Keyboard: T toggles theme, E opens export menu (when no input focused) -->
485485 < div class ="toolbar " role ="toolbar " aria-label ="Diagram actions ">
486486 < button id ="btn-theme " type ="button "
487487 title ="Toggle theme (T) "
@@ -694,7 +694,7 @@ <h3>Data and async work</h3>
694694
695695 < div class ="card ">
696696 < div class ="card-header ">
697- < div class ="card-dot amber "> </ div >
697+ < div class ="amber card-dot "> </ div >
698698 < h3 > Operations</ h3 >
699699 </ div >
700700 < ul >
@@ -712,8 +712,8 @@ <h3>Operations</h3>
712712
713713 < script >
714714 /* ============================================================
715- Theme toggle - persists to localStorage, respects system pref
716- ============================================================ */
715+ Theme toggle - persists to localStorage, respects system pref
716+ ============================================================ */
717717 var TechnicalDiagram = { } ;
718718
719719 TechnicalDiagram . theme = ( function ( ) {
@@ -780,17 +780,17 @@ <h3>Operations</h3>
780780 } ) ( ) ;
781781
782782 /* ============================================================
783- Export - PNG / JPEG / WebP / SVG (download) and Copy PNG (clipboard)
783+ Export - PNG / JPEG / WebP / SVG (download) and Copy PNG (clipboard)
784784
785- Raster exports are always rendered at 4x source resolution for
786- maximum sharpness. The trick: we set the serialized SVG's
787- `width`/`height` to viewBox * 4 so the browser rasterizes the
788- vectors at that resolution natively. drawImage then draws at
789- the image's natural size (no upscaling = no blur).
785+ Raster exports are always rendered at 4x source resolution for
786+ maximum sharpness. The trick: we set the serialized SVG's
787+ `width`/`height` to viewBox * 4 so the browser rasterizes the
788+ vectors at that resolution natively. drawImage then draws at
789+ the image's natural size (no upscaling = no blur).
790790
791- JPEG/WebP paint the current theme's background explicitly since
792- those formats have no alpha channel.
793- ============================================================ */
791+ JPEG/WebP paint the current theme's background explicitly since
792+ those formats have no alpha channel.
793+ ============================================================ */
794794 ( function ( ) {
795795 var RASTER_SCALE = 4 ;
796796
@@ -898,7 +898,7 @@ <h3>Operations</h3>
898898 // serialized SVG, so url()-sourced faces would just hang.
899899 var fontFallback = [ 400 , 500 , 600 , 700 ] . map ( function ( w ) {
900900 return "@font-face { font-family: 'JetBrains Mono'; font-weight: " + w +
901- "; src: local('JetBrains Mono'), local('JetBrainsMono-Regular'); }" ;
901+ "; src: local('JetBrains Mono'), local('JetBrainsMono-Regular'); }" ;
902902 } ) . join ( '\n' ) ;
903903
904904 var style = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'style' ) ;
@@ -1013,7 +1013,7 @@ <h3>Operations</h3>
10131013 ctx . drawImage ( img , 0 , 0 ) ;
10141014 URL . revokeObjectURL ( svgUrl ) ;
10151015 var mime = format === 'jpeg' ? 'image/jpeg' :
1016- format === 'webp' ? 'image/webp' : 'image/png' ;
1016+ format === 'webp' ? 'image/webp' : 'image/png' ;
10171017 var quality = format === 'png' ? undefined : 0.95 ;
10181018 canvas . toBlob ( function ( blob ) {
10191019 if ( ! blob ) reject ( new Error ( 'toBlob returned null for ' + format ) ) ;
@@ -1037,8 +1037,8 @@ <h3>Operations</h3>
10371037 // ---- Clipboard support ----------------------------------------------
10381038 function canCopyImage ( ) {
10391039 return typeof ClipboardItem !== 'undefined' &&
1040- navigator . clipboard &&
1041- typeof navigator . clipboard . write === 'function' ;
1040+ navigator . clipboard &&
1041+ typeof navigator . clipboard . write === 'function' ;
10421042 }
10431043
10441044 // ---- Raster format detection ----------------------------------------
@@ -1218,11 +1218,11 @@ <h3>Operations</h3>
12181218 } ) ( ) ;
12191219
12201220 /* ============================================================
1221- Global keyboard shortcuts
1222- T -> toggle theme
1223- E -> open export menu
1224- Ignored when focus is inside an input/textarea/contenteditable.
1225- ============================================================ */
1221+ Global keyboard shortcuts
1222+ T -> toggle theme
1223+ E -> open export menu
1224+ Ignored when focus is inside an input/textarea/contenteditable.
1225+ ============================================================ */
12261226 document . addEventListener ( 'keydown' , function ( e ) {
12271227 if ( e . metaKey || e . ctrlKey || e . altKey ) return ;
12281228 var t = e . target ;
0 commit comments