docs: @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  
          int sizeWidth = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
          int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
  
          int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
          int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
  
          int width = 0;
          int height = getPaddingTop() + getPaddingBottom();
  
          int lineWidth = 0;
          int lineHeight = 0;
  
          int childCount = getChildCount();
  
          for (int i = 0; i < childCount; i++) {
  
              View child = getChildAt(i);
              boolean lastChild = i == childCount - 1;
  
              if (child.getVisibility() == View.GONE) {
  
                  if (lastChild) {
                      width = Math.max(width, lineWidth);
                      height += lineHeight;
                  }
  
                  continue;
              }
  
              measureChildWithMargins(child, widthMeasureSpec, lineWidth, heightMeasureSpec, height);
  
              LayoutParams lp = (LayoutParams) child.getLayoutParams();
  
              int childWidthMode = MeasureSpec.AT_MOST;
              int childWidthSize = sizeWidth;
  
              int childHeightMode = MeasureSpec.AT_MOST;
              int childHeightSize = sizeHeight;
  
              if (lp.width == LayoutParams.MATCH_PARENT) {
                  childWidthMode = MeasureSpec.EXACTLY;
                  childWidthSize -= lp.leftMargin + lp.rightMargin;
              } else if (lp.width >= 0) {
                  childWidthMode = MeasureSpec.EXACTLY;
                  childWidthSize = lp.width;
              }
  
              if (lp.height >= 0) {
                  childHeightMode = MeasureSpec.EXACTLY;
                  childHeightSize = lp.height;
              } else if (modeHeight == MeasureSpec.UNSPECIFIED) {
                  childHeightMode = MeasureSpec.UNSPECIFIED;
                  childHeightSize = 0;
              }
  
              child.measure(
                      MeasureSpec.makeMeasureSpec(childWidthSize, childWidthMode),
                      MeasureSpec.makeMeasureSpec(childHeightSize, childHeightMode)
              );
  
              int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
  
              if (lineWidth + childWidth > sizeWidth) {
  
                  width = Math.max(width, lineWidth);
                  lineWidth = childWidth;
  
                  height += lineHeight;
                  lineHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
  
              } else {
                  lineWidth += childWidth;
                  lineHeight = Math.max(lineHeight, child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
              }
  
              if (lastChild) {
                  width = Math.max(width, lineWidth);
                  height += lineHeight;
              }
  
          }
  
          width += getPaddingLeft() + getPaddingRight();
  
          setMeasuredDimension(
                  (modeWidth == MeasureSpec.EXACTLY) ? sizeWidth : width,
                  (modeHeight == MeasureSpec.EXACTLY) ? sizeHeight : height);
      }