| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| |
| # Contribution Guide |
| |
| This guide consists of: |
| |
| - [Project Structure](#project-structure) |
| - [State Management](#state-management) |
| - [Example Loading](#example-loading) |
| - [Theming](#theming) |
| - [Adding a New Page](#adding-a-new-page) |
| - [Accessibility](#accessibility) |
| |
| ## Project Structure |
| |
| The frontend consists of 3 projects: |
| |
| - `frontend` is the playground app itself. |
| - `frontend/playground_components` is the package with common code for Playground and Tour of Beam. |
| - `frontend/playground_components_dev` is common code for tests of Playground and Tour of Beam. |
| |
| ## State Management |
| |
| Playground uses the [app_state](https://pub.dev/packages/app_state) package for state management. |
| The standalone playground and the embedded playground are two screens within the same app, |
| chosen by the URL at runtime. |
| |
| The main state object is `PlaygroundController`, created in both of those screens. |
| It is hung in the widget tree with the [provider](https://pub.dev/packages/provider) package |
| for historical reasons, and we aim to remove that if we do further refactoring. |
| New code should pass it directly from widget to widget for compile-time safety. |
| |
| ## Example Loading |
| |
| A URL is parsed into one of the subclasses of `PagePath`, most of which contain |
| an `ExamplesLoadingDescriptor` object, which in turn may contain multiple `ExampleLoadingDescriptor` |
| objects. |
| |
| This is passed to the `ExamplesLoader` object. It constructs an `ExampleLoader` object |
| for each example's descriptor, and that loader performs the actual loading. |
| |
| To add a new source for examples: |
| |
| 1. Subclass `ExampleLoadingDescriptor` with state and a method to parse it from a map of query string parameters. |
| 2. Add it to `ExamplesLoadingDescriptorFactory`. |
| 3. Subclass `ExampleLoader` and load an example there. |
| 4. Add it to the `ExampleLoaderFactory` in `ExamplesLoader`. |
| |
| ## Theming |
| |
| Playground app supports light and dark themes. Component themes are declared |
| in [theme.dart](playground_components/lib/src/theme/theme.dart) file. |
| |
| To use specific color inside component you can use helper `ThemeColors` utility: |
| |
| `ThemeColors.of(context).greyColor` |
| |
| [colors.dart](./lib/constants/colors.dart) contains color declarations. |
| |
| ## Adding a New Page |
| |
| To add a new page, do the following steps: |
| |
| 1. Read [the overview](https://pub.dev/packages/app_state) of the `app_state` package. |
| 2. Create a new `PagePath` subclass that parses the new URL. |
| 3. Create a new `ChangeNotifier with PageStateMixin` that holds the state of the page. |
| 4. Create a new `StatelessWidget` as the main one for the page. |
| 5. Create a new `StatefulMaterialPage` subclass that binds the three together. |
| |
| See the example in [lib/pages/standalone_playground](lib/pages/standalone_playground). |
| |
| ## Accessibility |
| |
| Please, read the following guides about the accessibility: |
| |
| - [Flutter Doc](https://docs.flutter.dev/development/accessibility-and-localization/accessibility) |
| - [Medium Article](https://medium.com/flutter-community/a-deep-dive-into-flutters-accessibility-widgets-eb0ef9455bc) |