diff --git a/src/app/components/canvas/canvas.component.ts b/src/app/components/canvas/canvas.component.ts
index a7c1b1b34192d796966d18cd28d97fefbf55f97a..2035e886e543b1b0846c3e043fd0464a1c902f01 100644
--- a/src/app/components/canvas/canvas.component.ts
+++ b/src/app/components/canvas/canvas.component.ts
@@ -9,8 +9,6 @@ import { Component, Input, ViewChild, ElementRef, AfterViewInit } from "@angular
     `
 })
 export class CalcCanvasComponent implements AfterViewInit {
-    private _width = 300;
-    private _height = 200;
 
     public get width(): number {
         return this._calcCanvas.nativeElement.width;
@@ -18,7 +16,6 @@ export class CalcCanvasComponent implements AfterViewInit {
 
     @Input()
     public set width(w: number) {
-        this._width = w;
         this._calcCanvas.nativeElement.width = w;
     }
 
@@ -28,7 +25,6 @@ export class CalcCanvasComponent implements AfterViewInit {
 
     @Input()
     public set height(h: number) {
-        this._height = h;
         this._calcCanvas.nativeElement.height = h;
     }
 
@@ -39,11 +35,6 @@ export class CalcCanvasComponent implements AfterViewInit {
 
     ngAfterViewInit() { // wait for the view to init before using the element
         this._context2d = this._calcCanvas.nativeElement.getContext("2d");
-
-        // this._context2d.fillStyle = 'blue';
-        // this._context2d.fillRect(10, 10, 350, 350);
-
-        // this.drawRect(0, 0, this._width, this._height);
     }
 
     public clear() {
diff --git a/src/app/components/fixedvar-results/results.component.ts b/src/app/components/fixedvar-results/results.component.ts
index 748816761ac736744c73251c6b23bb3ab1c2afe6..1fae7bd065c9607d14d8e6dac77b6d438f2fa219 100644
--- a/src/app/components/fixedvar-results/results.component.ts
+++ b/src/app/components/fixedvar-results/results.component.ts
@@ -13,31 +13,39 @@ export class ResultsComponent {
     /** max number of decimals for auto-adjusting charts axis graduations */
     public static CHARTS_AXIS_PRECISION = 10;
 
+    public constructor() {
+        const sf = <Screenfull>screenfull;
+    }
+
     /** tracks the fullscreen state */
     public get isFullscreen() {
-        // return (document["fullscreenElement"] !== null);
         const sf = <Screenfull>screenfull;
         if (sf.enabled) {
             return sf.isFullscreen;
         }
     }
 
-    public setFullscreen(element) {
-        // element.requestFullscreen();
+    public setFullscreen(element): Promise<void> {
         const sf = <Screenfull>screenfull;
         if (sf.enabled) {
-            sf.request(element);
+            return sf.request(element).then(() => {
+                this.fullscreenChange(true);
+            });
         }
     }
 
-    public exitFullscreen() {
-        // document.exitFullscreen();
+    public exitFullscreen(): Promise<void> {
         const sf = <Screenfull>screenfull;
         if (sf.enabled) {
-            sf.exit();
+            return sf.exit().then(() => {
+                this.fullscreenChange(false);
+            });
         }
     }
 
+    /** called when fullscreen state changes */
+    public fullscreenChange(isFullscreen: boolean) { }
+
     /**
      * 14 distinct colors @see https://sashat.me/2017/01/11/list-of-20-simple-distinct-colors
      */
diff --git a/src/app/components/section-canvas/section-canvas.component.ts b/src/app/components/section-canvas/section-canvas.component.ts
index 94f4c3c5b029739e42f66b1802e4bc0652ea941e..928b98540b36bb4818256c81006d9fa3e11fdd63 100644
--- a/src/app/components/section-canvas/section-canvas.component.ts
+++ b/src/app/components/section-canvas/section-canvas.component.ts
@@ -16,24 +16,20 @@ import { CalcCanvasComponent } from "../canvas/canvas.component";
     `
 })
 export class SectionCanvasComponent {
-    /**
-     * taille (pixels) du canvas (c'est un carré)
-     */
-    private _size = 400;
 
-    /**
-     * marges gauche/droite pour le texte (pixels)
-     */
+    /** default square size, supposed to match device size (computed at contruct time) */
+    public originalSize: number;
+
+    /** taille (pixels) du canvas (c'est un carré) */
+    public size = 400;
+
+    /** marges gauche/droite pour le texte (pixels) */
     private _textMargin = 90;
 
-    /**
-     * marge basse (pixels)
-     */
+    /** marge basse (pixels) */
     private _bottomMargin = 5;
 
-    /**
-     * facteurs d'échelle (coordonnées en m <-> coordonnées en pixels)
-     */
+    /** facteurs d'échelle (coordonnées en m <-> coordonnées en pixels) */
     private _scaleX: number;
     private _scaleY: number;
 
@@ -59,12 +55,8 @@ export class SectionCanvasComponent {
     }
 
     private computeScale(maxWidth: number, maxHeight: number) {
-        this._scaleX = (this._size - 2 * this._textMargin) / maxWidth;
-        this._scaleY = (this._size - this._bottomMargin) / maxHeight;
-    }
-
-    public get size() {
-        return this._size;
+        this._scaleX = (this.size - 2 * this._textMargin) / maxWidth;
+        this._scaleY = (this.size - this._bottomMargin) / maxHeight;
     }
 
     /**
@@ -78,7 +70,7 @@ export class SectionCanvasComponent {
      * convertit une ordonnée en m en pixels
      */
     private Ym2pix(y: number) {
-        return this._size - this._bottomMargin - y * this._scaleY;
+        return this.size - this._bottomMargin - y * this._scaleY;
     }
 
     public addLevel(val: number, label: string, rgb: {}) {
@@ -351,7 +343,8 @@ export class SectionCanvasComponent {
         this._calcCanvas.drawRect(0, 0, this._calcCanvas.width, this._calcCanvas.height);
     }
 
-    private draw() {
+    public draw() {
+        // console.log(">> redrawing at size", this.size);
         this.sortLevels();
         this.drawFrame();
         const maxWidth = this.drawSection();
diff --git a/src/app/components/section-results/section-results.component.ts b/src/app/components/section-results/section-results.component.ts
index ce16f3b7a88bb7ce666e90b02f825438ed7a36a4..e3aeb50834cf1d043ff584296c3fe066686102a5 100644
--- a/src/app/components/section-results/section-results.component.ts
+++ b/src/app/components/section-results/section-results.component.ts
@@ -1,4 +1,4 @@
-import { Component, ViewChild, DoCheck } from "@angular/core";
+import { Component, ViewChild, DoCheck, ElementRef } from "@angular/core";
 
 import { ResultElement } from "jalhyd";
 
@@ -18,7 +18,8 @@ import { I18nService } from "../../services/internationalisation.service";
 export class SectionResultsComponent extends ResultsComponent implements DoCheck {
 
     constructor(
-        private intlService: I18nService
+        private intlService: I18nService,
+        private element: ElementRef,
     ) {
         super();
     }
@@ -55,6 +56,9 @@ export class SectionResultsComponent extends ResultsComponent implements DoCheck
         "Yco": { r: 255, g: 0, b: 255 },
     };
 
+    /** hardcoded bullet-proof default canvas size **/
+    private previousContainerSize = 400;
+
     /**  résultats non mis en forme */
     private _results: SectionResults;
 
@@ -97,10 +101,19 @@ export class SectionResultsComponent extends ResultsComponent implements DoCheck
     }
 
     private updateResults() {
+        console.log("UPDATE RESULTS");
         if (this._results && this._sectionCanvas) {
 
             this._resultElement = new ResultElement();
 
+            // compute canvas optimal size the first time
+            if (this._sectionCanvas.originalSize === undefined) {
+                const container = this.element.nativeElement.querySelector(".section-results-container");
+                const size = Math.min(container.offsetWidth, container.offsetHeight);
+                this._sectionCanvas.originalSize = size - 17; // 417 - 17 = 400
+                this._sectionCanvas.size = this._sectionCanvas.originalSize;
+            }
+
             // traduction des symboles des variables calculées
             const re = this._results.result.resultElement;
             for (const k in re.values) {
@@ -115,7 +128,11 @@ export class SectionResultsComponent extends ResultsComponent implements DoCheck
                 }
             }
 
-            this._sectionCanvas.section = this._results.section;
+            // wait just a little to draw, in case this._sectionCanvas.size was changed above (1st run)
+            setTimeout(() => {
+                this._sectionCanvas.section = this._results.section;
+            }, 100);
+
             return true;
         }
         return false;
@@ -133,6 +150,31 @@ export class SectionResultsComponent extends ResultsComponent implements DoCheck
         }); // defaults to image/png
     }
 
+    /** redraw canvas on fullscreen state change (scale drawing) */
+    public fullscreenChange(isFullscreen: boolean) {
+        this._sectionCanvas.size = this.getContainerSize(! isFullscreen);
+        this.previousContainerSize = this._sectionCanvas.size;
+        setTimeout(() => {
+            this._sectionCanvas.draw();
+        }, 100);
+    }
+
+    private getContainerSize(useOriginalSize: boolean = false): number {
+        const container = this.element.nativeElement.querySelector(".section-results-container");
+        let size: number;
+        if (container) {
+            size = Math.min(container.offsetWidth, container.offsetHeight);
+        } else {
+            size = this.previousContainerSize;
+        }
+        // when going back from fullscreen mode, container size tends to be
+        // too high for whatever reason; use originalSize on this purpose
+        if (useOriginalSize) {
+            size = Math.min(size, this._sectionCanvas.originalSize);
+        }
+        return size;
+    }
+
     public get uitextExportImageTitle() {
         return this.intlService.localizeText("INFO_GRAPH_BUTTON_TITLE_EXPORT_IMAGE");
     }