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);
              }
          }
  
          innerShadow0 = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(0, 0, 0, 0.65), 1, 0, 0, 1);
  
          innerShadow1 = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(255, 255, 255, 0.65), 1, 0, 0, -1);
          innerShadow1.setInput(innerShadow0);
  
          background = new Circle(PREFERRED_WIDTH * 0.5, PREFERRED_HEIGHT * 0.5, PREFERRED_WIDTH * 0.5);
          background.setFill(Color.rgb(32, 32, 32));
          background.setStroke(null);
          background.setEffect(innerShadow1);
  
          innerShadow2 = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(255, 255, 255, 0.65), 1, 0, 0, 1);
  
          innerShadow3 = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(0, 0, 0, 0.65), 1, 0, 0, -1);
          innerShadow3.setInput(innerShadow2);
  
          dropShadow4 = new DropShadow();
          dropShadow4.setBlurType(BlurType.TWO_PASS_BOX);
          dropShadow4.setColor(Color.rgb(0, 0, 0, 0.65));
          dropShadow4.setOffsetX(0);
          dropShadow4.setInput(innerShadow3);
  
          mask = new Path();
          mask.setFillRule(FillRule.EVEN_ODD);
          mask.setFill(Color.rgb(32, 32, 32));
          mask.setStroke(null);
          mask.setEffect(dropShadow4);
  
          needleRotate = new Rotate(180 - START_ANGLE);
  
          double targetAngle = 180 - START_ANGLE + (gauge.getCurrentValue() - gauge.getMinValue()) * angleStep;
          needleRotate.setAngle(Helper.clamp(180 - START_ANGLE, 180 - START_ANGLE + ANGLE_RANGE, targetAngle));
  
          glow1   = new DropShadow(BlurType.TWO_PASS_BOX, barColor, 0.085 * PREFERRED_WIDTH, 0, 0, 0);
          glow2   = new DropShadow(BlurType.TWO_PASS_BOX, barColor, 0.085 * PREFERRED_WIDTH, 0, 0, 0);
          bigGlow = new DropShadow(BlurType.TWO_PASS_BOX, barColor, 0.25 * PREFERRED_WIDTH, 0, 0, 0);
  
          needleMoveTo1       = new MoveTo();
          needleCubicCurveTo2 = new CubicCurveTo();
          needleCubicCurveTo3 = new CubicCurveTo();
          needleCubicCurveTo4 = new CubicCurveTo();
          needleLineTo5       = new LineTo();
          needleLineTo6       = new LineTo();
          needleLineTo7       = new LineTo();
          needleLineTo8       = new LineTo();
          needleClosePath9    = new ClosePath();
          needle              = new Path(needleMoveTo1, needleCubicCurveTo2, needleCubicCurveTo3, needleCubicCurveTo4,
                                         needleLineTo5, needleLineTo6, needleLineTo7, needleLineTo8, needleClosePath9);
          needle.setFillRule(FillRule.EVEN_ODD);
          needle.setEffect(glow1);
  
          needle.getTransforms().setAll(needleRotate);
          needle.setFill(gauge.getNeedleColor());
          needle.setStroke(null);
          needle.setStrokeLineCap(StrokeLineCap.ROUND);
          needle.setStrokeLineJoin(StrokeLineJoin.BEVEL);
  
          mainCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
          mainCtx    = mainCanvas.getGraphicsContext2D();
  
          tickMarkCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
          tickMarkCtx    = tickMarkCanvas.getGraphicsContext2D();
  
          centerKnob = new Circle(0.5 * PREFERRED_WIDTH, 0.5 * PREFERRED_HEIGHT, 0.22916667 * PREFERRED_WIDTH);
          centerKnob.setPickOnBounds(false);
  
          titleText = new Text(gauge.getTitle());
          titleText.setTextOrigin(VPos.CENTER);
          titleText.setFill(gauge.getTitleColor());
          titleText.setEffect(glow1);
          titleText.setMouseTransparent(true);
          Helper.enableNode(titleText, !gauge.getTitle().isEmpty());
  
          subTitleText = new Text(gauge.getSubTitle());
          subTitleText.setTextOrigin(VPos.CENTER);
          subTitleText.setFill(gauge.getSubTitleColor());
          subTitleText.setEffect(glow1);
          subTitleText.setMouseTransparent(true);
          Helper.enableNode(subTitleText, !gauge.getSubTitle().isEmpty());
  
          unitText = new Text(gauge.getUnit());
          unitText.setTextOrigin(VPos.CENTER);
          unitText.setFill(gauge.getUnitColor());
          unitText.setEffect(glow1);
          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.setFill(gauge.getValueColor());
          valueText.setEffect(bigGlow);
          Helper.enableNode(valueText, gauge.isValueVisible());
  
          // Add all nodes
          pane = new Pane(background,
                          mainCanvas,
                          tickMarkCanvas,
                          mask,
                          needle,
                          centerKnob,
                          titleText,
                          subTitleText,
                          unitText,
                          valueText);
  
          getChildren().setAll(pane);
      }