import "dart:ui" show Color; import "package:flutter/widgets.dart" show Brightness; import "package:garage_ui/theme/colour_scheme.dart"; /// Ready-made schemes, so a new app can look like a Garage app on line one. /// /// Standing one up used to mean authoring 54 colours by hand before writing /// any app code. These are the neutral pair, built through /// [ColourScheme.derive] from four colours each — which is also the worked /// example of how to make your own. /// /// ```dart /// GarageApp.router( /// theme: ThemeData(colorScheme: GarageSchemes.dark), /// ... /// ) /// ``` /// /// Want your own hue? Change [ColourScheme.derive]'s `primary` and leave the /// rest. Want one slot exact? Every derived slot has an override. abstract final class GarageSchemes { /// The neutral dark scheme. Same core Arcs & Angles' zinc is built on. static final ColourScheme dark = ColourScheme.derive( brightness: Brightness.dark, background: const Color(0xff303030), foreground: const Color(0xffe6e6e6), primary: const Color(0xff4772b3), ); /// The neutral light scheme — the same blue on a faintly cool near-white. static final ColourScheme light = ColourScheme.derive( brightness: Brightness.light, background: const Color(0xfff2f2f4), foreground: const Color(0xff1a1a1c), primary: const Color(0xff3a63a1), ); /// Carbon. True black, no chroma at all - built for oled panels, and the /// scheme the Garage apps actually run. /// /// It lives here rather than in each app because it didnt: the hub and Arcs /// & Angles each kept their own copy and they drifted apart in twenty five /// of fifty two slots before anyone noticed. One definition cant. /// /// Carbon has 3.6 L* of room under its ground, against zinc's 19.9, so every /// recessed rung squeezes into what there is - which is why chrome lands on /// the floor without being told to. The pins are where carbon wants /// something other than what the ladder gives it. static final ColourScheme carbon = ColourScheme.derive( brightness: Brightness.dark, background: const Color(0xff0d0d0d), foreground: const Color(0xfff2f2f2), // no accent hue anywhere - primary is just a near white fill primary: const Color(0xffe8e8e8), primaryForeground: const Color(0xff000000), ring: const Color(0xffffffff), destructive: const Color(0xffc43333), // the ladder puts these a shade off the floor. carbon wants the floor - // the gutter between panels is the whole look. popover: const Color(0xff000000), controlFillFocused: const Color(0xff000000), // above the ground rather than below it, which is what carbon has always // done with muted. theres barely any "below" left to use. muted: const Color(0xff0f0f0f), controlFill: const Color(0xff080808), tooltipBackground: const Color(0xff080808), // NOT the ladder's +11.8 over the fill. Carbon cant recess a field far // enough to read as recessed, so the stroke does all the separating and // has to be the strongest thing on the control, not the weakest. controlBorder: const Color(0xff2a2a2a), chart1: const Color(0xfff45b69), chart2: const Color(0xff86d957), chart3: const Color(0xff62a7ff), chart4: const Color(0xffffc857), chart5: const Color(0xffff8c42), ); /// Whichever of the pair matches [brightness]. static ColourScheme of(Brightness brightness) => brightness == Brightness.dark ? dark : light; }