shad 0.57.0 copy "shad: ^0.57.0" to clipboard
shad: ^0.57.0 copied to clipboard

shadcn/ui ported in Flutter. Awesome UI components for Flutter, fully customizable.

example/lib/main.dart

import 'package:disco/disco.dart';
import 'package:example/common/app_shell.dart';
import 'package:example/docs/docs.dart';
import 'package:example/pages/accordion.dart';
import 'package:example/pages/alert.dart';
import 'package:example/pages/avatar.dart';
import 'package:example/pages/badge.dart';
import 'package:example/pages/breadcrumb.dart';
import 'package:example/pages/button.dart';
import 'package:example/pages/calendar.dart';
import 'package:example/pages/card.dart';
import 'package:example/pages/checkbox.dart';
import 'package:example/pages/checkbox_form_field.dart';
import 'package:example/pages/collapsible.dart';
import 'package:example/pages/command.dart';
import 'package:example/pages/context_menu.dart';
import 'package:example/pages/data_table.dart';
import 'package:example/pages/date_picker.dart';
import 'package:example/pages/date_picker_form_field.dart';
import 'package:example/pages/dialog.dart';
import 'package:example/pages/empty.dart';
import 'package:example/pages/icon_button.dart';
import 'package:example/pages/input.dart';
import 'package:example/pages/input_form_field.dart';
import 'package:example/pages/input_otp.dart';
import 'package:example/pages/input_otp_form_field.dart';
import 'package:example/pages/kbd.dart';
import 'package:example/pages/layout.dart';
import 'package:example/pages/keyboard_toolbar.dart';
import 'package:example/pages/menubar.dart';
import 'package:example/pages/pagination.dart';
import 'package:example/pages/popover.dart';
import 'package:example/pages/portal.dart';
import 'package:example/pages/progress.dart';
import 'package:example/pages/radio_group.dart';
import 'package:example/pages/radio_group_form_field.dart';
import 'package:example/pages/resizable.dart';
import 'package:example/pages/select.dart';
import 'package:example/pages/select_form_field.dart';
import 'package:example/pages/separator.dart';
import 'package:example/pages/sheet.dart';
import 'package:example/pages/skeleton.dart';
import 'package:example/pages/slider.dart';
import 'package:example/pages/sonner.dart';
import 'package:example/pages/spinner.dart';
import 'package:example/pages/switch.dart';
import 'package:example/pages/switch_form_field.dart';
import 'package:example/pages/table.dart';
import 'package:example/pages/tabs.dart';
import 'package:example/pages/textarea.dart';
import 'package:example/pages/textarea_form_field.dart';
import 'package:example/pages/theme_editor.dart';
import 'package:example/pages/time_picker.dart';
import 'package:example/pages/time_picker_form_field.dart';
import 'package:example/pages/toast.dart';
import 'package:example/pages/toggle.dart';
import 'package:example/pages/toggle_group.dart';
import 'package:example/pages/tooltip.dart';
import 'package:example/pages/typography.dart';
import 'package:flutter/material.dart';
import 'package:flutter_solidart/flutter_solidart.dart';
import 'package:shad/shad.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SolidartConfig.devToolsEnabled = false;
  // The docs' code blocks need the Dart grammar and highlighter theme.
  await CodeHighlighter.ensureInitialized();
  runApp(const App());
}

