set visible(value) {
    // DO NOT CALL super here.  There is an issue where clearOnHide was getting triggered with
    // subcomponents because the "parentVisible" flag was set to false when it should really be
    // set to true.
    const visibilityChanged = this._visible !== value;
    this._visible = value;
    const isVisible = this.visible;
    const forceShow = this.shouldForceShow();
    const forceHide = this.shouldForceHide();
    this.components.forEach((component) => {
      // Set the parent visibility first since we may have nested components within nested components
      // and they need to be able to determine their visibility based on the parent visibility.
      component.parentVisible = isVisible;
      let visible;
      if (component.hasCondition()) {
        visible = !component.conditionallyHidden();
      }
      else {
        visible = !component.component.hidden;
      }

      if (forceShow || visible) {
        component.visible = true;
      }
      else if (forceHide || !isVisible || !visible ) {
        component.visible = false;
      }
      // If hiding a nested component, clear all errors below.
      if (!component.visible) {
        component.error = '';
      }
    });

    if (visibilityChanged) {
      this.redraw();
    }
  }
Set visible state of parent and each child component.
@param {boolean} value - The visible state.
@returns {void}