docs: @Override protected void initGraphics() {
          super.initGraphics();
  
          currentValueListener = o -> {
              if (tile.isRunning()) { return; } // Update time only if clock is not already running
              updateTime(ZonedDateTime.ofInstant(Instant.ofEpochSecond(tile.getCurrentTime()), ZoneId.of(ZoneId.systemDefault().getId())));
          };
          timeListener         = o -> updateTime(tile.getTime());
  
          dateFormatter = DateTimeFormatter.ofPattern("EE d", tile.getLocale());
  
          sectionMap   = new HashMap<>(tile.getTimeSections().size());
          for (TimeSection section : tile.getTimeSections()) { sectionMap.put(section, new Arc()); }
  
          minuteRotate = new Rotate();
          hourRotate   = new Rotate();
          secondRotate = new Rotate();
  
          sectionsPane = new Pane();
          sectionsPane.getChildren().addAll(sectionMap.values());
          Helper.enableNode(sectionsPane, tile.getSectionsVisible());
  
          minuteTickMarks = new Path();
          minuteTickMarks.setFillRule(FillRule.EVEN_ODD);
          minuteTickMarks.setFill(null);
          minuteTickMarks.setStroke(tile.getMinuteColor());
          minuteTickMarks.setStrokeLineCap(StrokeLineCap.ROUND);
  
          hourTickMarks = new Path();
          hourTickMarks.setFillRule(FillRule.EVEN_ODD);
          hourTickMarks.setFill(null);
          hourTickMarks.setStroke(tile.getHourColor());
          hourTickMarks.setStrokeLineCap(StrokeLineCap.ROUND);
  
          hour = new Rectangle(3, 60);
          hour.setArcHeight(3);
          hour.setArcWidth(3);
          hour.setStroke(tile.getHourColor());
          hour.getTransforms().setAll(hourRotate);
  
          minute = new Rectangle(3, 96);
          minute.setArcHeight(3);
          minute.setArcWidth(3);
          minute.setStroke(tile.getMinuteColor());
          minute.getTransforms().setAll(minuteRotate);
  
          second = new Rectangle(1, 96);
          second.setArcHeight(1);
          second.setArcWidth(1);
          second.setStroke(tile.getSecondColor());
          second.getTransforms().setAll(secondRotate);
          second.setVisible(tile.isSecondsVisible());
          second.setManaged(tile.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(tile.isShadowsEnabled() ? dropShadow : null);
          shadowGroupMinute.setEffect(tile.isShadowsEnabled() ? dropShadow : null);
          shadowGroupSecond.setEffect(tile.isShadowsEnabled() ? dropShadow : null);
  
          titleText = new Text("");
          titleText.setTextOrigin(VPos.TOP);
          Helper.enableNode(titleText, !tile.getTitle().isEmpty());
  
          amPmText = new Text(tile.getTime().get(ChronoField.AMPM_OF_DAY) == 0 ? "AM" : "PM");
  
          dateText = new Text("");
          Helper.enableNode(dateText, tile.isDateVisible());
  
          text = new Text("");
          Helper.enableNode(text, tile.isTextVisible());
  
          getPane().getChildren().addAll(sectionsPane, hourTickMarks, minuteTickMarks, titleText, amPmText, dateText, text, shadowGroupHour, shadowGroupMinute, shadowGroupSecond);
      }