// Maps the routes to the specific widget page.
final routes = <String, WidgetBuilder>{
  '/accordion': (_) => const AccordionPage(),
  '/alert': (_) => const AlertPage(),
  '/avatar': (_) => const AvatarPage(),
  '/badge': (_) => const BadgePage(),
  '/breadcrumb': (_) => const BreadcrumbPage(),
  '/button': (_) => const ButtonPage(),
  '/calendar': (_) => const CalendarPage(),
  '/card': (_) => const CardPage(),
  '/checkbox': (_) => const CheckboxPage(),
  '/checkbox-form-field': (_) => const CheckboxFormFieldPage(),
  '/collapsible': (_) => const CollapsiblePage(),
  '/command': (_) => const CommandPage(),
  '/context-menu': (_) => const ContextMenuPage(),
  '/date-picker': (_) => const DatePickerPage(),
  '/date-picker-form-field': (_) => const DatePickerFormFieldPage(),
  '/data-table': (_) => const DataTablePage(),
  '/dialog': (_) => const DialogPage(),
  '/empty': (_) => const EmptyPage(),
  '/divider': (_) => const SeparatorPage(),
  '/icon-button': (_) => const IconButtonPage(),
  '/input': (_) => const InputPage(),
  '/input-OTP': (_) => const InputOTPPage(),
  '/input-OTP-form-field': (_) => const InputOTPFormFieldPage(),
  '/input-form-field': (_) => const InputFormFieldPage(),
  '/kbd': (_) => const KbdPage(),
  '/keyboard-toolbar': (_) => const KeyboardToolbarPage(),
  '/layout': (_) => const LayoutPage(),
  '/menubar': (_) => const MenubarPage(),
  '/popover': (_) => const PopoverPage(),
  '/pagination': (_) => const PaginationPage(),
  '/portal': (_) => const ShadPortalPage(),
  '/progress': (_) => const ProgressPage(),
  '/radio-group': (_) => const RadioPage(),
  '/radio-group-form-field': (_) => const RadioGroupFormFieldPage(),
  '/resizable': (_) => const ResizablePage(),
  '/select': (_) => const SelectPage(),
  '/select-form-field': (_) => const SelectFormFieldPage(),
  '/sheet': (_) => const SheetPage(),
  '/slider': (_) => const SliderPage(),
  '/sonner': (_) => const SonnerPage(),
  '/skeleton': (_) => const SkeletonPage(),
  '/spinner': (_) => const SpinnerPage(),
  '/switch': (_) => const SwitchPage(),
  '/switch-form-field': (_) => const SwitchFormFieldPage(),
  '/table': (_) => const TablePage(),
  '/tabs': (_) => const TabsPage(),
  '/theme-editor': (_) => const ThemeEditorPage(),
  '/textarea': (_) => const TextareaPage(),
  '/textarea-form-field': (_) => const TextareaFormFieldPage(),
  '/time-picker': (_) => const TimePickerPage(),
  '/time-picker-form-field': (_) => const TimePickerFormFieldPage(),
  '/toast': (_) => const ToastPage(),
  '/toggle': (_) => const TogglePage(),
  '/toggle-group': (_) => const ToggleGroupPage(),
  '/tooltip': (_) => const TooltipPage(),
  '/typography': (_) => const TypographyPage(),
};
final themeModeProvider = Provider((_) => Signal(ThemeMode.light));

final directionalityProvider = Provider((context) => Signal(TextDirection.ltr));

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

  @override
  Widget build(BuildContext context) {
    return ProviderScope(
      providers: [themeModeProvider, directionalityProvider],
      child: SignalBuilder(
        builder: (context, _) {
          final themeMode = themeModeProvider.of(context).value;
          final directionality = directionalityProvider.of(context).value;
          // Custom App example
          // return ShadApp.custom(
          //   themeMode: themeMode,
          //   darkTheme: ShadThemeData(
          //     brightness: Brightness.dark,
          //     colorScheme: const ShadSlateColorScheme.dark(),
          //   ),
          //   appBuilder: (context) {
          //     return MaterialApp(
          //       routes: routes,
          //       theme: Theme.of(context),
          //       home: const AppShell(),
          //       localizationsDelegates: const [
          //         GlobalShadLocalizations.delegate,
          //       ],
          //       builder: (context, child) {
          //         return Directionality(
          //           textDirection: directionality,
          //           child: ShadAppBuilder(child: child!),
          //         );
          //       },
          //     );
          //   },
          // );
          return ShadApp(
            debugShowCheckedModeBanner: false,
            themeMode: themeMode,
            routes: routes,
            theme: ShadThemeData(
              brightness: Brightness.light,
              colorScheme: const ShadZincColorScheme.light(
                // Example of adding a custom color to the color scheme
                /* 
                  custom: {
                     'myCustomColor': Color.fromARGB(255, 177, 4, 196),
                   },
                  */
              ),
              // Example with google fonts
              // textTheme: ShadTextTheme.fromGoogleFont(
              //   GoogleFonts.lavishlyYours,
              // ),

              // Example of custom font family
              // textTheme: ShadTextTheme(family: 'UbuntuMono'),

              // Example to disable the secondary border
              // disableSecondaryBorder: true,

              // Example of extending the ShadTextTheme with a new custom style and name (see `/typography` page for usage example).
              textTheme: ShadTextTheme(
                custom: {
                  'myCustomStyle': const TextStyle(
                    fontSize: 16,
                    fontWeight: FontWeight.w400,
                    color: Colors.blue,
                  ),
                },
              ),
            ),
            darkTheme: ShadThemeData(
              brightness: Brightness.dark,
              colorScheme: const ShadZincColorScheme.dark(),
              // Example of custom font family
              // textTheme: ShadTextTheme(family: 'UbuntuMono'),

              // Example of extending the ShadTextTheme with a new custom style and name (see `/typography` page for usage example).
              textTheme: ShadTextTheme(
                custom: {
                  'myCustomStyle': const TextStyle(
                    fontSize: 16,
                    fontWeight: FontWeight.w400,
                    color: Colors.green,
                  ),
                },
              ),
            ),
            home: const AppShell(),
            builder: (context, child) {
              return Directionality(
                textDirection: directionality,
                child: child!,
              );
            },
          );
        },
      ),
    );
  }
}