From 0099aa0c67e3bd60af8225c13aa814b22410ffe2 Mon Sep 17 00:00:00 2001 From: Akzhol Serikkaliyev Date: Tue, 8 Sep 2026 12:23:15 +0500 Subject: [PATCH] feat: add StacIntrinsicHeight and StacIntrinsicWidth widgets Adds Stac equivalents of Flutter's IntrinsicHeight/IntrinsicWidth to stac_core, with parsers registered by default in the stac package. Motivating case: a row/column with crossAxisAlignment: stretch sitting somewhere with an unbounded cross-axis extent (e.g. inside a horizontally scrolling singleChildScrollView that is itself inside a vertically scrolling list) has nothing finite to stretch its children into, and layout fails with "BoxConstraints forces an infinite height/width". Wrapping the row/column in intrinsicHeight/intrinsicWidth computes a real size from the children first, so stretch has something concrete to work with. - stac_core: StacIntrinsicHeight, StacIntrinsicWidth models + WidgetType entries + widgets.dart exports. - stac: StacIntrinsicHeightParser, StacIntrinsicWidthParser, registered in the default parser list. - docs: widgets/intrinsic_height.mdx, widgets/intrinsic_width.mdx, nav entries in docs.json. - stac_playground: gallery entries + DSL/JSON examples for both widgets, and dsl_to_json.dart whitelist update so the live editor preview recognizes the new constructors. - tools/stac-vscode: regenerated widgetCatalog.ts entries for the two new widgets (hand-added rather than via a full catalog regen, since the committed catalog was already out of sync with widgets.dart for a few unrelated widgets). --- docs/docs.json | 2 + docs/widgets/intrinsic_height.mdx | 151 ++++++++++++++++++ docs/widgets/intrinsic_width.mdx | 150 +++++++++++++++++ .../stac/lib/src/framework/stac_service.dart | 2 + .../stac_intrinsic_height_parser.dart | 20 +++ .../stac_intrinsic_width_parser.dart | 24 +++ .../stac/lib/src/parsers/widgets/widgets.dart | 2 + .../specifications/widget_type.dart | 6 + .../stac_intrinsic_height.dart | 69 ++++++++ .../stac_intrinsic_height.g.dart | 21 +++ .../intrinsic_width/stac_intrinsic_width.dart | 72 +++++++++ .../stac_intrinsic_width.g.dart | 24 +++ packages/stac_core/lib/widgets/widgets.dart | 2 + .../assets/json/intrinsic_height_example.json | 68 ++++++++ .../assets/json/intrinsic_width_example.json | 50 ++++++ .../lib/data/component_entries.dart | 20 +++ stac_playground/lib/data/dsl_to_json.dart | 2 + stac_playground/lib/dsl/intrinsic_height.dart | 53 ++++++ stac_playground/lib/dsl/intrinsic_width.dart | 37 +++++ .../src/generated/widgetCatalog.ts | 12 ++ 20 files changed, 787 insertions(+) create mode 100644 docs/widgets/intrinsic_height.mdx create mode 100644 docs/widgets/intrinsic_width.mdx create mode 100644 packages/stac/lib/src/parsers/widgets/stac_intrinsic_height/stac_intrinsic_height_parser.dart create mode 100644 packages/stac/lib/src/parsers/widgets/stac_intrinsic_width/stac_intrinsic_width_parser.dart create mode 100644 packages/stac_core/lib/widgets/intrinsic_height/stac_intrinsic_height.dart create mode 100644 packages/stac_core/lib/widgets/intrinsic_height/stac_intrinsic_height.g.dart create mode 100644 packages/stac_core/lib/widgets/intrinsic_width/stac_intrinsic_width.dart create mode 100644 packages/stac_core/lib/widgets/intrinsic_width/stac_intrinsic_width.g.dart create mode 100644 stac_playground/assets/json/intrinsic_height_example.json create mode 100644 stac_playground/assets/json/intrinsic_width_example.json create mode 100644 stac_playground/lib/dsl/intrinsic_height.dart create mode 100644 stac_playground/lib/dsl/intrinsic_width.dart diff --git a/docs/docs.json b/docs/docs.json index 0475eea04..81148c351 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -74,6 +74,8 @@ "widgets/flexible", "widgets/fitted_box", "widgets/fractionally_sized_box", + "widgets/intrinsic_height", + "widgets/intrinsic_width", "widgets/limited_box", "widgets/padding", "widgets/positioned", diff --git a/docs/widgets/intrinsic_height.mdx b/docs/widgets/intrinsic_height.mdx new file mode 100644 index 000000000..0e6a05860 --- /dev/null +++ b/docs/widgets/intrinsic_height.mdx @@ -0,0 +1,151 @@ +--- +title: "IntrinsicHeight" +description: "Documentation for IntrinsicHeight" +--- + +import { PLAYGROUND_BASE_URL } from "/snippets/playground_base.mdx"; + +export const intrinsicHeightPreviewJson = { + "type": "intrinsicHeight", + "child": { + "type": "row", + "crossAxisAlignment": "stretch", + "children": [ + { + "type": "container", + "width": 60, + "color": "#FF5733", + "child": { + "type": "text", + "data": "Short" + } + }, + { + "type": "container", + "width": 60, + "color": "#33A1FF", + "child": { + "type": "text", + "data": "A much longer piece of text" + } + } + ] + } +}; +export const intrinsicHeightPreviewSrc = `${PLAYGROUND_BASE_URL}/embed`; + +The Stac IntrinsicHeight allows you to build a Flutter intrinsic height widget using JSON. +To know more about the intrinsic height widget in Flutter, refer to the [official documentation](https://api.flutter.dev/flutter/widgets/IntrinsicHeight-class.html). + +`IntrinsicHeight` sizes its child to the child's maximum intrinsic height. It is most useful +inside a `row` that uses `crossAxisAlignment: stretch`, when the row itself sits somewhere +with an unbounded height — for example inside a horizontally scrolling +`singleChildScrollView` that is itself inside a vertically scrolling list. In that situation +`stretch` has no finite height to stretch its children into and layout fails; wrapping the +`row` in `intrinsicHeight` computes a real height first, so every child of the row ends up +the same height as the tallest one. + + +`intrinsicHeight` is relatively expensive because it performs a speculative extra layout +pass before the final layout. Prefer giving the child a fixed height where you can, and +reach for `intrinsicHeight` only when the height genuinely needs to be computed from the +content. + + +## Properties + +| Property | Type | Description | +|----------|--------------|----------------------------------------------------------| +| child | `StacWidget` | The widget to size to its own maximum intrinsic height. | + +## Example + + + + +```dart +StacIntrinsicHeight( + child: StacRow( + crossAxisAlignment: StacCrossAxisAlignment.stretch, + children: [ + StacContainer( + width: 60, + color: StacColors.deepOrange, + child: StacText(data: 'Short'), + ), + StacContainer( + width: 60, + color: StacColors.blue, + child: StacText(data: 'A much longer piece of text'), + ), + ], + ), +) +``` + + + + +```json +{ + "type": "intrinsicHeight", + "child": { + "type": "row", + "crossAxisAlignment": "stretch", + "children": [ + { + "type": "container", + "width": 60, + "color": "#FF5733", + "child": { + "type": "text", + "data": "Short" + } + }, + { + "type": "container", + "width": 60, + "color": "#33A1FF", + "child": { + "type": "text", + "data": "A much longer piece of text" + } + } + ] + } +} +``` + + + + +