docs: @Override protected void initGraphics() {
          // Set initial size
          if (Double.compare(getSkinnable().getPrefWidth(), 0.0) <= 0 || Double.compare(getSkinnable().getPrefHeight(), 0.0) <= 0 ||
              Double.compare(getSkinnable().getWidth(), 0.0) <= 0 || Double.compare(getSkinnable().getHeight(), 0.0) <= 0) {
              if (getSkinnable().getPrefWidth() > 0 && getSkinnable().getPrefHeight() > 0) {
                  getSkinnable().setPrefSize(getSkinnable().getPrefWidth(), getSkinnable().getPrefHeight());
              } else {
                  getSkinnable().setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
              }
          }
  
          sectionsAndAreasCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
          sectionsAndAreasCtx    = sectionsAndAreasCanvas.getGraphicsContext2D();
  
          tickCanvas = new Canvas(PREFERRED_WIDTH, PREFERRED_HEIGHT);
          tickCtx    = tickCanvas.getGraphicsContext2D();
  
          alarmPane = new Pane();
  
          hour = new Rectangle(3, 60);
          hour.setArcHeight(3);
          hour.setArcWidth(3);
          hour.setStroke(getSkinnable().getHourColor());
          hour.getTransforms().setAll(hourRotate);
  
          minute = new Rectangle(3, 96);
          minute.setArcHeight(3);
          minute.setArcWidth(3);
          minute.setStroke(getSkinnable().getMinuteColor());
          minute.getTransforms().setAll(minuteRotate);
  
          second = new Rectangle(1, 96);
          second.setArcHeight(1);
          second.setArcWidth(1);
          second.setStroke(getSkinnable().getSecondColor());
          second.getTransforms().setAll(secondRotate);
          second.setVisible(getSkinnable().isSecondsVisible());
          second.setManaged(getSkinnable().isSecondsVisible());
  
          knob = new Circle(PREFERRED_WIDTH * 0.5, PREFERRED_HEIGHT * 0.5, 4.5);
          knob.setStroke(Color.web("#282a3280"));
  
          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);
  
          shadowGroupHour   = new Group(hour);
          shadowGroupMinute = new Group(minute);
          shadowGroupSecond = new Group(second, knob);
  
          shadowGroupHour.setEffect(getSkinnable().getShadowsEnabled() ? dropShadow : null);
          shadowGroupMinute.setEffect(getSkinnable().getShadowsEnabled() ? dropShadow : null);
          shadowGroupSecond.setEffect(getSkinnable().getShadowsEnabled() ? dropShadow : null);
  
          title = new Text("");
          title.setVisible(getSkinnable().isTitleVisible());
          title.setManaged(getSkinnable().isTitleVisible());
  
          dateText = new Text("");
          dateText.setVisible(getSkinnable().isDateVisible());
          dateText.setManaged(getSkinnable().isDateVisible());
  
          text = new Text("");
          text.setVisible(getSkinnable().isTextVisible());
          text.setManaged(getSkinnable().isTextVisible());
  
          pane = new Pane(sectionsAndAreasCanvas, tickCanvas, alarmPane, title, dateText, text, shadowGroupHour, shadowGroupMinute, shadowGroupSecond);
          pane.setBorder(new Border(new BorderStroke(getSkinnable().getBorderPaint(), BorderStrokeStyle.SOLID, new CornerRadii(1024), new BorderWidths(getSkinnable().getBorderWidth()))));
          pane.setBackground(new Background(new BackgroundFill(getSkinnable().getBackgroundPaint(), new CornerRadii(1024), Insets.EMPTY)));
  
          getChildren().setAll(pane);
      }