flutter_adaptive_cards_fs 0.16.0
flutter_adaptive_cards_fs: ^0.16.0 copied to clipboard
Adaptive Cards are platform-agnostic snippets of UI, authored in JSON, that apps and services can openly exchange.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
0.16.0 #
- fix: an unrecognized/removed element or action type now renders a visible
AdaptiveErrorPlaceholder(broken-image icon + error text, announced as a live region) in every build mode, replacing the debug-onlyErrorWidgetthat showed nothing in release builds. - fix:
Imageelements now show theAdaptiveErrorPlaceholder(with the failing URL) when a permitted network URL fails to fetch or decode, instead of silently rendering nothing. Previously only URLs denied byAdaptiveUriPolicygot a visible broken-image icon (with no text); genuine 404/network/decode failures on an allowed URL had noerrorBuilderand produced no visible feedback. - chore: removed a stale
golden_toolkitreference from the README known-issues list. The package is not a dependency of this repo and has not been for some time; golden tests use the built-inmatchesGoldenFile, and the test jig loads fonts explicitly, so the "black bars if the font isn't loaded" caveat no longer applies. - chore: deleted a duplicate Linux golden baseline (
test/gold_files/linux/v1_6_compound_button copy.png, byte-identical tov1_6_compound_button.png). The Linux and macOS baseline sets are now at parity, 41 each.
0.15.0 #
Added 0.15.0 #
Tableaccessibility: header-row cells are now exposed to assistive technology as headers (Semantics(header: true)), and body cells are announced with their column header ("Status Delayed" rather than a context-free "Delayed"). Flutter'sTableprovides no row/column association, so cells previously carried no semantics at all. Cells are annotated, not merged, so a cell'sselectActionor nestedInput.*stays independently focusable. Columns whose header cell has no text (image-only) are left unlabeled rather than given a placeholder name.- test: add golden verifying HostConfig container-style
backgroundColorand ColumnSetstretch/autoalignment render as expected. - feat:
Containersupports the Microsoft TeamsroundedCornersproperty (rounds the style fill + clips children), opt-in via"roundedCorners": true. The radius is resolved via a new HostConfigcornerRadiusfield (default 8,HostConfig.fromJson/ReferenceResolver.resolveCornerRadius()) rather than fixed.ColumnSet/Column/Table/Imageare not wired yet. - feat:
ColumnSetandColumnsupport the TeamsroundedCornersproperty (radius via HostConfig, default 8), mirroring theContainerimplementation.Table/Imageare not wired yet. - feat:
Tablesupports the TeamsroundedCornersproperty (clips the table + rounds the grid border; radius via HostConfig).Tablerenders via a bespoke FlutterTablerather than thegetDecorationFromMappath used byContainer/ColumnSet/Column, so rounding is aClipRRectwrapper plus aTableBorder.borderRadius.Imageis not wired yet. - feat:
Imagesupports the TeamsroundedCornersproperty (style: personcircle takes precedence); completesroundedCornerson all five Teams elements (Container/ColumnSet/Column/Table/Image). - feat:
Input.TextsupportsinlineAction(standard, Adaptive Cards v1.2+) — renders the action beside the field viacardTypeRegistry.getAction, wired to the full submit/execute pipeline. - feat:
Input.Textnow triggers itsinlineActionon Ctrl/Cmd+Enter when the field has focus, using the same submit/execute pipeline as the visible action button and doing nothing when no inline action is present. - feat: an action
iconUrlmay reference a Fluent icon withicon:<name>(e.g.icon:Send), resolved via the same map theIconelement uses; any other value is loaded as an image URL / data URI. Icon-only rendering (icon instead of the title, per theinlineActionspec) is a follow-up. - feat:
CarouselPagesupportsselectAction(standard, per the Adaptive Cards spec) — tapping a page invokes the action via the sharedAdaptiveTappablewrapper, exposed to screen readers as a button.selectActionis scoped to the page only, not theCarouselelement itself, matching the spec. Thev1.6/carousel.jsonsample (test + widgetbook) now demonstrates it with anAction.OpenUrlon the first page. - Carousel: replaced the fixed 400px height with the spec height model —
height(auto/stretch) andheightInPixels— and, for the defaultautocase, size the carousel to its tallest page. Orientation stays independent ofheightInPixels. - Carousel: guard
heightInPixelsagainst non-positive values ("-50px","0px") — they now fall back to the measured/auto height instead of collapsing or crashing theSizedBox. ElementOverlayExtensionnow declares an explicitconstconstructor. It previously had no explicit constructor at all, so subclasses could not beconst; extension packages can now define canonical const instances (see the matchingflutter_adaptive_charts_fsentry).
Changed 0.15.0 #
FullCircleClippernow has aconstconstructor, and thestyle: personimage path (ClipOval(clipper: const FullCircleClipper())) uses a canonical const instance instead of heap-allocating a fresh clipper on every rebuild.- Internal cleanup (no behavior change) — applied
dart formatacross the package (lib/+test/), fixing drift in four files.lib/src/cards/adaptive_card_element.dartwas the one that mattered beyond tidiness: pana scores formatting as part of its static-analysis section and only inspectslib/, so that single over-wrapped line cost the package 10 of its 50 static-analysis points. No API or runtime changes.
Removed 0.15.0 #
- BREAKING (internal-only):
AdaptiveCardsCanvasStateandFadeAnimationStateare now private (_AdaptiveCardsCanvasState/_FadeAnimationState). They were never part of the intended public API — they leaked out becauseflutter_adaptive_cards_fs.dartexportsadaptive_cards_canvas.dartandflutter_adaptive_cards_extend_fs.dartre-exportsutils/utils.dartwithoutshowclauses — and had zero references anywhere in the repo, including widgetbook, examples, and tests.AdaptiveCardsCanvasStateadditionally exposed mutablemap/initData/onChangefields; making the class private enforces structurally what its doc comment could only advise.RawAdaptiveCardStateremains public and supported: it is the type argument forGlobalKey<RawAdaptiveCardState>, used acrossflutter_adaptive_cards_host_fs,flutter_adaptive_charts_fs, widgetbook, and tests.
Fixed 0.15.0 #
- docs: add missing
///on public default constructors reported by pana (AdaptiveCardContentProvider,RawAdaptiveCardState,AdaptiveTappableState,FullCircleClipper,AdaptiveUriValidationResult,ElementOverlayExtension). - docs:
ReferenceResolver.resolveCornerRadius()andFallbackConfigs.cornerRadiusdoc comments no longer sayroundedCornersis wired for "Container only" — that was stale onceColumnSet/Column/Table/Imageshipped; both now match the accurate wording already incontainer.dart(wired on all five elements). Mediaposteris now visible until the user starts playback. The poster was only rendered while the player was initializing, so it vanished a moment after the card appeared and authors effectively never saw it. The poster is now the click-to-play surface described by the spec: it shows a play button, and theVideoPlayerControlleris created only when the user taps it (no network player is opened for everyMediaelement on card load). A poster-lessMediastill renders the play affordance so the video remains playable.FactSettitles are bold again when the HostConfig omits afactSetsection. ThefactSet.title.weightspec default ofbolderlives inFactSetConfig.fromJson, but that only runs when the JSON actually contains afactSetobject; a HostConfig without one (including the defaultconst HostConfig()) leftgetFactSetConfig()null, and the widget's own?? 'default'fallback rendered titles at the normal value weight. AddedFallbackConfigs.factSetConfig(mirroringfontWeightsConfig/fontSizesConfig/etc.) and use it as the null fallback, so titles bold correctly under any HostConfig.
0.14.0 #
Added 0.14.0 #
- Add root
authenticationsign-in button support: parse theauthenticationobject, render a sign-in region, and forward aSigninActionInvoketo the new nullableonSigninhandler (falls back toonOpenUrlfor URL values). SSOtokenExchangeResourceis parsed but not exchanged. Tableauto/stretchcolumn widths + cellminHeight— theTableelement now renders through Flutter'sTablewidget, so columnwidthvaluesauto(content-sized, consistent across rows) andstretch(fills remaining space) work alongside the existing numeric weights andNpxpixel widths. CellminHeightis now applied. Equal row height and per-cell background fill are preserved viaTableCellVerticalAlignment.intrinsicHeight; grid lines now useTableBorder. All existing cell behaviors (background color/image, header styling,selectAction, alignment, responsivelayouts) are unchanged. RemainingTablegaps:bleedand cell-levelrtl.- Behavioral tests for custom/extended elements previously marked "Limited" (visibility-only coverage). New dedicated test files exercise element behavior:
Accordion(per-section expand/collapse),ProgressBarandProgressRing(determinate/indeterminate +valueclamping; ringlabel/labelPosition),TabSet(tab rendering + tap-to-switch),CarouselPage(items+showBorder), and the read-onlyRatingdisplay (filled/empty star rendering + defaults). README Tests column upgraded to ✅ for these rows. - Coverage tests for low-coverage classes — Lifts
flutter_adaptive_cards_fsline coverage from ~88.9% to ~90.1%; CI coverage floor raised 88 → 90. - Accessibility semantics for interactive elements.
selectActiontargets are now exposed as buttons with an accessible name (the actiontitle/tooltip); theRatingdisplay andInput.Ratingannounce their value ("x of y stars"), with the interactive input adjustable via increase/decrease; and carousel page dots carry"Go to slide N"labels with selected state. Covered bytest/accessibility_semantics_test.dart. - Input label → control association for
Input.Toggle,Input.Rating, andInput.ChoiceSet. TheInput.Toggleswitch, theInput.Ratingstar control, and the compact/filteredInput.ChoiceSetfield now announce their inputlabel(previously only a detached visualText); expandedInput.ChoiceSetexposes thelabelas a group name while keeping each option individually focusable. Covered bytest/input_label_semantics_test.dart. - Input label → control association for
Input.Text,Input.Number,Input.Date, andInput.Time; spoken required state; and live-region validation errors. These fields rendered theirlabelonly as a detached siblingText(andInput.Timedropped thelabelentirely), so a screen reader announced no name when the control was focused. The field is now wrapped withlabelInputSemantics(a layout-neutralMergeSemantics+Semantics(label:)) and the visible label is excluded from semantics, so focusing the control announces its name. Required fields — previously flagged only by a visual*— now append", required"to the spoken name, andloadErrorMessagemarks the error text as aliveRegionso validation failures are announced when they appear. New helpersinputSemanticsLabel/labelInputSemanticsinutils.dart. Covered bytest/input_label_semantics_test.dartandtest/input_error_and_progress_a11y_test.dart. ProgressBarandProgressRingvalue semantics. Both indicators now expose their completion percentage (and, for the ring, its authorlabel) to screen readers via the Flutter indicators' built-insemanticsLabel/semanticsValue; an indeterminateProgressBarstill carries a"Progress"label. Covered bytest/input_error_and_progress_a11y_test.dart.- TextBlock heading level, FactSet fact grouping, and icon token de-duplication. Heading-styled
TextBlocks now emitSemantics(headingLevel:)sourced from HostConfigtextBlock.headingLevel(default 2, clamped 1–6), so assistive tech can navigate by heading.FactSetnow announces each fact as a single unit — the title node carries the combined"title: value"label and the value column is excluded from semantics — instead of reading the title and value as disconnected items (visual layout unchanged). AnIconcarrying aselectActionwith atitle/tooltipno longer double-announces its Fluent token, since theselectActionbutton already provides the accessible name. Covered bytest/textblock_heading_and_factset_semantics_test.dart.
Changed 0.14.0 #
TablefirstRowAsHeadernow actually styles header text. Header styling previously relied on an ambientDefaultTextStyle, whichAdaptiveTextBlockoverrides with its own explicitTextStyle— so header rows were never bolder than body rows. Header cells now bake the HostConfigcolumnHeadertext style (weight/size/color/fontType/isSubtle) into eachTextBlock's appearance, with the element's own properties still winning when set.- README implementation status — corrected the
Ratingrow, which incorrectly claimed the read-only display element (AdaptiveRating) was "also registered asInput.Rating".RatingandInput.Ratingare distinct widgets; added a separateInput.Ratingrow documenting the interactive star-picker input (AdaptiveRatingInput:max/color/size/allowHalfSteps, value submission,isRequired). Also corrected the Icon Known gaps row, which still listed "~68 icons" —kFluentIconMapnow has ~200 entries (matching the Icon element row), so the gap impact drops to Low. - Internal cleanup (no behavior change) — applied
dart formatacross the package (fixing formatting drift in 34 files); guarded the per-celldeveloper.loginAdaptiveTable.buildCellContentwithassert(() { … }())so it no longer runs in release builds; and inlined the no-opgetHeaderCellDecorationwrapper intable.dart. Also added braces to a single-statementifinarea_grid_model.dartsurfaced by re-formatting (curly_braces_in_flow_control_structures). - Widget-key generation centralized. Table key helpers (
AdaptiveTable.cellKey/columnKey/rowKey/tableColumnKey) now delegate to sharedgenerateTable*Keyfunctions inutils.dart, andChoiceFilter/ the filtered-choice modal build their keys viagenerateWidgetKeyFromIdinstead of inlineValueKey(...). Key values are unchanged; the format now has a single source that tests import. Seedocs/AdaptiveWidget-Key-Generation.md. - README doc links — the
ColumnSet/Columnimplementation-status rows now point to the historicalColumn-ColumnSet-Fill-Vertical-Height.md, which moved todocs/archive/specs/as part of a documentation cleanup (the fixed-bug note is history, not current integration guidance). Feature behavior is unchanged. - README doc link — the root
refreshimplementation-status row now points todocs/action-payloads-reference.md; the action invoke-payload sections were split out ofactions-architecture.mdinto that dedicated reference (Diátaxis doc cleanup). Feature behavior is unchanged.
Fixed 0.14.0 #
selectActionwrapper (AdaptiveTappable) now uses a deterministic widget key. It previously minted a fresh UUID on every build, so the key changed each frame — the wrapper (and its wrapped Image/Icon/Container subtree) could not be reused by Flutter across rebuilds and could not be located in tests. The key is now{id}_selectAction, seeded from the wrapped element's id (loadId), with a stable positional seed for table cells (which have no injected id). New regression tests intest/select_action_tappable_key_test.dartpin the format and element reuse.- Interactive
Input.Ratingno longer asserts when semantics are enabled. The adjustable rating declaredincrease/decreaseactions without theincreasedValue/decreasedValuethat Flutter requires alongside a semanticvalue, which threw during the semantics build (e.g. with a screen reader or the Widgetbook Semantics addon). The rating now supplies all three. - Decorative images are no longer announced as "alt text not set". Images without an
altText(including container/cell background images) were labeled with a placeholder string, polluting screen-reader output. A null label now passes through so Flutter excludes the decorative image from the semantics tree; images withaltTextare unchanged.
0.13.0 #
Added 0.13.0 #
Action.Http(deprecated/legacy) — the original Adaptive Cards HTTP action model (schema v1.0), superseded byAction.Execute(Universal Action Model, schema v1.4) and still used by Outlook Actionable Messages. Author-drivenGET/POSTaction.DefaultHttpActionvalidates inputs, resolves{{inputId.value}}substitution (newsubstituteInputValuesutil) inurl/body/header values, gates the resolved URL through the active URI policy, debug-flags card-controlledAuthorization/Cookieheaders, then forwards a newHttpActionInvoke(resolved request + rawinputValues+actionId) to the new nullableInheritedAdaptiveCardHandlers.onHttp. The core never performs the request; pair withflutter_adaptive_cards_host_fsfor transport. Registered inDefaultActionTypeRegistryand the widget registry asAdaptiveActionHttp. Seedocs/actions-architecture.md.- Non-standard HostConfig
inputs.choiceSetsection lets hosts tune the compact single-selectInput.ChoiceSetdropdown (DropdownMenu) without touching element JSON:enableSearch(bool, defaulttrue) toggles type-ahead jump-to-match, andrequestFocusOnTap(bool?, defaultnull) overrides the platform-aware focus-on-tap default (nullkeeps it focusable on desktop, tap-only on mobile). Both default to the dropdown's prior hardcoded behavior, so omitting the section is a no-op. Replaces the twoTODO(hostconfig)placeholders inchoice_set.dart. Seedocs/hostconfig.md. - Icon catalog expanded —
kFluentIconMapgrew from 69 to ~200 Fluent-name → Material-icon mappings (filled/regular where available) plus common aliases (trash/bin,gear,pencil,email/envelope,user/contact,play,cart,dashboard,trophy,car,wifi, …). Unknown names still fall back tohelp_outline. Material approximation remains intentionally partial; the full Fluent font is a deferred option. Layout.AreaGrid+grid.area— named-area responsive grids onContainer,Column,TableCell, and the card root via a customRenderAdaptiveAreaGrid(no new dependency):%/px/implied (equal-share) columns,columnSpan/rowSpan,columnSpacing/rowSpacing, and multipletargetWidth-selected grids (reusingselectLayout+cardWidthBucketProvider, so grids switch on resize). Elements place viagrid.area; unplaced or unknown-area elements render below the grid (logged) rather than being dropped.height: "stretch"children fill their cell's row band. SeeLayout.AreaGriddesign.- Block
height: "stretch"is now honored onContainer,Column, and the card root body in height-bounded contexts (e.g.ColumnSetcolumns andTablerows, which give children a bounded row band viaIntrinsicHeight); it degrades toautowhen the parent is unbounded (the common content-sized card body), so cards that don't setheightare unchanged. Implemented via a sharedisStretchHeightpredicate andbuildStretchableColumn, which uses a custom intrinsics-awareRenderStretchColumn(rather than aLayoutBuilder) so stretch works insideIntrinsicHeight. Charts and in-cellTableCellcontent stretch are deferred. See blockheight: stretchdesign. Layout.Flowfinished —layouts/Layout.Flownow applies toColumnandTableCell(in addition toContainerand the card root body), via a sharedbuildLayoutChildrenhelper. AddsitemWidth(fixed px) anditemFitparsing —itemFit: "Fit"is honored;itemFit: "Fill"is not yet supported and falls back toFitwith a one-time log.itemWidthitems use a fixedSizedBox(skippingIntrinsicWidth), which also safely sizes flow items that can't report an intrinsic width; content-fit items keepIntrinsicWidthso they shrink to content instead of filling the row.selectLayoutnow prefers the most-specific (narrowest-range) relationaltargetWidthmatch, and an unbounded card width logs and defaults to thewidebucket.ColumnSetis intentionally excluded — it has nolayoutsproperty in the Adaptive Cards spec. See finish-Layout.Flow design.
Changed 0.13.0 #
- Single-select compact
Input.ChoiceSetnow uses Material 3DropdownMenu: replaced the legacyDropdownButtonso the field supports type-ahead keyboard navigation (typing a character jumps to the matching choice, Enter selects it), restoring parity with the web renderer's native<select>. Type-ahead is platform-aware: enabled on desktop platforms (macOS/Linux/Windows) where a physical keyboard is present, and the field is tap-only on mobile (iOS/Android/Fuchsia) so it does not pop the soft keyboard for a simple dropdown. UsesenableSearch(highlight/jump, full list stays visible) rather thanenableFilter(narrow the list); both this and the focus policy are flagged as future HostConfig options. Display text is driven by the input controller and kept in sync with the resolved selection; selection still stores choice values. Multi-select compact and expanded styles are unchanged. Goldensample2images were regenerated for the new dropdown rendering. - Docs: the core component Implementation status tables (Card Elements, Containers, Root
AdaptiveCardproperties, Inputs, Actions, HostConfig, Common properties, Custom/Extended elements), the status legend, and the core### Known gapstable moved fromdocs/Implementation-Status.mdinto this README so they publish to pub.dev. The central matrix is now an index of pointers + project roadmap/history; future component-status and known-gaps edits go in this README (the doc-sync gate andcode-reviewskill were updated accordingly). - Docs: element/action/model class doc comments now link to the current canonical Microsoft schema reference (
learn.microsoft.com/en-us/adaptive-cards/schema-explorer/<element>) alongside the legacyadaptivecards.io/explorerlink. Hub/Teams extension types (Carousel, Badge, ProgressBar,Action.Popover, etc.) keep only the legacy link since they have no schema-explorer page. Also fixed ahttfps://typo inInput.Text's doc comment. - Docs: README now has an Implementation status section linking (via absolute GitHub URLs, so they resolve on pub.dev) to the central
docs/Implementation-Status.mdmatrix plus the per-package chart and templating status sections. The Charts and Templating detail tables moved out of the central matrix into their own packages' READMEs.
Fixed 0.13.0 #
backgroundImageon an item-lessContainer/Columnnow fills the element again: since the HostConfig style pipeline addedhorizontalAlignmentinheritance (#13), a background-image-only column under an inheritedhorizontalAlignment(e.g. aColumnSetwith"horizontalAlignment": "Center", as in the image-carousel sample) had its image shrunk and centered by the Container's contentalignmentinstead of filling the cell. The image is now wrapped to fill the width (height fromminHeight/ the stretched row band). It stays a foreground widget rather than aDecorationImageso SVG background images keep rendering. Regression test:background_image_fill_test.dart.- Dependent
Input.ChoiceSet(Data.Query) no longer drops the selected value: the dependent-choice-set sample handler re-applied the resolved city choices on the cityonChange. BecauseapplyUpdatestreats "newchoiceswithout avalue" as a stale-value reset, the value the user just selected was cleared on the next frame. The handler now passesvalue: invoke.valuewhen repopulating choices so the selection persists; a regression test (dependent_choice_set_test.dart) now asserts the submitted city value survives the Data.Query re-apply.
Tests 0.13.0 #
- Added unit and widget tests to raise line coverage toward the new CI coverage gate:
Action.InsertImage,ReferenceResolverstyle/color/font resolution,AdaptiveCardDocumentNotifierpatch-map and clear/session paths, andRawAdaptiveCardhost-facade methods (setText,setFacts,setActionEnabled,loadInput,changeValue,showError, …). - Filled the previously-
TODO'dAction.ResetInputsgaps forInput.DateandInput.Time:action_reset_inputs_test.dartnow verifies a changed Date and Time each revert to their original card-JSON value after a global reset. - Resolved the long-standing
TODOs inbasic_test.dart: theTextBlock/FactSet-valuefind.textassertions now pass usingfindRichText: true(those render asMarkdownBody/RichText, not plainText), and theInput.Dateshow-card flow now sets a value and asserts it reaches the hostonSubmitpayload. - Golden baselines refreshed (macOS) — icon-bearing goldens (
v1_5_icon_demo,v1_6_icon_catalog,v1_6_accordion,v1_6_rating,sample1*,sample2*,sample5*) now render real Material/Fluent icon glyphs instead of empty tofu boxes, thanks toflutter_adaptive_cards_test_supportloading the bundled MaterialIcons font in golden tests. Linux CI baselines refresh on the next build.
0.12.0 #
Security 0.12.0 #
AdaptiveUriPolicy/AdaptiveFetchPolicyfor card-controlled URLs: newlib/src/security/layer validates untrusted URLs (scheme allowlist, loopback/private-host blocking, optional host allowlist) and bounds card-initiated fetches (byte cap + timeout). Exposed viaInheritedAdaptiveCardSecurityPolicyand optionalRawAdaptiveCard/AdaptiveCardsCanvas.networkparameters; defaults to a production-safe policy.Action.OpenUrland markdown links are validated before launch:DefaultOpenUrlAction.taprejects disallowed schemes/hosts (e.g.javascript:, private IPs) before forwarding to the host handler orurl_launcher; markdownTextBlocklinks route through the same gate.- SSRF guards on remote fetches:
Action.OpenUrlDialogcontent fetch andNetworkAdaptiveCardContentProvidernow validate the URL and cap the response body before requesting. - Optional image/media URL gating:
AdaptiveImageUtils.getImage/getImageProvideraccept a policy (denied URLs render a placeholder), andAdaptiveMediavalidates its source before creating the network player.
Fixed 0.12.0 #
Input.Textno longer caps input at 20 characters whenmaxLengthis omitted: the length limit is applied only whenmaxLengthis present and greater than 0 (Adaptive Cards spec: absentmaxLengthmeans no limit).Input.Text/Input.Numberfast-typing no longer drops characters or resets cursor:AdaptiveInputMixin.listenForResolvedValueChangespreviously captured the resolved value at listener-fire time and echoed it back via a post-frame callback. When two keystrokes arrived in the same frame, the stale captured value overwrote the controller and reset the IME cursor (selection to offset -1), desynchronising the IME and dropping characters. The post-frame callback now reads the latest resolved value at execution time (readResolvedInput().valueRaw), making the echo a no-op when the controller already reflects the current document state.Mediaposter placeholder no longer throwsLateInitializationError:AdaptiveMediaState.altTextis now initialized from the card'saltText(defaulting to empty) ininitState, so the poster placeholder shown while the video loads (or when its source is policy-blocked) renders instead of crashing.altTextis not overlayable, so it is read from the baseline map likeImage.CodeBlockreads speccodeSnippetproperty:AdaptiveCodeBlockState.initStatenow readsadaptiveMap['codeSnippet']first (spec-correct property) and falls back toadaptiveMap['code']for backward compatibility. Previously any spec-compliant CodeBlock rendered empty.
Changed 0.12.0 #
CompoundButtonnow honorsselectAction: tapping the button resolves and dispatches itsselectAction(e.g.Action.OpenUrl,Action.Submit) via the action registry. When noselectActionis present the button renders disabled instead of being a no-op. Also removed a stale markdown TODO inTextBlock(markdown is already implemented viaflutter_markdown_plus; no behavior change).Input.Number,Input.Date, andInput.Timenow validatemin/maxbounds on Submit/Execute: out-of-range values block the action and mark the input invalid instead of submitting silently.- Action
mode: secondary+ overflow: secondary-mode actions, and any actions beyond HostConfigmaxActions, now collapse into a reveal-on-demand "•••" overflow toggle instead of being silently dropped (applies to bothActionSetand card-level actions). - Action
iconPlacement: action buttons now honoractions.iconPlacement; the defaultaboveTitlestacks the icon over the label (previously always icon-left).
Added 0.12.0 #
revealPasswordEnabledper-element overlay:ElementOverlaygains arevealPasswordEnabledfield;AdaptiveCardDocumentNotifierexposessetRevealPasswordEnabled/clearRevealPasswordEnabled;resolvedElementProvidermerges the override into the resolved map;ResolvedInputState.revealPasswordEnabledOverridereads it; andRawAdaptiveCardStateexposes matching facade methods. The field is preserved acrossAction.ResetInputs(likeisVisible), not cleared.- Responsive layout (
targetWidth+Layout.Flow): elements gate visibility by card width viatargetWidth(named bucketsveryNarrow/narrow/standard/wideplusatLeast:/atMost:), andContainer+ the card root body honor alayoutsarray, reflowing from a vertical stack to a wrappingLayout.Flow(withcolumnSpacing/rowSpacing, item alignment, and optionalminItemWidth/maxItemWidth). Width buckets come from a new HostConfighostWidthBreakpointssection (spec defaults when absent) and are published to the element subtree via the scoped RiverpodcardWidthBucketProvider(a thin nestedProviderScopeinside the rootLayoutBuilderoverrides it with the measured bucket, leaving the outer card scope stable).Layout.AreaGrid/grid.areaanditemFitremain deferred. - Pure range-validation helpers:
input_range_validation.dartwithnumberInputValueIsValid,dateInputValueIsValid, andtimeInputValueIsValid— Flutter-free pure functions forInput.Number,Input.Date, andInput.Timebound validation, mirroringinput_text_validation.dart. Image.backgroundColor: painted behind the image (visible through transparent PNGs).Badge.shape:square/rounded/circularmapped to corner radius.CompoundButton.badge: trailing badge label rendered when present.Carouseltimer/orientation/loop: auto-advance (periodic timer), vertical scroll direction, and wrap-around paging.Media.captionSources: parsed into a typedCaptionSourcemodel (VTT rendering on the video surface remains a follow-up).
0.11.0 #
Added 0.11.0 #
Action.Popoverregistry pattern:GenericPopoverActionabstract class andDefaultPopoverActionimplementation added.Action.Popoveris now registered inDefaultActionTypeRegistryand follows the same injectable handler pattern as Submit, Execute, OpenUrl, ToggleVisibility, and ResetInputs. Host apps can override the default dialog behavior by supplying a customActionTypeRegistry.AdaptivePopoverContainerextracted to its own file (popover_container.dart) to avoid a circular dependency betweendefault_actions.dartandpopover.dart; re-exported frompopover.dartfor backward compatibility.
Changed 0.11.0 #
AdaptiveActionPopoverStaterefactored to resolve its action handler from the registry indidChangeDependencies()(matchingAdaptiveActionSubmitState/AdaptiveActionExecuteState). The inlineonTapped()method andpopupParentResolverfield have been removed; dialog-show logic now lives inDefaultPopoverAction.AdaptiveActionMixinadded to state mixins.AdaptiveVisibilityMixin/AdaptiveActionStateMixin: converted fromon State<T>toon ConsumerState<T>; visibility and action state now read viaref.watch/ref.readinstead ofProviderScope.containerOf(context)+ manualProviderSubscription. Removes all manualdidChangeDependenciessubscription setup anddisposecleanup in these mixins.- All display and structural element widgets (
AdaptiveColumn,AdaptiveColumnSet,AdaptiveContainer,AdaptiveImageSet,AdaptiveTable,AdaptiveAccordion,ActionSet,AdaptiveCarousel,AdaptiveCodeBlock,AdaptiveCompoundButton,AdaptiveIcon,AdaptiveProgressBar,AdaptiveProgressRing,AdaptiveTabSet,AdaptiveTextBlock,AdaptiveRichTextBlock,AdaptiveBadge,AdaptiveImage,AdaptiveMedia,AdaptiveRating,AdaptiveFactSet,IconButtonAction) converted fromStatefulWidget/StatetoConsumerStatefulWidget/ConsumerState. Internal refactor; no public API changes. - Removed duplicate
assets/fonts/tree; golden tests load Roboto fromflutter_adaptive_cards_test_support.
Fixed 0.11.0 #
ProviderScopebrightness key bug: removedkey: ValueKey<Brightness?>from the innerProviderScopeinRawAdaptiveCard. The key caused Flutter to destroy and recreate the entireProviderScopesubtree on every brightness toggle, wipingAdaptiveCardDocumentNotifierstate (all input values, overlays, and visibility). Theme propagation continues to work viadidChangeDependencies— no key is needed. Regression tests added intest/elements/theme_change_overlay_test.dart.
Overlay gaps remediation 0.11.0 (Waves 1–3) #
RichTextBlock: runtimeinlinesoverlay; hostsetInlines/clearInlinesonRawAdaptiveCardState; widget listener viaresolvedElementProvider.- Optional-package overlay hooks:
ElementOverlayExtension,CardOverlayExtensionRegistry, andCardTypeRegistry.overlayExtensions— genericextensionPayloadsmerge in core (chart types live influtter_adaptive_charts_fs). OverlayCapabilityRegistry:ElementOverlayField/ActionOverlayFieldenums andCardTypeRegistry.overlayCapabilitiesfor per JSONtypeoverlay discovery; debug validation inapplyUpdates(assert in debug builds).- Public exports:
ElementOverlayExtension,OverlayCapabilityRegistry, and overlay field enums fromflutter_adaptive_cards_fs.dart; optional-package authors importpackage:flutter_adaptive_cards_fs/flutter_adaptive_cards_extend_fs.dartfor overlay extension hooks. - Docs:
docs/overlay-properties-by-type.md— host index of patch keys by element type. Input.Rating: newAdaptiveRatingInputwith full overlay contract (value,label,isRequired, validation); registry split from read-onlyRating(AdaptiveRating); sharedRatingStarswidget.Input.Toggle: reactivelabel,isRequired, and validation UI viawatchResolvedInput().Badge: reactivetextoverlay (setText/applyUpdates) viaresolvedElementProvider.Action.Popover:isEnabled,title, andtooltipoverlays via sharedIconButtonActionchrome.Media: reactive URL overlay —setUrlmerges intosources[0].url; player re-inits on URL change.Rating(display): reactivevalue,max,color, andsizeviaresolvedElementProviderlistener.Action.*iconUrl: runtime overlay viaActionOverlay.iconUrl; merged inresolvedActionProvider;AdaptiveActionStateMixinupdatesIconButtonActionreactively; hostapplyUpdates/applyUpdatesFromMapwithclearIconUrl.
0.10.0 #
- Root card
refresh(v1.4+): parserefresh.action,userIds, andexpiresviaRefreshConfig; manual refresh affordance (top-right icon) whenrefresh.actionis set; one-shot auto-refresh after first frame whenexpiresis in the past;refresh.userIdsgates auto-refresh only (viaAdaptiveCardsCanvas.currentUserId/currentUserIdProvider). RefreshActionInvokeand optionalInheritedAdaptiveCardHandlers.onRefresh; falls back toonExecutewith merged inputdatawhenonRefreshis unset.- Public export of
RefreshConfigfromflutter_adaptive_cards_fs.dart. - Tests:
test/models/refresh_config_test.dart,test/refresh/refresh_action_test.dart. - Public exports for
RawAdaptiveCard,RawAdaptiveCardState, andDataQuery(host integration and backend invoke wiring). - Data.Query
associatedInputs: sibling input values merged intoDataQuery.parametersonInputChangeInvokewhenauto(default). - Action.Submit / Action.Execute
associatedInputs:"none"skips input merge into invokedata. Iconelement (v1.5 documentation hub):AdaptiveIconregistered for typeIcon; Fluent name catalog (~68 common names) viafluent_icon_map.dartwith Material icon fallbacks;size,color, andstyle(Filled/Regular) tokens; optionalselectActionviaAdaptiveTappable.- Chart color tokens:
chart_colors_config.dart— HostConfig palette + categorical, sequential, and diverging palettes plus Teams semantic tokens (categoricalBlue,sequential5,divergingRed,good, …). ReferenceResolver:resolveChartPalette({colorSet})selects named palettes;resolveChartColor()resolves semantic chart tokens before hex parsing.- Tests:
test/elements/icon_test.dart,test/hostconfig/chart_color_sets_test.dart,test/golden_icon_test.dart. RichTextBlock+TextRun(v1.2):AdaptiveRichTextBlockwith per-run styling (weight,color,italic,underline,highlight,fontType,size) andselectActionviaTapGestureRecognizer;TextRunModel.fromJson.TextBlock: plainTextpath honorsmaxLines,TextOverflow.ellipsis, and HostConfigcolor/isSubtlewhensupportMarkdownis false;AdaptiveCardsCanvas.supportMarkdownnow flows intoCardTypeRegistry.- Tests:
test/elements/rich_text_block_test.dart,test/elements/text_block_test.dart,test/golden_rich_text_block_test.dart. - Shared parse helpers:
parseIsVisible()andparseHostConfigColor()inutils.dart(HostConfig color parsing and visibility baseline parsing). - Public export of
InheritedAdaptiveCardHandlersfromflutter_adaptive_cards_fs.dart(for test support and host callback wiring withoutimplementation_imports). - Tests:
test/utils/parse_helpers_test.dart; merged staticisVisiblecases intotest/elements/is_visible_test.dart. flutter_adaptive_cards_fstest harness now re-exportsflutter_adaptive_cards_test_supportfromtest/utils/test_utils.dart; golden tests use sharedconfigureTestView,getGoldenPath, andgetV16SampleForGoldenTest.flutter_test_config.dartdelegates to sharedadaptiveCardsTestExecutable(HTTP overrides + Roboto font loading).- Removed unused
mockitodev dependency from this package. - Dead legacy sources:
adaptive_element.dart,basic_markdown.dart(superseded by registry /flutter_markdown). - Orphan test fixtures and placeholder test:
choice_set_radio.json,example15.json,test/elements/text_block_text.dart, duplicate roottest/is_visible_test.dart. AGENTS.mddocumentation links (doc/→docs/).- Public exports for
Choice,Fact, andMediaSourcefromflutter_adaptive_cards_fs.dart. - List parse helpers:
choicesFromJsonList/choicesToJsonList,factsFromJsonList,mediaSourcesFromJsonList. - Runtime
factsoverlay onFactSetelements (setFacts,clearFacts,applyUpdates/applyUpdatesFromMap). - Widgetbook FactSet → Facts overlay (knob) demo for interactive overlay testing.
- Shared
parseAdaptiveDateValue/formatAdaptiveDateValuehelpers forInput.Date(date_input_utils.dart). ChildStylerimplements container style and horizontal-alignment inheritance via nestedstyleReferenceResolverProvideroverrides.ReferenceResolver.resolveTextBlockStyle(),resolveImageIsPerson(), andresolveEffectiveHorizontalAlignment().AdaptiveCardBrightnessMode(auto/light/dark) onRawAdaptiveCardandAdaptiveCardsCanvas.- Style inheritance diagrams in
docs/adaptive-style.md. - Tests:
test/style/inheritance_test.dart. ElementOverlay.choicesnow storesList<Choice>internally; resolved element JSON still exposeschoicesas maps for widget compatibility.Input.ChoiceSetfiltered modal usesChoiceinstead of internalSearchModel.AdaptiveFactSetandAdaptiveMediaparse child lists via shared typed helpers.- Container background uses only each element's own
style; foreground palette usesinheritedContainerStylefrom ancestors. TextBlockapplies HostConfigTextStylesConfigforheading/columnHeader; table header rows usecolumnHeaderdefaults.Imagepersonclipping applies only whenstyleisperson(not other style names).- Theme brightness changes re-resolve styles via brightness-keyed root
ProviderScope. ThemeColorFallbacks: HostConfig color fallbacks derived fromThemeData.colorScheme(theme_color_fallbacks.dart); replaces hardcoded light-theme colors previously inFallbackConfigs.ReferenceResolver: requiredcolorFallbacksparameter;resolveProgressColor(); foreground, container, chart, separator, and badge resolution uses theme-derived defaults when HostConfig omits values.RawAdaptiveCard: wiresThemeColorFallbacks(Theme.of(context))into the resolver on each build.- HostConfig JSON parsers (
FontColorConfig,ForegroundColorsConfig,ContainerStyleConfig,ContainerStylesConfig,HostConfig.fromJson): optionaltheme:/ThemeColorFallbacks.forParsingfor parse-time color defaults. - Documentation:
docs/hostconfig.md(replacesdocs/hostconfig_tests.md) — theme fallback pipeline, Widgetbook notes, and serialization test conventions. - Regenerated linux and macos golden baselines for theme-derived HostConfig color fallbacks.
Input.DateinitData/initInputseeding: controller no longer receives placeholder text; submit and overlay values useyyyy-MM-ddper spec. Hosts that relied on ISO-8601 inonChangecallbacks should expectyyyy-MM-ddinstead.Input.ChoiceSetloadInput: selection reconcile clears the value overlay (clearInputValue) instead of writing'', matching legacyloadInput/setChoicesbehavior.- Root card
refresh(v1.4+): parserefresh.action,userIds, andexpiresviaRefreshConfig; manual refresh affordance (top-right icon) whenrefresh.actionis set; one-shot auto-refresh after first frame whenexpiresis in the past;refresh.userIdsgates auto-refresh only (viaAdaptiveCardsCanvas.currentUserId/currentUserIdProvider). RefreshActionInvokeand optionalInheritedAdaptiveCardHandlers.onRefresh; falls back toonExecutewith merged inputdatawhenonRefreshis unset.- Public export of
RefreshConfigfromflutter_adaptive_cards_fs.dart. - Tests:
test/models/refresh_config_test.dart,test/refresh/refresh_action_test.dart. - Public exports for
RawAdaptiveCard,RawAdaptiveCardState, andDataQuery(host integration and backend invoke wiring). - Data.Query
associatedInputs: sibling input values merged intoDataQuery.parametersonInputChangeInvokewhenauto(default). - Action.Submit / Action.Execute
associatedInputs:"none"skips input merge into invokedata. Iconelement (v1.5 documentation hub):AdaptiveIconregistered for typeIcon; Fluent name catalog (~68 common names) viafluent_icon_map.dartwith Material icon fallbacks;size,color, andstyle(Filled/Regular) tokens; optionalselectActionviaAdaptiveTappable.- Chart color tokens:
chart_colors_config.dart— HostConfig palette + categorical, sequential, and diverging palettes plus Teams semantic tokens (categoricalBlue,sequential5,divergingRed,good, …). ReferenceResolver:resolveChartPalette({colorSet})selects named palettes;resolveChartColor()resolves semantic chart tokens before hex parsing.- Tests:
test/elements/icon_test.dart,test/hostconfig/chart_color_sets_test.dart,test/golden_icon_test.dart.
0.9.0 #
Added 0.9.0 #
- Filtered
Input.ChoiceSetmodal lists and typeahead search; choice titles drive search while submit,onChange, andData.Queryuse choice values. - Dependent
Input.ChoiceSetsupport viavalueChangedActionand host-drivenapplyUpdates/Data.Querycascade. OpenUrlActionInvoke,OpenUrlDialogActionInvoke, andInputChangeInvokepublic models exported fromflutter_adaptive_cards_fs.dart.- Tests:
test/actions/open_url_action_invoke_test.dart,test/actions/open_url_dialog_action_invoke_test.dart.
Changed 0.9.0 #
onSubmitnow receivesSubmitActionInvokeinstead of a bareMap. Useinvoke.actionIdandinvoke.data(merged actiondata+ input values).onExecutenow receivesExecuteActionInvokeinstead of a bareMap. Useinvoke.verb,invoke.actionId, andinvoke.data.GenericExecuteAction.tapno longer takes a separateverbargument; read action metadata fromadaptiveMapin custom implementations (or delegate toExecuteActionInvoke.fromActionMap).onOpenUrlnow receivesOpenUrlActionInvoke(url, optionalactionId) instead of a bareString.onOpenUrlDialognow receivesOpenUrlDialogActionInvoke(url, optionalactionId) instead of a bareString.onChangenow receivesInputChangeInvoke(inputId,value,dataQuery,cardState) instead of four separate parameters.AdaptiveCardsCanvas.onChangeandRawAdaptiveCard.onChangeuse the sameInputChangeInvoketype.- Fixed semantic binding error when dismissing the filtered ChoiceSet modal panel (clear control separated from
InputDecoration.suffix).
Removed #
- Unused
onSubmit,onExecute, andonOpenUrlfields onAdaptiveCardsCanvasState. UseInheritedAdaptiveCardHandlersfor Submit, Execute, and OpenUrl callbacks.
0.8.0 #
- Migrated all modifyable state to be reactive using riverpod via overlay on top of adaptive card json: ElementOverlay and ActionOverlay
- Elements value, error messages, error state, isVisble and many other attributes
- Actions isEnabled and other attributes
- Implemented regex validation in input field
- Added AI skills flutter and dart provided by flutter and dart teams.
- Added AI superpowers
Added 0.8.0 #
AdaptiveElementUpdate/AdaptiveActionUpdateand bulkapplyUpdates/applyUpdatesFromMapon the document notifier andRawAdaptiveCardState.ElementOverlay.isRequiredandElementOverlay.url;AdaptiveInputMixinlistens for resolvedisRequired;AdaptiveImagelistens for resolvedurl.- Tier 3 overlays:
label,placeholderon inputs;title,tooltipon actions; merged viaapplyUpdates/applyUpdatesFromMap;AdaptiveInputMixinandAdaptiveActionStateMixinupdate UI reactively. initDatasupports scalar values or per-id patch maps;seedInputValuesdelegates toapplyUpdates(single revision).- Default Submit / Execute required-field checks use resolved
isRequired(overlay ?? baseline). Input.Textregexvalidation (AC 1.3): pattern checked on field blur and on Submit / Execute via sharedtextInputValueIsValid; invalid values setisInvalidand showerrorMessage.- Tests:
test/riverpod/apply_updates_test.dart,test/inputs/cascade_choice_set_test.dart,test/inputs/is_required_overlay_test.dart,test/elements/image_url_overlay_test.dart,test/actions/submit_required_overlay_test.dart. - Tests:
test/inputs/input_text_validation_test.dart,test/inputs/input_text_regex_test.dart,test/golden_input_text_regex_test.dart(sampletest/samples/ac-qv-event.json). - Design spec:
docs/superpowers/specs/2026-06-03-dynamic-property-updates-design.md. resetInput(id)on the document notifier andRawAdaptiveCardState;AdaptiveInputMixin.resetInput()delegates to the notifier.- Factory reset clears input overlays including
label,placeholder, andisRequired(resolved → baseline JSON). Seedocs/reactive-riverpod.md. - Design spec:
docs/superpowers/specs/2026-06-03-overlay-reset-semantics-design.md. Action.ResetInputstargetInputIds: reset only listed input ids; omitted property resets all inputs; empty array resets nothing. Shared executor used by action button tap and inputvalueChangedAction.valueChangedActiononInput.*: when the user changes a field, runs embeddedAction.ResetInputs(e.g. dependent ChoiceSet / country–city). Discrete inputs fire immediately;Input.Text/Input.Numberfire on focus loss or editing complete, not each keystroke.- Document notifier
resetInputs(List<String> ids)— batch factory reset in one revision (same overlay rules asresetInput(id)). - Sample
test/samples/action_reset_inputs_targeted.json; tests for targeted reset andvalueChangedAction; WidgetbookActions.Reset (targeted)use case. - Design spec:
docs/superpowers/specs/2026-06-04-action-resetinputs-targetinputids-design.md.
Changed 0.8.0 #
-
Scoped dependency injection now uses nested
InheritedReferenceResolverwidgets instead of Riverpod:- Outer scope (from
RawAdaptiveCard):resolver(includescardTypeRegistry/actionTypeRegistry),rawAdaptiveCardState— read viaInheritedReferenceResolver.rawCardScopeOf(context). - Inner scope (from each
AdaptiveCardElement):adaptiveCardElementState— read viaInheritedReferenceResolver.elementScopeOf(context).
- Outer scope (from
-
ProviderScopeMixinunchanged by name; implementations now read the inherited scopes above (noref,ConsumerWidget, or app-levelProviderScoperequired). -
Host-facing callbacks remain on
InheritedAdaptiveCardHandlers. -
See
doc/replace-riverpod.mdfor the migration map from former provider names. -
Updated to Dart SDK 3.12 and Flutter 3.44
-
Regenerated golden test images for Flutter 3.44 rendering changes
-
Refactored
HostConfigclasses by extracting bundled classes (e.g. frommiscellaneous_configs.dartandfont_config.dart) into dedicated individual files underlib/src/hostconfig/to improve maintainability. -
Updated
AdaptiveColumn,AdaptiveContainer, and internal utilities to strictly useReferenceResolveras a facade for accessing HostConfig values (e.g.resolveSpacing()), removing direct dependencies on underlying config objects likeSpacingsConfig. -
Created
doc/Architecture-Overview.mdto document system architecture, package structure, internal state management, and extensibility points. -
Consolidated documentation around known gaps and priority issues into
doc/Implementation-Status.md. -
ReferenceResolverno longer carriescardTypeRegistryoractionTypeRegistry. It is a HostConfig/theme facade only. Element and action factories are provided via RiverpodcardTypeRegistryProviderandactionTypeRegistryProvider(seedoc/reactive-riverpod.md). -
Input.ChoiceSetreads effective choices fromresolvedElementProviderinstead of local-only state. -
RawAdaptiveCardState.loadInputandinitInputdelegate to the document notifier (no element-tree walk). -
initDataseeds input overlays viaseedInputValuespost-frame. -
resetAllInputs/resetInput(id)factory-reset input overlays to baseline (value, choices, validation,isRequired,label,placeholder); preserve inputisVisibleand typeahead session fields only. -
ElementOverlay.choices— runtime overlay forInput.ChoiceSetdynamic option lists; merged viaresolvedElementProvider. -
Document notifier APIs:
setChoices,appendChoices,seedInputValues,setDataQuerySession. -
DataQuery.count/DataQuery.skip— spec fields for typeahead pagination. -
ActionOverlayandactionOverlaysByIdonAdaptiveCardDocumentfor AC 1.5 actionisEnabled. -
resolvedActionProvider(id)— merged baseline + action overlay map forAction.*nodes. -
Document notifier:
setInputError,clearInputError,setActionEnabled,setActionsEnabled. -
ElementOverlay.errorMessageandElementOverlay.isInvalidmerged viaresolvedElementProvider. -
AdaptiveActionStateMixin— reactiveisEnabledforIconButtonActionandAction.ShowCard. -
Host helpers on
RawAdaptiveCardState:setInputError,clearInputError,setActionEnabled. -
ElementOverlay.text— runtime replacement ofTextBlock"text"; merged viaresolvedElementProvider. -
Document notifier:
setText,clearText;AdaptiveTextBlocklistens for resolvedtext. -
Host helpers:
RawAdaptiveCardState.setText/clearText. -
Tests:
test/elements/text_block_text_overlay_test.dart. -
Tests:
test/inputs/input_error_overlay_test.dart,test/actions/action_enabled_overlay_test.dart, sampletest/samples/v1.5/action_is_enabled.json. -
resetAllInputsclears validation overlays on inputs; preservesactionOverlaysById. -
setInputValueclears host validation overlays when the user edits an input.
0.7.0 #
- Added
selectActionsupport toTableCell(AdaptiveTable), wrapped viaAdaptiveTappableto enable action handlers when cells are tapped. - Added full
selectActionsupport and tap testing validation onAdaptiveCardElement,AdaptiveContainer,AdaptiveColumn, andAdaptiveImage(fixed tap hit-tests using base64 URI elements).. - change landscape / portrait breakpoint handling for AdaptiveCardElement
parseTextStringnow accepts an optionallocaleparameter for correct date/time localization.AdaptiveTextBlocknow passes the currentLocalizations.maybeLocaleOf(context)toparseTextStringfor region-aware date/time macro expansion.- Insured
AdaptiveElementMixinproperly unregisters widgets ondispose. - Fixed
minHeightparameter parsing and constraint application onAdaptiveColumnandAdaptiveContainerelements (supporting raw pixel and integer formats). - Fixed background image aspect-ratio sizing on
AdaptiveColumnandAdaptiveContainerelements when they only contain abackgroundImageand haveminHeightor pixelwidthconstraints set, ensuring the other dimension scales dynamically to preserve original image proportions. - Tests for
Data.QueryChoiceSet flows:loadInputrefresh after mount and fromonChange,setDataQuerySessionmerge into resolvedchoices.data, andinitDatawithchoices.data(choice_set_data_query_test.dart,init_data_overlay_test.dart,adaptive_card_document_notifier_test.dart).
0.6.0 #
- Bumped versions to 0.6.0 for next development cycle
- Updated to Dart SDK 3.11 and Flutter 3.41
- Removed
uuidpackage dependency and replaced it with Flutter's nativeUniqueKey()for widget key generation. - Removed unused
tinycolor2package dependency to reduce library footprint. - Renamed
AdaptiveCardsRoottoAdaptiveCardsCanvas - Inject
idattributes into the JSON tree in theAdaptiveCardsCanvasso that all objects have ids when not provided. Note that this changes the provided JSON. You can see this in the adaptive_explorer app in the merged tab. - Fixed
resetInputs()to correctly clear and revert underlying UI state (text controllers, selectors, etc.) across allInputelement types. - Fixed
Input.Timevalidation logic which previously rejected valid times. Improved the displayed error message format. - Fixed Cupertino Time Picker overlay dismissal to pop the modal itself instead of the root navigator.
0.5.0 #
- version numbers were sync'd to 0.5.0
- Added
ChartColorsConfigtoHostConfigto allow custom color palettes for charts. - Added
ReferenceResolverwithresolveChartPaletteandresolveChartColormethods. - migrated more hard coded styles to the resolver
- Abstracted
ProviderScopegetter functions into a newProviderScopeMixinaway fromAdaptiveElementMixin.
0.4.0 - 2026-04-14 #
- version numbers were sync'd to the flutter_adaptive_charts_fs 0.4.0
0.3.0 - 2026-04-12 #
- First version to be published on pub.dev out of the freemansoft repo
- Added the adaptive_explorer app
- Set versions on all projects to 0.3.0
- renamed package
flutter_adaptive_cardstoflutter_adaptive_cards_plusto avoid pub.dev name collision - add data query support
- Renamed AdaptiveCard to AdaptiveCardsRoot
- Input field widgets now use the input id as their
ValueKey(e.g.ValueKey('myInputId')) - Parent/adaptive card keys for inputs use the suffix
_adaptive(e.g.ValueKey('${id}_adaptive')) - Selector item keys use the format
${id}_${itemKey}(e.g.ValueKey('myChoiceSet_Choice 1')) RawAdaptiveCard.searchListnow accepts an optionalinputIdwhich is propagated to the choice-filter modal so the modal search field can be keyed and tested.- Tests and examples were updated to reflect the new keys (non-golden tests updated, new
text_input_test.dartadded). - Behavior change: Non-input adaptive widgets now use
generateAdaptiveWidgetKey()for their widget keys instead ofgenerateWidgetKey(). Update any tests or consumers that relied on the old keys. - Consumers should update any tests or code that relied on the old
<id>_inputkeys to the new naming scheme. - change name to
flutter_adaptive_cards_fsto avoid conflict on pub.dev with package published 12/2025 - Added dynamic dark mode support to
RawAdaptiveCardby listening toTheme.of(context).brightness. - Enabled
verticalContentAlignmentonAdaptiveContainer. - Fixed action
resolveOrientationto useActionsConfigvalues from HostConfig. - Added basic
"fallback": "drop"support for elements that fail to map or are unknown. - Added
resolveInputForegroundColortoReferenceResolverand updatedChoiceSetdropdown to use it for better theme-aware coloring. - Added
{{DATE(timestamp, FORMAT)}}and{{TIME(timestamp)}}macro replacements inTextBlockandFactSetelements using a newDateTimeUtilsutility. - Added
intldependency for robust date parsing and localization approximations. - Golden Image Reorganization: Restructured golden images into platform-specific subdirectories (
test/gold_files/linux/,test/gold_files/macos/, etc.). - Dynamic Golden Resolution: Added
getGoldenPathhelper intest_utils.dartto automatically select the appropriate golden directory based on the host platform.
0.2.1 - 2025-09-23 #
- Converted provider to riverpod 3 9/2025
- Updated libraries major-versions 9/2025
- Ipdated for flutter 3.24 9/2025
- Tested with ios 26 simulator and macos 26.0 9/2025
- Pointed at https microsoft images which causes CORS issue in web example app 9/2025
- Updated to the current Flutter
- Migrating all style into the Resolver so that all AdaptiveCard text styles are mapped there. Future create themeing for this
- Enabling workflow - or at least thinking about it
- Added Accordion, Badge, Carosel, CodeBlock, ProgressBar, ProgressRing, PieChart, BarChart
- Added
fvmfor flutter version management - currently 3.38.5 - BackgroundImage support for Container. Fixed support for fillMode
- Migrated to widgetbook 1.0.0 and deleted example app. This lost the lab and lab_web utilities
- Added hostconfig objects and integrated them and fallback hostconfig into the AdaptiveCard widgets.
- Addeed SVG support for images - but not background images
- Added Inline in-memory image support - png
- All elements have repeatable id values if not specified in the json (hashcode(adaptiveMap))
- Changed action path again (simplified)
- Put provider back in for raw and adaptive card element
- Added keys for the Adaptive cards
- Added calcuated and specified ids
- Added keys to the input fields in the input adaptive cards and atual input widgets for testing
- Migrated the hostconfig from InheritedReferenceResolver to riverpod provider_scope
- Selection applied via AdaptiveTappable to AdaptiveCard Element and Containers
- Add tooltips to actions
- Migrate from flutter_markdown to flutter_markdown_plus as
flutter_markdownis deprecated - Add template and data json merge support - Adaptive Cards 1.3
- Updated table support suing LLM