diff --git a/site/lib/src/components/layout/banner.dart b/site/lib/src/components/layout/banner.dart index 6e5f0797705..78e02d176f4 100644 --- a/site/lib/src/components/layout/banner.dart +++ b/site/lib/src/components/layout/banner.dart @@ -4,43 +4,15 @@ import 'package:jaspr/jaspr.dart'; -/// The information to display in the site banner, -/// as configured in the `src/data/banner.yml` file. -@immutable -final class BannerContent { - final String text; - final String linkText; - final String linkUri; - final bool newTab; - - const BannerContent({ - required this.text, - required this.linkText, - required this.linkUri, - this.newTab = false, - }); - - factory BannerContent.fromMap(Map bannerData) { - final text = bannerData['text'] as String; - final link = bannerData['link'] as Map; - final linkText = link['text'] as String; - final linkUri = link['url'] as String; - final newTab = link['newTab'] as bool? ?? false; - - return BannerContent( - text: text, - linkText: linkText, - linkUri: linkUri, - newTab: newTab, - ); - } -} - /// The site-wide banner. class DashBanner extends StatelessComponent { - const DashBanner(this.content, {super.key}); + const DashBanner(this.inlineHtmlContent, {super.key}); - final BannerContent content; + /// The raw, inline HTML content to render in the banner. + /// + /// This should only be sourced from managed content, + /// such as our checked-in data files. + final String inlineHtmlContent; @override Component build(BuildContext context) => div( @@ -48,13 +20,7 @@ class DashBanner extends StatelessComponent { attributes: {'role': 'alert'}, [ p([ - text(content.text), - text(' '), - a( - href: content.linkUri, - target: content.newTab ? Target.blank : null, - [text(content.linkText)], - ), + raw(inlineHtmlContent), ]), ], ); diff --git a/site/lib/src/layouts/doc_layout.dart b/site/lib/src/layouts/doc_layout.dart index 437c2d5d7e3..e4cddf58918 100644 --- a/site/lib/src/layouts/doc_layout.dart +++ b/site/lib/src/layouts/doc_layout.dart @@ -47,8 +47,9 @@ class DocLayout extends FlutterDocsLayout { currentTitle: pageTitle, ), if (showBanner) - if (page.data['banner'] case final Map bannerData) - DashBanner(BannerContent.fromMap(bannerData)), + if (siteData['bannerHtml'] case final String bannerHtml + when bannerHtml.trim().isNotEmpty) + DashBanner(bannerHtml), div(classes: 'after-leading-content', [ if (tocData != null) aside(id: 'side-menu', [ diff --git a/src/data/banner.yml b/src/data/banner.yml deleted file mode 100644 index 84b162489f6..00000000000 --- a/src/data/banner.yml +++ /dev/null @@ -1,7 +0,0 @@ -text: >- - Don't miss the live Flutter and Dart - live Q & A happening Wednesday, Nov 12 at 11am PST. -link: - text: "Be there!" - url: "https://www.youtube.com/watch?v=RTb3gP4p5bw" - newTab: true diff --git a/src/data/site.yml b/src/data/site.yml index 03edddfbceb..1879764509f 100644 --- a/src/data/site.yml +++ b/src/data/site.yml @@ -5,6 +5,13 @@ email: flutter-dev@googlegroups.com showBanner: true +# The raw, inline HTML to display in the banner. +# Is automatically wrapped in a paragraph tag. +bannerHtml: >- + Don't miss the live Flutter and Dart Q&A happening + today, November 12 at 11am PST. + Join us! + branch: main repo: organization: https://github.com/flutter