diff --git a/packages/pinball_components/sandbox/.github/PULL_REQUEST_TEMPLATE.md b/packages/pinball_components/sandbox/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..6b9372ef
--- /dev/null
+++ b/packages/pinball_components/sandbox/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,23 @@
+
+
+## Description
+
+
+
+## Type of Change
+
+
+
+- [ ] β¨ New feature (non-breaking change which adds functionality)
+- [ ] π οΈ Bug fix (non-breaking change which fixes an issue)
+- [ ] β Breaking change (fix or feature that would cause existing functionality to change)
+- [ ] π§Ή Code refactor
+- [ ] β
Build configuration change
+- [ ] π Documentation
+- [ ] ποΈ Chore
diff --git a/packages/pinball_components/sandbox/.github/workflows/main.yaml b/packages/pinball_components/sandbox/.github/workflows/main.yaml
new file mode 100644
index 00000000..553a0091
--- /dev/null
+++ b/packages/pinball_components/sandbox/.github/workflows/main.yaml
@@ -0,0 +1,10 @@
+name: sandbox
+
+on: [pull_request, push]
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 2.10.0
diff --git a/packages/pinball_components/sandbox/.gitignore b/packages/pinball_components/sandbox/.gitignore
new file mode 100644
index 00000000..bd315f72
--- /dev/null
+++ b/packages/pinball_components/sandbox/.gitignore
@@ -0,0 +1,127 @@
+# Miscellaneous
+*.class
+*.lock
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/*
+
+# Visual Studio Code related
+.classpath
+.project
+.settings/
+.vscode/*
+
+# Flutter repo-specific
+/bin/cache/
+/bin/mingit/
+/dev/benchmarks/mega_gallery/
+/dev/bots/.recipe_deps
+/dev/bots/android_tools/
+/dev/docs/doc/
+/dev/docs/flutter.docs.zip
+/dev/docs/lib/
+/dev/docs/pubspec.yaml
+/dev/integration_tests/**/xcuserdata
+/dev/integration_tests/**/Pods
+/packages/flutter/coverage/
+version
+
+# packages file containing multi-root paths
+.packages.generated
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+build/
+flutter_*.png
+linked_*.ds
+unlinked.ds
+unlinked_spec.ds
+.fvm/
+
+# Android related
+**/android/**/gradle-wrapper.jar
+**/android/.gradle
+**/android/captures/
+**/android/gradlew
+**/android/gradlew.bat
+**/android/local.properties
+**/android/**/GeneratedPluginRegistrant.java
+**/android/key.properties
+**/android/.idea/
+*.jks
+
+# iOS/XCode related
+**/ios/**/*.mode1v3
+**/ios/**/*.mode2v3
+**/ios/**/*.moved-aside
+**/ios/**/*.pbxuser
+**/ios/**/*.perspectivev3
+**/ios/**/*sync/
+**/ios/**/.sconsign.dblite
+**/ios/**/.tags*
+**/ios/**/.vagrant/
+**/ios/**/DerivedData/
+**/ios/**/Icon?
+**/ios/**/Pods/
+**/ios/**/.symlinks/
+**/ios/**/profile
+**/ios/**/xcuserdata
+**/ios/.generated/
+**/ios/Flutter/App.framework
+**/ios/Flutter/Flutter.framework
+**/ios/Flutter/Flutter.podspec
+**/ios/Flutter/Generated.xcconfig
+**/ios/Flutter/app.flx
+**/ios/Flutter/app.zip
+**/ios/Flutter/.last_build_id
+**/ios/Flutter/flutter_assets/
+**/ios/Flutter/flutter_export_environment.sh
+**/ios/ServiceDefinitions.json
+**/ios/Runner/GeneratedPluginRegistrant.*
+
+# Coverage
+coverage/
+
+# Submodules
+!pubspec.lock
+packages/**/pubspec.lock
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Exceptions to the above rules.
+!**/ios/**/default.mode1v3
+!**/ios/**/default.mode2v3
+!**/ios/**/default.pbxuser
+!**/ios/**/default.perspectivev3
+!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+!/dev/ci/**/Gemfile.lock
+!.vscode/extensions.json
+!.vscode/launch.json
+!.idea/codeStyles/
+!.idea/dictionaries/
+!.idea/runConfigurations/
diff --git a/packages/pinball_components/sandbox/.metadata b/packages/pinball_components/sandbox/.metadata
new file mode 100644
index 00000000..cd984dd0
--- /dev/null
+++ b/packages/pinball_components/sandbox/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: 9b2d32b605630f28625709ebd9d78ab3016b2bf6
+ channel: stable
+
+project_type: app
diff --git a/packages/pinball_components/sandbox/LICENSE b/packages/pinball_components/sandbox/LICENSE
new file mode 100644
index 00000000..7b93245a
--- /dev/null
+++ b/packages/pinball_components/sandbox/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Very Good Ventures
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/packages/pinball_components/sandbox/README.md b/packages/pinball_components/sandbox/README.md
new file mode 100644
index 00000000..08509a8b
--- /dev/null
+++ b/packages/pinball_components/sandbox/README.md
@@ -0,0 +1,164 @@
+# Sandbox
+
+![coverage][coverage_badge]
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+[![License: MIT][license_badge]][license_link]
+
+Generated by the [Very Good CLI][very_good_cli_link] π€
+
+A sanbox application where components are showcased and developed in an isolated way
+
+---
+
+## Getting Started π
+
+This project contains 3 flavors:
+
+- development
+- staging
+- production
+
+To run the desired flavor either use the launch configuration in VSCode/Android Studio or use the following commands:
+
+```sh
+# Development
+$ flutter run --flavor development --target lib/main_development.dart
+
+# Staging
+$ flutter run --flavor staging --target lib/main_staging.dart
+
+# Production
+$ flutter run --flavor production --target lib/main_production.dart
+```
+
+_\*Sandbox works on iOS, Android, Web, and Windows._
+
+---
+
+## Running Tests π§ͺ
+
+To run all unit and widget tests use the following command:
+
+```sh
+$ flutter test --coverage --test-randomize-ordering-seed random
+```
+
+To view the generated coverage report you can use [lcov](https://github.com/linux-test-project/lcov).
+
+```sh
+# Generate Coverage Report
+$ genhtml coverage/lcov.info -o coverage/
+
+# Open Coverage Report
+$ open coverage/index.html
+```
+
+---
+
+## Working with Translations π
+
+This project relies on [flutter_localizations][flutter_localizations_link] and follows the [official internationalization guide for Flutter][internationalization_link].
+
+### Adding Strings
+
+1. To add a new localizable string, open the `app_en.arb` file at `lib/l10n/arb/app_en.arb`.
+
+```arb
+{
+ "@@locale": "en",
+ "counterAppBarTitle": "Counter",
+ "@counterAppBarTitle": {
+ "description": "Text shown in the AppBar of the Counter Page"
+ }
+}
+```
+
+2. Then add a new key/value and description
+
+```arb
+{
+ "@@locale": "en",
+ "counterAppBarTitle": "Counter",
+ "@counterAppBarTitle": {
+ "description": "Text shown in the AppBar of the Counter Page"
+ },
+ "helloWorld": "Hello World",
+ "@helloWorld": {
+ "description": "Hello World Text"
+ }
+}
+```
+
+3. Use the new string
+
+```dart
+import 'package:sandbox/l10n/l10n.dart';
+
+@override
+Widget build(BuildContext context) {
+ final l10n = context.l10n;
+ return Text(l10n.helloWorld);
+}
+```
+
+### Adding Supported Locales
+
+Update the `CFBundleLocalizations` array in the `Info.plist` at `ios/Runner/Info.plist` to include the new locale.
+
+```xml
+ ...
+
+ CFBundleLocalizations
+
+ en
+ es
+
+
+ ...
+```
+
+### Adding Translations
+
+1. For each supported locale, add a new ARB file in `lib/l10n/arb`.
+
+```
+βββ l10n
+β βββ arb
+β β βββ app_en.arb
+β β βββ app_es.arb
+```
+
+2. Add the translated strings to each `.arb` file:
+
+`app_en.arb`
+
+```arb
+{
+ "@@locale": "en",
+ "counterAppBarTitle": "Counter",
+ "@counterAppBarTitle": {
+ "description": "Text shown in the AppBar of the Counter Page"
+ }
+}
+```
+
+`app_es.arb`
+
+```arb
+{
+ "@@locale": "es",
+ "counterAppBarTitle": "Contador",
+ "@counterAppBarTitle": {
+ "description": "Texto mostrado en la AppBar de la pΓ‘gina del contador"
+ }
+}
+```
+
+[coverage_badge]: coverage_badge.svg
+[flutter_localizations_link]: https://api.flutter.dev/flutter/flutter_localizations/flutter_localizations-library.html
+[internationalization_link]: https://flutter.dev/docs/development/accessibility-and-localization/internationalization
+[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg
+[license_link]: https://opensource.org/licenses/MIT
+[very_good_analysis_badge]: https://img.shields.io/badge/style-very_good_analysis-B22C89.svg
+[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis
+[very_good_cli_link]: https://github.com/VeryGoodOpenSource/very_good_cli
diff --git a/packages/pinball_components/sandbox/analysis_options.yaml b/packages/pinball_components/sandbox/analysis_options.yaml
new file mode 100644
index 00000000..07aa1dab
--- /dev/null
+++ b/packages/pinball_components/sandbox/analysis_options.yaml
@@ -0,0 +1,4 @@
+include: package:very_good_analysis/analysis_options.2.4.0.yaml
+linter:
+ rules:
+ public_member_api_docs: false
diff --git a/packages/pinball_components/sandbox/coverage_badge.svg b/packages/pinball_components/sandbox/coverage_badge.svg
new file mode 100644
index 00000000..88bfadfb
--- /dev/null
+++ b/packages/pinball_components/sandbox/coverage_badge.svg
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/packages/pinball_components/sandbox/lib/common/common.dart b/packages/pinball_components/sandbox/lib/common/common.dart
new file mode 100644
index 00000000..b7ee5a4a
--- /dev/null
+++ b/packages/pinball_components/sandbox/lib/common/common.dart
@@ -0,0 +1,11 @@
+import 'package:flame_forge2d/flame_forge2d.dart';
+
+String buildSourceLink(String path) {
+ return 'https://github.com/VGVentures/pinball/tree/main/packages/pinball_components/sandbox/lib/stories/$path';
+}
+
+class BasicGame extends Forge2DGame {
+ BasicGame() {
+ images.prefix = '';
+ }
+}
diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart
new file mode 100644
index 00000000..0cfd6f7f
--- /dev/null
+++ b/packages/pinball_components/sandbox/lib/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, Very Good Ventures
+// https://verygood.ventures
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/MIT.
+import 'package:dashbook/dashbook.dart';
+import 'package:flutter/material.dart';
+import 'package:sandbox/stories/stories.dart';
+
+void main() {
+ final dashbook = Dashbook(theme: ThemeData.dark());
+
+ addBallStories(dashbook);
+ runApp(dashbook);
+}
diff --git a/packages/pinball_components/sandbox/lib/stories/ball/ball.dart b/packages/pinball_components/sandbox/lib/stories/ball/ball.dart
new file mode 100644
index 00000000..f8e49a57
--- /dev/null
+++ b/packages/pinball_components/sandbox/lib/stories/ball/ball.dart
@@ -0,0 +1,18 @@
+import 'package:dashbook/dashbook.dart';
+import 'package:flame/game.dart';
+import 'package:flutter/material.dart';
+import 'package:sandbox/common/common.dart';
+import 'package:sandbox/stories/ball/basic.dart';
+
+void addBallStories(Dashbook dashbook) {
+ dashbook.storiesOf('Ball').add(
+ 'Basic',
+ (context) => GameWidget(
+ game: BasicBallGame(
+ color: context.colorProperty('color', Colors.blue),
+ ),
+ ),
+ codeLink: buildSourceLink('ball/basic.dart'),
+ info: BasicBallGame.info,
+ );
+}
diff --git a/packages/pinball_components/sandbox/lib/stories/ball/basic.dart b/packages/pinball_components/sandbox/lib/stories/ball/basic.dart
new file mode 100644
index 00000000..78948666
--- /dev/null
+++ b/packages/pinball_components/sandbox/lib/stories/ball/basic.dart
@@ -0,0 +1,22 @@
+import 'package:flame/input.dart';
+import 'package:flutter/material.dart';
+import 'package:pinball_components/pinball_components.dart';
+import 'package:sandbox/common/common.dart';
+
+class BasicBallGame extends BasicGame with TapDetector {
+ BasicBallGame({ required this.color });
+
+ static const info = '''
+ Basic example of how a Ball works, tap anywhere on the
+ screen to spawn a ball into the game.
+''';
+
+ final Color color;
+
+ @override
+ void onTapUp(TapUpInfo info) {
+ add(Ball(baseColor: color)
+ ..initialPosition = info.eventPosition.game,
+ );
+ }
+}
diff --git a/packages/pinball_components/sandbox/lib/stories/stories.dart b/packages/pinball_components/sandbox/lib/stories/stories.dart
new file mode 100644
index 00000000..6070319c
--- /dev/null
+++ b/packages/pinball_components/sandbox/lib/stories/stories.dart
@@ -0,0 +1 @@
+export 'ball/ball.dart';
diff --git a/packages/pinball_components/sandbox/pubspec.lock b/packages/pinball_components/sandbox/pubspec.lock
new file mode 100644
index 00000000..7452ccf4
--- /dev/null
+++ b/packages/pinball_components/sandbox/pubspec.lock
@@ -0,0 +1,446 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ args:
+ dependency: transitive
+ description:
+ name: args
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.3.0"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.8.2"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.0"
+ charcode:
+ dependency: transitive
+ description:
+ name: charcode
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.3.1"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.0"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.15.0"
+ dashbook:
+ dependency: "direct main"
+ description:
+ name: dashbook
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.7"
+ device_frame:
+ dependency: transitive
+ description:
+ name: device_frame
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.0"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.0"
+ ffi:
+ dependency: transitive
+ description:
+ name: ffi
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.2"
+ file:
+ dependency: transitive
+ description:
+ name: file
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "6.1.2"
+ flame:
+ dependency: "direct main"
+ description:
+ name: flame
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.0-releasecandidate.6"
+ flame_forge2d:
+ dependency: "direct main"
+ description:
+ name: flame_forge2d
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.9.0-releasecandidate.6"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_colorpicker:
+ dependency: transitive
+ description:
+ name: flutter_colorpicker
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.3"
+ flutter_markdown:
+ dependency: transitive
+ description:
+ name: flutter_markdown
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.6.9"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ forge2d:
+ dependency: transitive
+ description:
+ name: forge2d
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.9.0"
+ freezed_annotation:
+ dependency: transitive
+ description:
+ name: freezed_annotation
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.0"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.6.3"
+ json_annotation:
+ dependency: transitive
+ description:
+ name: json_annotation
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "4.4.0"
+ markdown:
+ dependency: transitive
+ description:
+ name: markdown
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "4.0.1"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.12.11"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.3"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.7.0"
+ ordered_set:
+ dependency: transitive
+ description:
+ name: ordered_set
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "5.0.0"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.8.0"
+ path_provider_linux:
+ dependency: transitive
+ description:
+ name: path_provider_linux
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.5"
+ path_provider_platform_interface:
+ dependency: transitive
+ description:
+ name: path_provider_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.3"
+ path_provider_windows:
+ dependency: transitive
+ description:
+ name: path_provider_windows
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.5"
+ pinball_components:
+ dependency: "direct main"
+ description:
+ path: ".."
+ relative: true
+ source: path
+ version: "1.0.0+1"
+ platform:
+ dependency: transitive
+ description:
+ name: platform
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "3.1.0"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.2"
+ process:
+ dependency: transitive
+ description:
+ name: process
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "4.2.4"
+ shared_preferences:
+ dependency: transitive
+ description:
+ name: shared_preferences
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.13"
+ shared_preferences_android:
+ dependency: transitive
+ description:
+ name: shared_preferences_android
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.11"
+ shared_preferences_ios:
+ dependency: transitive
+ description:
+ name: shared_preferences_ios
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ shared_preferences_linux:
+ dependency: transitive
+ description:
+ name: shared_preferences_linux
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ shared_preferences_macos:
+ dependency: transitive
+ description:
+ name: shared_preferences_macos
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.3"
+ shared_preferences_platform_interface:
+ dependency: transitive
+ description:
+ name: shared_preferences_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.0"
+ shared_preferences_web:
+ dependency: transitive
+ description:
+ name: shared_preferences_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.3"
+ shared_preferences_windows:
+ dependency: transitive
+ description:
+ name: shared_preferences_windows
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.8.1"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.10.0"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.0"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.0"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.4.8"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.3.0"
+ url_launcher:
+ dependency: transitive
+ description:
+ name: url_launcher
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "6.0.20"
+ url_launcher_android:
+ dependency: transitive
+ description:
+ name: url_launcher_android
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "6.0.15"
+ url_launcher_ios:
+ dependency: transitive
+ description:
+ name: url_launcher_ios
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "6.0.15"
+ url_launcher_linux:
+ dependency: transitive
+ description:
+ name: url_launcher_linux
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "3.0.0"
+ url_launcher_macos:
+ dependency: transitive
+ description:
+ name: url_launcher_macos
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "3.0.0"
+ url_launcher_platform_interface:
+ dependency: transitive
+ description:
+ name: url_launcher_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.5"
+ url_launcher_web:
+ dependency: transitive
+ description:
+ name: url_launcher_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.9"
+ url_launcher_windows:
+ dependency: transitive
+ description:
+ name: url_launcher_windows
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "3.0.0"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.1"
+ very_good_analysis:
+ dependency: "direct dev"
+ description:
+ name: very_good_analysis
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.4.0"
+ win32:
+ dependency: transitive
+ description:
+ name: win32
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.4.4"
+ xdg_directories:
+ dependency: transitive
+ description:
+ name: xdg_directories
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.2.0+1"
+sdks:
+ dart: ">=2.16.0 <3.0.0"
+ flutter: ">=2.10.0"
diff --git a/packages/pinball_components/sandbox/pubspec.yaml b/packages/pinball_components/sandbox/pubspec.yaml
new file mode 100644
index 00000000..0c8267a8
--- /dev/null
+++ b/packages/pinball_components/sandbox/pubspec.yaml
@@ -0,0 +1,24 @@
+name: sandbox
+description: A sanbox application where components are showcased and developed in an isolated way
+version: 1.0.0+1
+publish_to: none
+
+environment:
+ sdk: ">=2.16.0 <3.0.0"
+
+dependencies:
+ dashbook: ^0.1.7
+ flame: ^1.1.0-releasecandidate.6
+ flame_forge2d: ^0.9.0-releasecandidate.6
+ flutter:
+ sdk: flutter
+ pinball_components:
+ path: ../
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ very_good_analysis: ^2.4.0
+
+flutter:
+ uses-material-design: true
diff --git a/packages/pinball_components/sandbox/web/favicon.png b/packages/pinball_components/sandbox/web/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/packages/pinball_components/sandbox/web/favicon.png differ
diff --git a/packages/pinball_components/sandbox/web/icons/Icon-192.png b/packages/pinball_components/sandbox/web/icons/Icon-192.png
new file mode 100644
index 00000000..b749bfef
Binary files /dev/null and b/packages/pinball_components/sandbox/web/icons/Icon-192.png differ
diff --git a/packages/pinball_components/sandbox/web/icons/Icon-512.png b/packages/pinball_components/sandbox/web/icons/Icon-512.png
new file mode 100644
index 00000000..88cfd48d
Binary files /dev/null and b/packages/pinball_components/sandbox/web/icons/Icon-512.png differ
diff --git a/packages/pinball_components/sandbox/web/icons/Icon-maskable-192.png b/packages/pinball_components/sandbox/web/icons/Icon-maskable-192.png
new file mode 100644
index 00000000..eb9b4d76
Binary files /dev/null and b/packages/pinball_components/sandbox/web/icons/Icon-maskable-192.png differ
diff --git a/packages/pinball_components/sandbox/web/icons/Icon-maskable-512.png b/packages/pinball_components/sandbox/web/icons/Icon-maskable-512.png
new file mode 100644
index 00000000..d69c5669
Binary files /dev/null and b/packages/pinball_components/sandbox/web/icons/Icon-maskable-512.png differ
diff --git a/packages/pinball_components/sandbox/web/index.html b/packages/pinball_components/sandbox/web/index.html
new file mode 100644
index 00000000..55e4c8cc
--- /dev/null
+++ b/packages/pinball_components/sandbox/web/index.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sandbox
+
+
+
+
+
+
+
diff --git a/packages/pinball_components/sandbox/web/manifest.json b/packages/pinball_components/sandbox/web/manifest.json
new file mode 100644
index 00000000..8d4dbedf
--- /dev/null
+++ b/packages/pinball_components/sandbox/web/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "sandbox",
+ "short_name": "sandbox",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#0175C2",
+ "theme_color": "#0175C2",
+ "description": "A new Flutter project.",
+ "orientation": "portrait-primary",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icons/Icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-maskable-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "icons/Icon-maskable-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}