From 064026aee89217f4c5dc1c80e58287b1bbe609c7 Mon Sep 17 00:00:00 2001 From: Akhil George Date: Sat, 17 Jan 2026 16:49:36 +0530 Subject: [PATCH 1/8] feat: Add SliverPadding widget and its parser with documentation --- docs/docs.json | 1 + docs/widgets/sliver_padding.mdx | 40 +++++++++++++ .../stac_sliver_padding_parser.dart | 25 ++++++++ .../stac/lib/src/parsers/widgets/widgets.dart | 1 + .../specifications/widget_type.dart | 3 + .../sliver_padding/stac_sliver_padding.dart | 60 +++++++++++++++++++ .../sliver_padding/stac_sliver_padding.g.dart | 20 +++++++ packages/stac_core/lib/widgets/widgets.dart | 1 + 8 files changed, 151 insertions(+) create mode 100644 docs/widgets/sliver_padding.mdx create mode 100644 packages/stac/lib/src/parsers/widgets/stac_sliver_padding/stac_sliver_padding_parser.dart create mode 100644 packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart create mode 100644 packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.g.dart diff --git a/docs/docs.json b/docs/docs.json index fd959aa4..927b080c 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -68,6 +68,7 @@ "widgets/row", "widgets/safe_area", "widgets/sized_box", + "widgets/sliver_padding", "widgets/spacer", "widgets/stack", "widgets/wrap", diff --git a/docs/widgets/sliver_padding.mdx b/docs/widgets/sliver_padding.mdx new file mode 100644 index 00000000..b41d6430 --- /dev/null +++ b/docs/widgets/sliver_padding.mdx @@ -0,0 +1,40 @@ +--- +title: "SliverPadding" +description: "Documentation for SliverPadding" +--- + +The Stac SliverPadding allows you to inset a sliver widget by a given padding using JSON. It is typically used inside a `CustomScrollView`. +To know more about the sliver padding widget in Flutter, refer to +the [official documentation](https://api.flutter.dev/flutter/widgets/SliverPadding-class.html). + +## Properties + +| Property | Type | Description | +|----------|-------------------------|---------------------------------------------------| +| padding | `Map` | The amount of space by which to inset the child. | +| sliver | `Map` | The sliver widget inside the padding. | + +## Example JSON + +```json +{ + "type": "sliverPadding", + "padding": { + "all": 16 + }, + "sliver": { + "type": "sliverList", + "delegate": { + "children": [ + { + "type": "text", + "data": "Item 1" + }, + { + "type": "text", + "data": "Item 2" + } + ] + } + } +} \ No newline at end of file diff --git a/packages/stac/lib/src/parsers/widgets/stac_sliver_padding/stac_sliver_padding_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_sliver_padding/stac_sliver_padding_parser.dart new file mode 100644 index 00000000..617ae99d --- /dev/null +++ b/packages/stac/lib/src/parsers/widgets/stac_sliver_padding/stac_sliver_padding_parser.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:stac/src/parsers/core/stac_widget_parser.dart'; + +import 'package:stac/src/parsers/foundation/geometry/stac_edge_insets_parser.dart'; +import 'package:stac_core/stac_core.dart'; +import 'package:stac_framework/stac_framework.dart'; + +class StacSliverPaddingParser extends StacParser { + const StacSliverPaddingParser(); + + @override + String get type => WidgetType.sliverPadding.name; + + @override + StacSliverPadding getModel(Map json) => + StacSliverPadding.fromJson(json); + + @override + Widget parse(BuildContext context, StacSliverPadding model) { + return SliverPadding( + padding: model.padding.parse, + sliver: model.sliver.parse(context), + ); + } +} diff --git a/packages/stac/lib/src/parsers/widgets/widgets.dart b/packages/stac/lib/src/parsers/widgets/widgets.dart index 64af1ef0..aff93ef0 100644 --- a/packages/stac/lib/src/parsers/widgets/widgets.dart +++ b/packages/stac/lib/src/parsers/widgets/widgets.dart @@ -63,6 +63,7 @@ export 'package:stac/src/parsers/widgets/stac_single_child_scroll_view/stac_sing export 'package:stac/src/parsers/widgets/stac_sized_box/stac_sized_box_parser.dart'; export 'package:stac/src/parsers/widgets/stac_slider/stac_slider_parser.dart'; export 'package:stac/src/parsers/widgets/stac_sliver_app_bar/stac_sliver_app_bar_parser.dart'; +export 'package:stac/src/parsers/widgets/stac_sliver_padding/stac_sliver_padding_parser.dart'; export 'package:stac/src/parsers/widgets/stac_spacer/stac_spacer_parser.dart'; export 'package:stac/src/parsers/widgets/stac_stack/stac_stack_parser.dart'; export 'package:stac/src/parsers/widgets/stac_switch/stac_switch_parser.dart'; diff --git a/packages/stac_core/lib/foundation/specifications/widget_type.dart b/packages/stac_core/lib/foundation/specifications/widget_type.dart index 3ec06747..f53163cf 100644 --- a/packages/stac_core/lib/foundation/specifications/widget_type.dart +++ b/packages/stac_core/lib/foundation/specifications/widget_type.dart @@ -207,6 +207,9 @@ enum WidgetType { /// Sliver app bar widget sliverAppBar, + /// Sliver padding widget + sliverPadding, + /// Spacer widget spacer, diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart new file mode 100644 index 00000000..7d2701c3 --- /dev/null +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart @@ -0,0 +1,60 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_core/core/stac_widget.dart'; +import 'package:stac_core/foundation/foundation.dart'; +part 'stac_sliver_padding.g.dart'; + +/// A Stac model representing Flutter's [SliverPadding] widget. +/// +/// Insets its sliver child by the given padding. +/// +/// {@tool snippet} +/// Dart Example: +/// ```dart +/// const StacSliverPadding( +/// padding: StacEdgeInsets.all(16), +/// sliver: StacSliverList(...), +/// ) +/// ``` +/// {@end-tool} +/// +/// {@tool snippet} +/// JSON Example: +/// ```json +/// { +/// "type": "sliverPadding", +/// "padding": { "all": 16 }, +/// "sliver": { +/// "type": "sliverList", +/// "children": [ +/// { "type": "text", "data": "Item 1" } +/// ] +/// } +/// } +/// ``` +/// {@end-tool} +/// +/// See also: +/// * Flutter's [SliverPadding documentation](https://api.flutter.dev/flutter/widgets/SliverPadding-class.html) +@JsonSerializable() +class StacSliverPadding extends StacWidget { + /// Creates a [StacSliverPadding]. + const StacSliverPadding({required this.sliver, required this.padding}); + + /// The amount of space by which to inset the child sliver. + final StacEdgeInsets padding; + + /// The sliver to apply padding to. + final StacWidget sliver; + + /// Widget type identifier. + @override + String get type => WidgetType.sliverPadding.name; + + /// Creates a [StacSliverPadding] from a JSON map. + factory StacSliverPadding.fromJson(Map json) => + _$StacSliverPaddingFromJson(json); + + /// Converts this [StacSliverPadding] instance to JSON. + @override + Map toJson() => _$StacSliverPaddingToJson(this); +} diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.g.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.g.dart new file mode 100644 index 00000000..a0bee456 --- /dev/null +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.g.dart @@ -0,0 +1,20 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_sliver_padding.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StacSliverPadding _$StacSliverPaddingFromJson(Map json) => + StacSliverPadding( + sliver: StacWidget.fromJson(json['sliver'] as Map), + padding: StacEdgeInsets.fromJson(json['padding']), + ); + +Map _$StacSliverPaddingToJson(StacSliverPadding instance) => + { + 'padding': instance.padding.toJson(), + 'sliver': instance.sliver.toJson(), + 'type': instance.type, + }; diff --git a/packages/stac_core/lib/widgets/widgets.dart b/packages/stac_core/lib/widgets/widgets.dart index ce5bf976..973fe313 100644 --- a/packages/stac_core/lib/widgets/widgets.dart +++ b/packages/stac_core/lib/widgets/widgets.dart @@ -67,6 +67,7 @@ export 'single_child_scroll_view/stac_single_child_scroll_view.dart'; export 'sized_box/stac_sized_box.dart'; export 'slider/stac_slider.dart'; export 'sliver_app_bar/stac_sliver_app_bar.dart'; +export 'sliver_padding/stac_sliver_padding.dart'; export 'spacer/stac_spacer.dart'; export 'stack/stac_stack.dart'; export 'switch/stac_switch.dart'; From 434bd4c50854f1fcdfebbd720815cc607e10d564 Mon Sep 17 00:00:00 2001 From: Akhil George Date: Sat, 17 Jan 2026 18:34:39 +0530 Subject: [PATCH 2/8] feat: Add SliverPaddingParser to StacService --- packages/stac/lib/src/framework/stac_service.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stac/lib/src/framework/stac_service.dart b/packages/stac/lib/src/framework/stac_service.dart index d3dd4f57..6e7a87e6 100644 --- a/packages/stac/lib/src/framework/stac_service.dart +++ b/packages/stac/lib/src/framework/stac_service.dart @@ -114,6 +114,7 @@ class StacService { const StacRadioGroupParser(), const StacSliderParser(), const StacSliverAppBarParser(), + const StacSliverPaddingParser(), const StacOpacityParser(), const StacPlaceholderParser(), const StacAspectRatioParser(), From ab00df43f8a4d4b744b04e478e3058f576d8337e Mon Sep 17 00:00:00 2001 From: Akhil George Date: Sat, 17 Jan 2026 18:45:25 +0530 Subject: [PATCH 3/8] fix: Update SliverPadding documentation and examples for accuracy --- docs/widgets/sliver_padding.mdx | 37 +++++++++++-------- .../stac_gallery/assets/json/home_screen.json | 24 ++++++++++++ .../assets/json/sliver_padding_example.json | 33 +++++++++++++++++ .../sliver_padding/stac_sliver_padding.dart | 37 +++++++++++++------ 4 files changed, 104 insertions(+), 27 deletions(-) create mode 100644 examples/stac_gallery/assets/json/sliver_padding_example.json diff --git a/docs/widgets/sliver_padding.mdx b/docs/widgets/sliver_padding.mdx index b41d6430..cc570748 100644 --- a/docs/widgets/sliver_padding.mdx +++ b/docs/widgets/sliver_padding.mdx @@ -9,10 +9,10 @@ the [official documentation](https://api.flutter.dev/flutter/widgets/SliverPaddi ## Properties -| Property | Type | Description | -|----------|-------------------------|---------------------------------------------------| -| padding | `Map` | The amount of space by which to inset the child. | -| sliver | `Map` | The sliver widget inside the padding. | +| Property | Type | Description | +|----------|------------------------|--------------------------------------------------| +| padding | `Map` | The amount of space by which to inset the child. | +| sliver | `Map` | The sliver widget inside the padding. | ## Example JSON @@ -20,21 +20,26 @@ the [official documentation](https://api.flutter.dev/flutter/widgets/SliverPaddi { "type": "sliverPadding", "padding": { - "all": 16 + "all": 16.0 }, "sliver": { - "type": "sliverList", - "delegate": { - "children": [ - { + "type": "sliverToBoxAdapter", + "child": { + "type": "container", + "height": 150, + "color": "#4CAF50", + "child": { + "type": "center", + "child": { "type": "text", - "data": "Item 1" - }, - { - "type": "text", - "data": "Item 2" + "data": "I am a Box inside a SliverPadding!", + "style": { + "color": "#FFFFFF", + "fontWeight": "bold" + } } - ] + } } } -} \ No newline at end of file +} +``` \ No newline at end of file diff --git a/examples/stac_gallery/assets/json/home_screen.json b/examples/stac_gallery/assets/json/home_screen.json index 5c77c8e9..7636fd07 100644 --- a/examples/stac_gallery/assets/json/home_screen.json +++ b/examples/stac_gallery/assets/json/home_screen.json @@ -1236,6 +1236,30 @@ } } }, + { + "type": "listTile", + "leading": { + "type": "icon", + "iconType": "cupertino", + "icon": "app_fill" + }, + "title": { + "type": "text", + "data": "Stac Sliver Padding" + }, + "subtitle": { + "type": "text", + "data": "A Material Design Sliver Padding widget" + }, + "style": "list", + "onTap": { + "actionType": "navigate", + "widgetJson": { + "type": "exampleScreen", + "assetPath": "assets/json/sliver_padding_example.json" + } + } + }, { "type": "listTile", "leading": { diff --git a/examples/stac_gallery/assets/json/sliver_padding_example.json b/examples/stac_gallery/assets/json/sliver_padding_example.json new file mode 100644 index 00000000..673f7a91 --- /dev/null +++ b/examples/stac_gallery/assets/json/sliver_padding_example.json @@ -0,0 +1,33 @@ +{ + "type": "scaffold", + "body": { + "type": "customScrollView", + "slivers": [ + { + "type": "sliverPadding", + "padding": { + "all": 16.0 + }, + "sliver": { + "type": "sliverToBoxAdapter", + "child": { + "type": "container", + "height": 150, + "color": "#4CAF50", + "child": { + "type": "center", + "child": { + "type": "text", + "data": "I am a Box inside a SliverPadding!", + "style": { + "color": "#FFFFFF", + "fontWeight": "bold" + } + } + } + } + } + } + ] + } +} \ No newline at end of file diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart index 7d2701c3..990c674c 100644 --- a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart @@ -12,7 +12,7 @@ part 'stac_sliver_padding.g.dart'; /// ```dart /// const StacSliverPadding( /// padding: StacEdgeInsets.all(16), -/// sliver: StacSliverList(...), +/// sliver: StacSliverToBoxAdapter(...), /// ) /// ``` /// {@end-tool} @@ -20,16 +20,31 @@ part 'stac_sliver_padding.g.dart'; /// {@tool snippet} /// JSON Example: /// ```json -/// { -/// "type": "sliverPadding", -/// "padding": { "all": 16 }, -/// "sliver": { -/// "type": "sliverList", -/// "children": [ -/// { "type": "text", "data": "Item 1" } -/// ] -/// } -/// } +// { +// "type": "sliverPadding", +// "padding": { +// "all": 16.0 +// }, +// "sliver": { +// "type": "sliverToBoxAdapter", +// "child": { +// "type": "container", +// "height": 150, +// "color": "#4CAF50", +// "child": { +// "type": "center", +// "child": { +// "type": "text", +// "data": "I am a Box inside a SliverPadding!", +// "style": { +// "color": "#FFFFFF", +// "fontWeight": "bold" +// } +// } +// } +// } +// } +// } /// ``` /// {@end-tool} /// From 41767e287f81db1e53d0387226b8f26508c07d68 Mon Sep 17 00:00:00 2001 From: Akhil George Date: Sat, 17 Jan 2026 19:12:44 +0530 Subject: [PATCH 4/8] fix: Correct SliverPadding widget description and update JSON example formatting --- .../stac_gallery/assets/json/home_screen.json | 2 +- .../sliver_padding/stac_sliver_padding.dart | 50 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/examples/stac_gallery/assets/json/home_screen.json b/examples/stac_gallery/assets/json/home_screen.json index 7636fd07..2045e1d9 100644 --- a/examples/stac_gallery/assets/json/home_screen.json +++ b/examples/stac_gallery/assets/json/home_screen.json @@ -1249,7 +1249,7 @@ }, "subtitle": { "type": "text", - "data": "A Material Design Sliver Padding widget" + "data": "A Material Design SliverPadding widget" }, "style": "list", "onTap": { diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart index 990c674c..b37e3b1a 100644 --- a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart @@ -20,31 +20,31 @@ part 'stac_sliver_padding.g.dart'; /// {@tool snippet} /// JSON Example: /// ```json -// { -// "type": "sliverPadding", -// "padding": { -// "all": 16.0 -// }, -// "sliver": { -// "type": "sliverToBoxAdapter", -// "child": { -// "type": "container", -// "height": 150, -// "color": "#4CAF50", -// "child": { -// "type": "center", -// "child": { -// "type": "text", -// "data": "I am a Box inside a SliverPadding!", -// "style": { -// "color": "#FFFFFF", -// "fontWeight": "bold" -// } -// } -// } -// } -// } -// } +/// { +/// "type": "sliverPadding", +/// "padding": { +/// "all": 16.0 +/// }, +/// "sliver": { +/// "type": "sliverToBoxAdapter", +/// "child": { +/// "type": "container", +/// "height": 150, +/// "color": "#4CAF50", +/// "child": { +/// "type": "center", +/// "child": { +/// "type": "text", +/// "data": "I am a Box inside a SliverPadding!", +/// "style": { +/// "color": "#FFFFFF", +/// "fontWeight": "bold" +/// } +/// } +/// } +/// } +/// } +/// } /// ``` /// {@end-tool} /// From 390c7a953d565c23f40567d10de606c82ad04579 Mon Sep 17 00:00:00 2001 From: Akhil George Date: Sat, 17 Jan 2026 20:04:26 +0530 Subject: [PATCH 5/8] fix: Update subtitle for SliverPadding widget in home_screen.json --- examples/stac_gallery/assets/json/home_screen.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/stac_gallery/assets/json/home_screen.json b/examples/stac_gallery/assets/json/home_screen.json index 2045e1d9..fbf1488f 100644 --- a/examples/stac_gallery/assets/json/home_screen.json +++ b/examples/stac_gallery/assets/json/home_screen.json @@ -1249,7 +1249,7 @@ }, "subtitle": { "type": "text", - "data": "A Material Design SliverPadding widget" + "data": "A SliverPadding widget" }, "style": "list", "onTap": { From 59c480430e5c352cf711bfe010d0e77821027a75 Mon Sep 17 00:00:00 2001 From: Akhil George Date: Tue, 27 Jan 2026 16:27:44 +0530 Subject: [PATCH 6/8] fix: Simplify padding structure in SliverPadding JSON examples and documentation --- docs/widgets/sliver_padding.mdx | 4 +--- examples/stac_gallery/assets/json/sliver_padding_example.json | 4 +--- .../lib/widgets/sliver_padding/stac_sliver_padding.dart | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/docs/widgets/sliver_padding.mdx b/docs/widgets/sliver_padding.mdx index cc570748..5f1bfb33 100644 --- a/docs/widgets/sliver_padding.mdx +++ b/docs/widgets/sliver_padding.mdx @@ -19,9 +19,7 @@ the [official documentation](https://api.flutter.dev/flutter/widgets/SliverPaddi ```json { "type": "sliverPadding", - "padding": { - "all": 16.0 - }, + "padding": 16.0, "sliver": { "type": "sliverToBoxAdapter", "child": { diff --git a/examples/stac_gallery/assets/json/sliver_padding_example.json b/examples/stac_gallery/assets/json/sliver_padding_example.json index 673f7a91..6e0f0612 100644 --- a/examples/stac_gallery/assets/json/sliver_padding_example.json +++ b/examples/stac_gallery/assets/json/sliver_padding_example.json @@ -5,9 +5,7 @@ "slivers": [ { "type": "sliverPadding", - "padding": { - "all": 16.0 - }, + "padding": 16.0, "sliver": { "type": "sliverToBoxAdapter", "child": { diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart index b37e3b1a..55cb6cfc 100644 --- a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart @@ -22,9 +22,7 @@ part 'stac_sliver_padding.g.dart'; /// ```json /// { /// "type": "sliverPadding", -/// "padding": { -/// "all": 16.0 -/// }, +/// "padding": 16.0, /// "sliver": { /// "type": "sliverToBoxAdapter", /// "child": { From 98c118e776588912ce54ec6aaf2887b3e456348a Mon Sep 17 00:00:00 2001 From: Akhil George Date: Tue, 27 Jan 2026 16:35:30 +0530 Subject: [PATCH 7/8] fix: Enable explicit JSON serialization for StacSliverPadding --- .../lib/widgets/sliver_padding/stac_sliver_padding.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart index 55cb6cfc..8a8ea852 100644 --- a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart @@ -48,7 +48,7 @@ part 'stac_sliver_padding.g.dart'; /// /// See also: /// * Flutter's [SliverPadding documentation](https://api.flutter.dev/flutter/widgets/SliverPadding-class.html) -@JsonSerializable() +@JsonSerializable(explicitToJson: true) class StacSliverPadding extends StacWidget { /// Creates a [StacSliverPadding]. const StacSliverPadding({required this.sliver, required this.padding}); From 9f6359ea508cb4795b185b54e43144ef26170aeb Mon Sep 17 00:00:00 2001 From: Akhil George Date: Wed, 28 Jan 2026 00:33:44 +0530 Subject: [PATCH 8/8] fix: remove explicitToJson from StacSliverPadding JSON serialization --- .../lib/widgets/sliver_padding/stac_sliver_padding.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart index 8a8ea852..55cb6cfc 100644 --- a/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart +++ b/packages/stac_core/lib/widgets/sliver_padding/stac_sliver_padding.dart @@ -48,7 +48,7 @@ part 'stac_sliver_padding.g.dart'; /// /// See also: /// * Flutter's [SliverPadding documentation](https://api.flutter.dev/flutter/widgets/SliverPadding-class.html) -@JsonSerializable(explicitToJson: true) +@JsonSerializable() class StacSliverPadding extends StacWidget { /// Creates a [StacSliverPadding]. const StacSliverPadding({required this.sliver, required this.padding});