docs: @Override protected void initGraphics() {
          // Set initial size
          if (Double.compare(clock.getPrefWidth(), 0.0) <= 0 || Double.compare(clock.getPrefHeight(), 0.0) <= 0 ||
              Double.compare(clock.getWidth(), 0.0) <= 0 || Double.compare(clock.getHeight(), 0.0) <= 0) {
              if (clock.getPrefWidth() > 0 && clock.getPrefHeight() > 0) {
                  clock.setPrefSize(clock.getPrefWidth(), clock.getPrefHeight());
              } else {
                  clock.setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
              }
          }
  
          minuteTickMarks = new Path();
          minuteTickMarks.setFillRule(FillRule.EVEN_ODD);
          minuteTickMarks.setFill(null);
          minuteTickMarks.setStroke(clock.getMinuteColor());
          minuteTickMarks.setStrokeLineCap(StrokeLineCap.ROUND);
  
          hourTickMarks = new Path();
          hourTickMarks.setFillRule(FillRule.EVEN_ODD);
          hourTickMarks.setFill(null);
          hourTickMarks.setStroke(clock.getHourColor());
          hourTickMarks.setStrokeLineCap(StrokeLineCap.ROUND);
  
          hour = new Rectangle(3, 60);
          hour.setArcHeight(3);
          hour.setArcWidth(3);
          hour.setStroke(clock.getHourColor());
          hour.getTransforms().setAll(hourRotate);
  
          minute = new Rectangle(3, 96);
          minute.setArcHeight(3);
          minute.setArcWidth(3);
          minute.setStroke(clock.getMinuteColor());
          minute.getTransforms().setAll(minuteRotate);
  
          second = new Rectangle(1, 96);
          second.setArcHeight(1);
          second.setArcWidth(1);
          second.setStroke(clock.getSecondColor());
          second.getTransforms().setAll(secondRotate);
          second.setVisible(clock.isSecondsVisible());
          second.setManaged(clock.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(clock.getShadowsEnabled() ? dropShadow : null);
          shadowGroupMinute.setEffect(clock.getShadowsEnabled() ? dropShadow : null);
          shadowGroupSecond.setEffect(clock.getShadowsEnabled() ? dropShadow : null);
  
          title = new Text("");
          title.setTextOrigin(VPos.TOP);
          Helper.enableNode(title, clock.isTitleVisible());
  
          amPmText = new Text(clock.getTime().get(ChronoField.AMPM_OF_DAY) == 0 ? "AM" : "PM");
  
          dateText = new Text("");
          Helper.enableNode(dateText, clock.isDateVisible());
  
          text = new Text("");
          Helper.enableNode(text, clock.isTextVisible());
  
          pane = new Pane(hourTickMarks, minuteTickMarks, title, amPmText, dateText, text, shadowGroupHour, shadowGroupMinute, shadowGroupSecond);
          pane.setBorder(new Border(new BorderStroke(clock.getBorderPaint(), BorderStrokeStyle.SOLID, new CornerRadii(PREFERRED_WIDTH * 0.025), new BorderWidths(clock.getBorderWidth()))));
          pane.setBackground(new Background(new BackgroundFill(clock.getBackgroundPaint(), new CornerRadii(PREFERRED_WIDTH * 0.025), Insets.EMPTY)));
  
          getChildren().setAll(pane);
      }