import 'package:flutter/material.dart';
import 'package:gap/gap.dart';

/// Geometric progression.
abstract class AppSizing {
  /// Default to 1
  static const double factor = 1;

  /// SizedBox.shrink();
  static const SizedBox empty = SizedBox.shrink();

  /// xxs = factor * 2
  static const double xxs = factor * 2;

  /// xs = factor * 4
  static const double xs = factor * 4;

  /// s = factor * 8
  static const double s = factor * 8;

  /// m = factor * 16
  static const double m = factor * 16;

  /// l = factor * 32
  static const double l = factor * 32;

  /// xl = factor * 64
  static const double xl = factor * 64;

  /// xxl = factor * 128
  static const double xxl = factor * 128;

  /// xxs = factor * 2
  static const Gap xxsGap = Gap(xxs);

  /// xs = factor * 4
  static const Gap xsGap = Gap(xs);

  /// s = factor * 8
  static const Gap sGap = Gap(s);

  /// m = factor * 16
  static const Gap mGap = Gap(m);

  /// l = factor * 32
  static const Gap lGap = Gap(l);

  /// xl = factor * 64
  static const Gap xlGap = Gap(xl);

  /// xxl = factor * 128
  static const Gap xxlGap = Gap(xxl);

  /// xxs = factor * 2
  static const Radius xxsRadius = Radius.circular(xxs);

  /// xs = factor * 4
  static const Radius xsRadius = Radius.circular(xs);

  /// s = factor * 8
  static const Radius sRadius = Radius.circular(s);

  /// m = factor * 16
  static const Radius mRadius = Radius.circular(m);

  /// l = factor * 32
  static const Radius lRadius = Radius.circular(l);

  /// xl = factor * 64
  static const Radius xlRadius = Radius.circular(xl);

  /// xxl = factor * 128
  static const Radius xxlRadius = Radius.circular(xxl);

  /// xxs = factor * 2
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets xxsSquareInset = EdgeInsets.all(xxs);

  /// xs = factor * 4
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets xsSquareInset = EdgeInsets.all(xs);

  /// s = factor * 8
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets sSquareInset = EdgeInsets.all(s);

  /// m = factor * 16
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets mSquareInset = EdgeInsets.all(m);

  /// l = factor * 32
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets lSquareInset = EdgeInsets.all(l);

  /// xl = factor * 64
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets xlSquareInset = EdgeInsets.all(xl);

  /// xxl = factor * 128
  ///
  /// A square inset offers indents content on all four sides.
  ///
  /// *e.g [EdgeInsets.all(value)]*
  static const EdgeInsets xxlSquareInset = EdgeInsets.all(xxl);

  /// xxs = factor * 2
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets xxsSquishInset =
      EdgeInsets.symmetric(horizontal: xxs, vertical: xxs / 2);

  /// xs = factor * 4
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets xsSquishInset =
      EdgeInsets.symmetric(horizontal: xs, vertical: xs / 2);

  /// s = factor * 8
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets sSquishInset =
      EdgeInsets.symmetric(horizontal: s, vertical: s / 2);

  /// m = factor * 16
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets mSquishInset =
      EdgeInsets.symmetric(horizontal: m, vertical: m / 2);

  /// l = factor * 32
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets lSquishInset =
      EdgeInsets.symmetric(horizontal: l, vertical: l / 2);

  /// xl = factor * 64
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets xlSquishInset =
      EdgeInsets.symmetric(horizontal: xl, vertical: xl / 2);

  /// xxl = factor * 128
  ///
  /// A squished inset reduces space top and bottom by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(horizontal: value, vertical: value / 2)]*
  static const EdgeInsets xxlSquishInset =
      EdgeInsets.symmetric(horizontal: xxl, vertical: xxl / 2);

  /// xxs = factor * 2
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets xxsStretchInset =
      EdgeInsets.symmetric(vertical: xxs, horizontal: xxs / 2);

  /// xs = factor * 4
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets xsStretchInset =
      EdgeInsets.symmetric(vertical: xs, horizontal: xs / 2);

  /// s = factor * 8
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets sStretchInset =
      EdgeInsets.symmetric(vertical: s, horizontal: s / 2);

  /// m = factor * 16
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets mStretchInset =
      EdgeInsets.symmetric(vertical: m, horizontal: m / 2);

  /// l = factor * 32
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets lStretchInset =
      EdgeInsets.symmetric(vertical: l, horizontal: l / 2);

  /// xl = factor * 64
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets xlStretchInset =
      EdgeInsets.symmetric(vertical: xl, horizontal: xl / 2);

  /// xxl = factor * 128
  ///
  /// A stretched inset reduces space left and right by 50%.
  ///
  /// *e.g [EdgeInsets.symmetric(vertical: value, horizontal: value / 2)]*
  static const EdgeInsets xxlStretchInset =
      EdgeInsets.symmetric(vertical: xxl, horizontal: xxl / 2);
}
