βSandboxed
Sandboxed is a Flutter tool for developing, testing, and showcasing UI components in isolation.
- π οΈ Design. β‘ Build. π Preview.
- β¨ Speed up development. π§Ό Improve maintainability. π€ Share confidently.
β οΈ Disclaimer
This package is currently in an unstable state and may introduce breaking changes without notice.
It also includes extra dependencies that may make integration into real projects more difficult. These will be removed or streamlined in future releases to improve usability.
π Features
- π¦ Isolate widgets for independent development and testing
- π¨ Live preview with hot reload support
- π§ͺ Interactive params: bool, color, sliders, etc.
- π§© Built-in addons: pan, theme, safe area, viewport, reload
- π·οΈ Tags & searchable component catalog
- π Deep linking between stories and docs
- π MDX docs with live stories (WIP)
- π§Ή Linting for invalid/missing params (WIP)
- πΈ Golden test integration (WIP)
π¦ Packages
sandboxed
β Main runtime & viewer UIsandboxed_core
β Core primitives:Meta
,Story
,Params
, etc.sandboxed_generator
β Code generation for story/component registrysandboxed_ui_kit
β UI components used in the viewer (sidebar, layout, etc.)
π¦ Installation
-
Add it in your
pubspec.yaml
:dependencies: sandboxed_core: sandboxed: dev_dependencies: sandboxed_generator:
-
Install dependencies:
flutter pub get
-
Write Meta and stories
-
Run build_runner (required only when adding, renaming, removing
Meta
orStory
):flutter pub run build_runner build
π§° Usage
To create and preview a widget in sandboxed, define a Meta
and one or more Story
objects:
Meta get meta => Meta<SandboxButton>(
name: 'Button',
module: 'Features / Core',
component: SandboxButton,
decorators: [
Decorator((context, story) => Padding(
padding: const EdgeInsets.all(16),
child: story,
)),
],
);
Then define stories with configurable parameters:
Story get $Green => Story(
name: 'Green',
builder: (context, params) {
return SandboxButton(
onPressed: () {},
title: params.string('title').required("Lorem"),
color: params.color('color').required(Colors.green),
size: params.single('size', SandboxButtonSize.values)
.required(SandboxButtonSize.small),
);
},
);
Use params.boolean
, params.color
, params.string
, params.single
, or params.multi
to make your widget interactive in the UI.
Stories will be listed in the visual explorer and updated live via hot reload.
Warning
Important
Run flutter pub run build_runner build
after adding, renaming, removing Meta
or Story
getters to update the component registry.
β»οΈ Hot reload friendly: All other changes (e.g. story content, styling, params) are picked up automatically with hot reload.
π‘ VS Code Snippets
You can add these snippets to your VS Code to speed up writing stories and meta definitions.
Expand
How to add:
- Open Command Palette β
Preferences: Configure User Snippets
- Create or open a global or workspace snippet file
- Paste the following:
{
"Meta + Story": {
"prefix": "metastory",
"description": "Creates a new Sandboxed Story with default Meta",
"body": [
"import 'package:flutter/widgets.dart';",
"import 'package:sandboxed_core/sandboxed_core.dart';",
"",
"Meta get meta => Meta<${1:Widget}>();",
"",
"Story get $${2:Default} => Story($0);"
]
},
"Story": {
"prefix": "story",
"description": "Creates a new Sandboxed Story",
"body": [
"Story get $${2:Default} => Story($0);"
]
},
"Story Config": {
"prefix": "storyconfig",
"description": "Creates a global story config",
"body": [
"import 'package:sandboxed_core/sandboxed_core.dart';",
"",
"Config get config => Config(",
" module: '',",
");"
]
}
}
π Project Structure
apps/
βββ sandbox/ # App for testing sandboxed components in isolation
βββ sandboxed_library/ # App for testing Sandboxed UI Kit
packages/
βββ sandboxed/ # Main UI and logic for the sandbox viewer
βββ sandboxed_core/ # Low-level primitives for stories, components, params
βββ sandboxed_generator/ # Code generation tools for component discovery
βββ sandboxed_ui_kit/ # UI kit used internally by sandboxed apps
example/
βββ material_book/ # Demo showcasing Material widgets
βββ monorepo/ # Example of integrating Sandboxed into a monorepo
docs/ # Developer documentation and guides
.vscode/ # VSCode workspace configuration
melos.yaml # Melos workspace config for multi-package setup
pubspec.yaml # Root pubspec for tool-level dependencies
π Roadmap
- π URL state & session persistence (Done)
- π Generated docs from source/meta (Partial)
- π§ Param mismatch detection + fixes
- π§ͺ Golden test runner (local & cloud)
- π§° Extended param types (select, JSON, code)
- π Settings panel in UI
- π§ Pre-filled search filters
- π§© Lockable & toggleable addons
- π§ VS Code preview plugin (Maybe)
- β»οΈ Reduce dependency footprint
π§βπ» Contributing
Contributions are welcome!
Feel free to open issues, submit PRs, or suggest features.
π License
MIT License Β© 2025 Sandboxed, Vadim Melnikov
Libraries
- addons/addon
- addons/alignment/alignment_addon
- addons/alignment/alignment_picker
- addons/app/app_addon
- addons/decorator/decorator_addon
- addons/interactive_viewer/interactive_viewer_addon
- addons/keyboard/keyboard_addon
- addons/mixins/decorator_addon
- addons/mixins/editor_addon
- addons/mixins/param_builder_addon
- addons/param_builders/base_param_builders/color_param_builder
- addons/param_builders/base_param_builders/core/boolean_param_builder
- addons/param_builders/base_param_builders/core/chips_param_builder
- addons/param_builders/base_param_builders/core/integer_param_builder
- addons/param_builders/base_param_builders/core/number_param_builder
- addons/param_builders/base_param_builders/core/string_param_builder
- addons/param_builders/base_param_builders/flutter/alignment_param_builder
- addons/param_builders/base_param_builders/flutter/edge_insets_param_builder
- addons/param_builders/base_param_builders/flutter/text_style_param_builder
- addons/param_builders/base_param_builders_addon
- addons/reload/reload_addon
- addons/safe_area/safe_area_addon
- addons/split_themes/split_themes_addon
- addons/theme/theme_addon
- addons/typed_addons/flag_addon
- addons/viewport/viewport_addon
- feature_flags
- inspector/addons_inspector
- inspector/component_inspector
- inspector/params_editor
- layout/sandboxed_viewport
- layout/story_viewport
- model/tag_filter_state
- observers/delegate_route_observer
- pages/document/document_page
- pages/index_page
- pages/nothing/nothing_page
- pages/story/story_page
- params/default_serializers
- params/param_builder
- params/param_serializer
- params/params_notifier
- provider/addons
- provider/brand_color
- provider/component_tree
- provider/params
- provider/persistence
- provider/selected
- provider/theme_mode
- provider/title
- router
- router.gr
- sandboxed
- theme
- toolbar/toolbar
- toolbar/toolbar_addon_mixin
- tree/component_tree
- tree/component_tree_node
- tree/component_tree_parser
- tree/component_tree_x
- tree_next/element_tree
- utility/map_difference
- Copied from @devfelipereis/map_diff
- widgets/component_documentation
- widgets/element_name
- widgets/gap
- widgets/revive
- widgets/sandboxed_drawer
- widgets/sb_bottom_app_bar
- widgets/sb_notification_listener
- widgets/search_bar