docs: private void initGraphics() {
          // Set initial size
          if (Double.compare(gauge.getPrefWidth(), 0.0) <= 0 || Double.compare(gauge.getPrefHeight(), 0.0) <= 0 ||
              Double.compare(gauge.getWidth(), 0.0) <= 0 || Double.compare(gauge.getHeight(), 0.0) <= 0) {
              if (gauge.getPrefWidth() > 0 && gauge.getPrefHeight() > 0) {
                  gauge.setPrefSize(gauge.getPrefWidth(), gauge.getPrefHeight());
              } else {
                  gauge.setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
              }
          }
  
          backgroundInnerShadow = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(10, 10, 10, 0.45), 8, 0.0, 8.0, 0.0);
  
          sectionsAndAreasCanvas = new Canvas();
          sectionsAndAreasCtx    = sectionsAndAreasCanvas.getGraphicsContext2D();
  
          tickMarkCanvas = new Canvas();
          tickMarkCtx    = tickMarkCanvas.getGraphicsContext2D();
  
          ledCanvas = new Canvas();
          ledCtx    = ledCanvas.getGraphicsContext2D();
          Helper.enableNode(ledCanvas, gauge.isLedVisible());
  
          thresholdTooltip = new Tooltip("Threshold\n(" + String.format(locale, formatString, gauge.getThreshold()) + ")");
          thresholdTooltip.setTextAlignment(TextAlignment.CENTER);
  
          threshold = new Path();
          Helper.enableNode(threshold, gauge.isThresholdVisible());
          Tooltip.install(threshold, thresholdTooltip);
  
          average = new Path();
          Helper.enableNode(average, gauge.isAverageVisible());
  
          markerPane = new Pane();
  
          lcd = new Rectangle(0.3 * PREFERRED_WIDTH, 0.014 * PREFERRED_HEIGHT);
          lcd.setArcWidth(0.0125 * PREFERRED_HEIGHT);
          lcd.setArcHeight(0.0125 * PREFERRED_HEIGHT);
          lcd.relocate((PREFERRED_WIDTH - lcd.getWidth()) * 0.5, 0.44 * PREFERRED_HEIGHT);
          Helper.enableNode(lcd, gauge.isLcdVisible() && gauge.isValueVisible());
  
          needleRotate = new Rotate(180 - startAngle);
          needleRotate.setAngle(needleRotate.getAngle() + (gauge.getValue() - oldValue - minValue) * angleStep);
          needle              = new Path();
          needle.setFillRule(FillRule.EVEN_ODD);
          needle.getTransforms().setAll(needleRotate);
          needle.setStrokeType(StrokeType.INSIDE);
          needle.setStroke(Color.TRANSPARENT);
  
          buttonTooltip    = new Tooltip();
          buttonTooltip.setTextAlignment(TextAlignment.CENTER);
  
          knobCanvas = new Canvas();
          knobCtx    = knobCanvas.getGraphicsContext2D();
          knobCanvas.setPickOnBounds(false);
          Helper.enableNode(knobCanvas, gauge.isKnobVisible());
  
          dropShadow = new DropShadow();
          dropShadow.setColor(Color.rgb(0, 0, 0, 0.25));
          dropShadow.setBlurType(BlurType.TWO_PASS_BOX);
          dropShadow.setRadius(0.015 * PREFERRED_WIDTH);
          dropShadow.setOffsetY(0.015 * PREFERRED_WIDTH);
  
          shadowGroup = new Group(needle, knobCanvas);
          shadowGroup.setEffect(gauge.isShadowsEnabled() ? dropShadow : null);
  
          titleText = new Text(gauge.getTitle());
          titleText.setTextOrigin(VPos.CENTER);
          titleText.setMouseTransparent(true);
          Helper.enableNode(titleText, !gauge.getTitle().isEmpty());
  
          subTitleText = new Text(gauge.getSubTitle());
          subTitleText.setTextOrigin(VPos.CENTER);
          subTitleText.setMouseTransparent(true);
          Helper.enableNode(subTitleText, !gauge.getSubTitle().isEmpty());
  
          unitText = new Text(gauge.getUnit());
          unitText.setMouseTransparent(true);
          unitText.setTextOrigin(VPos.CENTER);
          unitText.setMouseTransparent(true);
          Helper.enableNode(unitText, !gauge.getUnit().isEmpty());
  
          valueText = new Text(formatNumber(gauge.getLocale(), gauge.getFormatString(), gauge.getDecimals(), gauge.getCurrentValue()));
          valueText.setMouseTransparent(true);
          valueText.setTextOrigin(VPos.CENTER);
          valueText.setMouseTransparent(true);
          Helper.enableNode(valueText, gauge.isValueVisible());
  
          // Set initial value
          double targetAngle = 180 - startAngle + (gauge.getCurrentValue() - minValue) * angleStep;
          targetAngle        = Helper.clamp(180 - startAngle, 180 - startAngle + angleRange, targetAngle);
          needleRotate.setAngle(targetAngle);
  
          rotateNeedle(gauge.getCurrentValue());
  
          // Add all nodes
          pane = new Pane(sectionsAndAreasCanvas,
                          tickMarkCanvas,
                          markerPane,
                          ledCanvas,
                          lcd,
                          titleText,
                          subTitleText,
                          unitText,
                          valueText,
                          shadowGroup);
          pane.setBorder(new Border(new BorderStroke(gauge.getBorderPaint(), BorderStrokeStyle.SOLID, new CornerRadii(1024), new BorderWidths(gauge.getBorderWidth()))));
          pane.setBackground(new Background(new BackgroundFill(gauge.getBackgroundPaint(), new CornerRadii(1024), Insets.EMPTY)));
  
          getChildren().setAll(pane);
      }