// Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import <UIKit/UIKit.h>

/**
 The MDCHeaderStackView class lays out a vertical stack of two views.

 Both bars provided to this view must implement sizeThatFits and return their best-fit
 dimensions.

 # Layout Behavior

 The layout behavior of the two bars is as follows:

 topBar: top aligned, expands to fill all available vertical space not taken up by the bottomBar.
 bottomBar: bottom aligned.

 If no bottomBar is provided, top bar consumes the entire bounds of the stack view.

 When resized, the top bar will shrink until it reaches its sizeThatFits dimensions.
 If there is a bottom bar, then at this point the top bar will begin sliding off the top.
 If there is no bottom bar, then at this point the top bar will stay put.

 At no point in time will either the top or bottom bar shrink below their sizeThatFits height.

 # sizeThatFits Behavior

 sizeThatFits returns the fitted height for bottom bar if available, otherwise it returns the
 fitted height for topBar. The width will be whatever width was provided.
 */
API_DEPRECATED_BEGIN(
    "🕘 Schedule time to migrate. "
    "Use branded UINavigationController instead: go/material-ios-top-app-bars/gm2-migration. "
    "This is go/material-ios-migrations#not-scriptable 🕘",
    ios(12, 12))
IB_DESIGNABLE
@interface MDCHeaderStackView : UIView

/** The top bar. Top aligned and vertically expands. */
@property(nonatomic, strong, nullable) UIView *topBar;

/** The bottom bar. Bottom aligned. */
@property(nonatomic, strong, nullable) UIView *bottomBar;

/**
 A block that is invoked when the @c MDCHeaderStackView receives a call to @c
 traitCollectionDidChange:. The block is called after the call to the superclass.
 */
@property(nonatomic, copy, nullable) void (^traitCollectionDidChangeBlock)
    (MDCHeaderStackView *_Nonnull headerStackView,
     UITraitCollection *_Nullable previousTraitCollection);

@end
API_DEPRECATED_END
