// 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.

// Flutter code sample for [RawScrollbar.shape].

import 'package:flutter/material.dart';

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

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

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: _title,
      home: MyStatelessWidget(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: RawScrollbar(
        shape: const StadiumBorder(
            side: BorderSide(color: Colors.brown, width: 3.0)),
        thickness: 15.0,
        thumbColor: Colors.blue,
        thumbVisibility: true,
        child: ListView(
          // On mobile platforms, setting primary to true is not required, as
          // the PrimaryScrollController automatically attaches to vertical
          // ScrollPositions. On desktop platforms however, using the
          // PrimaryScrollController requires ScrollView.primary be set.
          primary: true,
          physics: const BouncingScrollPhysics(),
          children: List<Text>.generate(
              100, (int index) => Text((index * index).toString())),
        ),
      ),
    );
  }
}
