// Copyright 2019 The Flutter team. 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';

import 'package:gallery/l10n/gallery_localizations.dart';

// BEGIN typographyDemo

class _TextStyleItem extends StatelessWidget {
  const _TextStyleItem({
    Key key,
    @required this.name,
    @required this.style,
    @required this.text,
  })  : assert(name != null),
        assert(style != null),
        assert(text != null),
        super(key: key);

  final String name;
  final TextStyle style;
  final String text;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          SizedBox(
            width: 72,
            child: Text(name, style: Theme.of(context).textTheme.caption),
          ),
          Expanded(
            child: Text(text, style: style),
          ),
        ],
      ),
    );
  }
}

class TypographyDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final textTheme = Theme.of(context).textTheme;
    final styleItems = <Widget>[
      _TextStyleItem(
        name: 'Display 4',
        style: textTheme.display4,
        text: 'Light 96sp',
      ),
      _TextStyleItem(
        name: 'Display 3',
        style: textTheme.display3,
        text: 'Light 60sp',
      ),
      _TextStyleItem(
        name: 'Display 2',
        style: textTheme.display2,
        text: 'Regular 48sp',
      ),
      _TextStyleItem(
        name: 'Display 1',
        style: textTheme.display1,
        text: 'Regular 34sp',
      ),
      _TextStyleItem(
        name: 'Headline',
        style: textTheme.headline,
        text: 'Regular 24sp',
      ),
      _TextStyleItem(
        name: 'Title',
        style: textTheme.title,
        text: 'Medium 20sp',
      ),
      _TextStyleItem(
        name: 'Subhead',
        style: textTheme.subhead,
        text: 'Regular 16sp',
      ),
      _TextStyleItem(
        name: 'Subtitle',
        style: textTheme.subtitle,
        text: 'Medium 14sp',
      ),
      _TextStyleItem(
        name: 'Body 1',
        style: textTheme.body1,
        text: 'Regular 16sp',
      ),
      _TextStyleItem(
        name: 'Body 2',
        style: textTheme.body2,
        text: 'Regular 14sp',
      ),
      _TextStyleItem(
        name: 'Button',
        style: textTheme.button,
        text: 'MEDIUM (ALL CAPS) 14sp',
      ),
      _TextStyleItem(
        name: 'Caption',
        style: textTheme.caption,
        text: 'Regular 12sp',
      ),
      _TextStyleItem(
        name: 'Overline',
        style: textTheme.overline,
        text: 'REGULAR (ALL CAPS) 10sp',
      ),
    ];

    return Scaffold(
      appBar: AppBar(
        title: Text(GalleryLocalizations.of(context).demoTypographyTitle),
      ),
      body: Scrollbar(child: ListView(children: styleItems)),
    );
  }
}

// END
