// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

/// Flutter code sample for [OverflowBox].

void main() => runApp(const OverflowBoxApp());

class OverflowBoxApp extends StatelessWidget {
  const OverflowBoxApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('OverflowBox Sample')),
        body: const Center(child: OverflowBoxExample()),
      ),
    );
  }
}

class OverflowBoxExample extends StatelessWidget {
  const OverflowBoxExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: .center,
      children: <Widget>[
        const Text('Cover Me'),
        // This parent container has fixed width and
        // height of 100 pixels.
        Container(
          width: 100,
          height: 100,
          color: Theme.of(context).colorScheme.secondaryContainer,
          // This OverflowBox imposes its own constraints of maxWidth
          // and maxHeight of 200 pixels on its child which allows the
          // child to overflow the parent container.
          child: const OverflowBox(
            maxWidth: 200,
            maxHeight: 200,
            // Without the OverflowBox, the child widget would be
            // constrained to the size of the parent container
            // and would not overflow the parent container.
            child: FlutterLogo(size: 200),
          ),
        ),
      ],
    );
  }
}
