@@ -6,6 +6,8 @@ import 'package:collection/collection.dart';
66import 'package:jaspr/jaspr.dart' ;
77import 'package:jaspr_content/jaspr_content.dart' ;
88
9+ import 'material_icon.dart' ;
10+
911/// Breadcrumbs navigation component that
1012/// follows ARIA guidelines and includes RDFa markup.
1113///
@@ -49,18 +51,15 @@ class PageBreadcrumbs extends StatelessComponent {
4951 /// Extract breadcrumbs from page data.
5052 ///
5153 /// Uses page metadata to generate breadcrumb titles with fallbacks:
52- /// breadcrumb >short-title > title.
54+ /// ` breadcrumb` > `shortTitle` > ` title` .
5355 List <_BreadcrumbItem >? _breadcrumbsForPage (List <Page > pages, Page page) {
5456 final pageUrl = page.url;
5557
5658 // Only show breadcrumbs if the URL isn't empty.
5759 if (pageUrl.isEmpty || pageUrl == '/' ) return null ;
5860
59- final pageData = page.data.page;
60-
61- final displayTitle =
62- pageData['breadcrumb' ] ?? pageData['short-title' ] ?? pageData['title' ];
63- if (displayTitle is ! String || displayTitle.isEmpty) {
61+ final pageBreadcrumb = page.breadcrumb;
62+ if (pageBreadcrumb == null ) {
6463 return null ;
6564 }
6665
@@ -85,15 +84,10 @@ class PageBreadcrumbs extends StatelessComponent {
8584 // Skip if no index page found.
8685 if (indexPage == null ) continue ;
8786
88- final indexPageData = indexPage.data.page;
89- final indexTitle =
90- indexPageData['breadcrumb' ] ??
91- indexPageData['short-title' ] ??
92- indexPageData['title' ];
93- if (indexTitle is String && indexTitle.isNotEmpty) {
87+ if (indexPage.breadcrumb case final indexBreadcrumb? ) {
9488 breadcrumbs.add (
9589 _BreadcrumbItem (
96- title: indexTitle ,
90+ title: indexBreadcrumb ,
9791 url: indexPage.url,
9892 ),
9993 );
@@ -109,7 +103,7 @@ class PageBreadcrumbs extends StatelessComponent {
109103 // Add the current page as the final breadcrumb.
110104 breadcrumbs.add (
111105 _BreadcrumbItem (
112- title: displayTitle ,
106+ title: pageBreadcrumb ,
113107 url: pageUrl,
114108 ),
115109 );
@@ -118,6 +112,19 @@ class PageBreadcrumbs extends StatelessComponent {
118112 }
119113}
120114
115+ extension on Page {
116+ String ? get breadcrumb {
117+ final pageData = data.page;
118+
119+ final breadcrumbString =
120+ pageData['breadcrumb' ] ?? pageData['shortTitle' ] ?? pageData['title' ];
121+ if (breadcrumbString is ! String || breadcrumbString.isEmpty) {
122+ return null ;
123+ }
124+ return breadcrumbString;
125+ }
126+ }
127+
121128final class _BreadcrumbItem {
122129 const _BreadcrumbItem ({required this .title, required this .url});
123130
@@ -157,12 +164,7 @@ final class _BreadcrumbItemComponent extends StatelessComponent {
157164 ],
158165 ),
159166 meta (attributes: {'property' : 'position' , 'content' : index.toString ()}),
160- if (! isLast)
161- span (
162- classes: 'material-symbols child-icon' ,
163- attributes: {'aria-hidden' : 'true' },
164- [text ('chevron_right' )],
165- ),
167+ if (! isLast) const MaterialIcon ('chevron_right' ),
166168 ],
167169 );
168170}
0 commit comments