AFL

Legacy audit

Widgets ported before the parity process, and whether to reuse, rework or discard each.

Audit of widgets ported before the parity process. All are migrated_unverified. Machine-readable copy: legacy-audit.json.

  • Legacy root: telstra-legacy-aflm-web (paths below are relative to it).
  • Set A: packages/ui/src on main. Set B: packages/ui/src on origin/legacy-poc.
  • Live reference: _migration-analysis/page-catalogue/pages/news-article-taylor-walker-retire.html.
  • Breakpoints in the live CSS: 640 / 840 / 1025 / 1300 (max-width) and 641 / 841 / 1026 / 1301 (min-width), plus a 1159/1160 nav breakpoint and 1352/1400 in the telstra-bar menus. tailwind-preset.css defines phablet/tablet/desktop/desktop-nav/wide at the min-width values, and still has Tailwind's default sm/md/lg.
  • Theming: competition themes (AFLM, AFLW, Gather Round, Finals) swap the --fill-*, --text-*, --button-* and --tag-content-* tokens (src/styles/includes/settings/_colour-tokens.scss, overridden in src/widgets/sites/aflm/misc/theme-switcher.ftl). t-dark/t-light only appear in the filters, full-page-parallax and photo-gallery-feature-embed SCSS. Article widgets use --dark-mode/--light-mode/--dark-text modifiers instead.

Verdicts

reuse means it should pass parity with small fixes. rework means keep the structure and rebuild the styles and variants. discard means rebuild from the legacy source.

PortSetPathClaims to portMapping right?Verdict
article-listAarticle-list/article-list.tsxnothingNearest is article-list/* via includes/components/media-listing.ftldiscard
global-footerAglobal-footer/global-footer.tsxnothingThe article page uses footer-menu/footer-menu.ftl and telstra-footer/telstra-footer.ftl. The global-footer/footer.ftl shell isn't on the pagediscard
imageAimage/image.tsxnothingphoto/photo.ftl, photo-no-caption.ftlrework
navigationAnavigation/navigation-menu.tsxnothingmain-navigation/includes/_menu-list.ftlrework (keep menusOf)
promoApromo/promo.tsxnothingLegacy promo has 10 variants plus 6 sidebar promos, and this matches none of themdiscard
rich-textArich-text/rich-text.tsxnothingarticle/standard.ftl article bodyrework
site-headerAsite-header/site-header.tsxnothingMixes telstra-bar and main-navigation togetherdiscard
section / row / columnAlayout/*nothingtemplates/article-standard.html regions, layout/_grids.scss, _widget.scssrework
club-menuBclub-menu.tsxtelstra-bar/club-menu-v3.ftl, includes/components/club-list.ftlYes. The toggle JS is main-navigation/js/navigation-drop-down.jsrework
media-carouselBmedia-carousel.tsxmixed-content/slider.ftl, common/slider/slider.jsYesrework
media-thumbnailBmedia-thumbnail.tsxincludes/components/media-thumbnail.ftlYesrework
promo-listBpromo-list.tsxpromo-list/includes/_promo-listing.ftlYesrework
promo-side-by-sideBpromo-side-by-side.tsxpromo/includes/_side-by-side-promo.ftl, promo/side-by-side.ftlYesreuse
promo-side-by-side-listBpromo-side-by-side-list.tsxpromo/side-by-side-list.ftlYesreuse
scoreboard-badgeBscoreboard-badge.tsxnothingNo legacy sourcediscard
telstra-barBtelstra-bar.tsxtelstra-bar/telstra-bar-v3.ftl, -aflw.ftlYesrework
telstra-dropdownBtelstra-dropdown.tsxincludes/components/telstra-dropdown-v3.ftlYes (the widget file is telstra-bar/telstra-dropdown-v3.ftl)rework
widget-headerBwidget-header.tsxincludes/components/widget-header.ftlYesrework
article-widget-placeholderBarticle-widget-placeholder.tsxSays it is a placeholdern/adiscard
shadcn buttonB (same file on main)components/ui/button.tsxnothingstyles/includes/components/_button.scssrework
shadcn carouselBcomponents/ui/carousel.tsxslider.js tracking eventsPartlyrework

Cross-cutting gaps:

  • Set B uses a different interface from main. B components take props and use blockContainer(meta, isEditable). Main expects BlockProps<T> with a .schema.ts, and its blockContainer(edit) takes one argument.
  • B has no fixtures. Only story args exist.
  • Carousel dependencies are missing on main. embla-carousel-react and lucide-react are not installed.
  • Set A ports are generic placeholders. They use shadcn/Tailwind defaults with no legacy BEM, use sm/md/lg breakpoints, and have invented style variants.

Gaps per port

PortMarkup / BEMVariantsBreakpointsThemingBehaviourDataTests / stories / fixtures
A article-listGeneric card grid with no media-list or media-thumbnail__* structureNo sidebar-regular, sidebar-featured, row-card-phablet or large-thumbnail variants. No widget-header--sidebar. No widget-footer view-more, load-more or <ol>sm/lg instead of block-list-4 / -3-tablet / -1-phabletshadcn card/borderNo trackCardClicksNo type, duration, publish label, competition reference, tag, sponsor, or premium/geo flagstest, story. No content fixture
A global-footerNo partners strip, app/social rows, back-to-top, afl-logo-sponsor sprite or Telstra footerInvented default/dark/minimalsm/lg, max-w-7xlpartialNo nav/partner trackingAcknowledgement is rich text here, an i18n label in legacytest, story, fixture
A imageNo photo__* BEM or camera caption iconNo photo--portraitNo responsive srcsetnoneNo floating embeddable behaviourCaption should fall back to photo.descriptiontest, story, fixture
A navigationGeneric <nav><ul>n/an/anoneActive state is an exact href match, not get-active-node.ftlmenusOf is reusabletest, fixture. No story
A promoGeneric cardNo variantsnoneInline backgroundColorNo #VideoModal activator (Brightcove_ID)n/atest, story, fixture
A rich-textParagraph and heading text onlyNo links, lists, tables or embedsn/aNot _article-body.scssNo article-body.jsn/atest, story, fixture
A site-headerNo mega-menu, dynamic-more, drawer, search, AFLID, regional display, secondary nav or socialInvented styles and logoDarkmd (768) instead of 1159/1160Invented CTA<details> instead of the dropdown state machinen/atest, story, fixture
A layoutmax-w-7xl instead of .wrapperNo main/sidebar/sticky-sidebar/bottom regionsn/aDark is bg-fill-900. Legacy widget--dark-mode uses --fill-bg-featuren/aGap/span settings are inventedtests, story, fixtures
B club-menuclubs-menu-v3__* and club-list__* not reproducedn/aNo 1352/1400 rulesok (fixed tokens)Port of useDropdown is okTakes ReactNode icons. Legacy reads content.additionalCssClasses sprite and getActiveClasstest, story
B media-carouselNo slider__* markup or js-paginatorNo widget--mc or removeMobileBorderTopSlide widths not traced to _slider.scssn/aEmbla instead of slider.js (documented). No betting/18+ gatingoktest, story
B media-thumbnailTitle is h3 (legacy uses h2). Adds a "Premium" badge legacy doesn't have. Emoji instead of gather-round-flag/trophy sprites. No comp logo, type icon, chevron or content-label-edgeNo modifier support at all: sidebar-regular (applies at ≥1026 and ≤640), sidebar-featured, row-card(-phablet), feature-card, hero-card, wide-card, video-player, skeleton, --has-footer, --has-publish-label, --{label}, --premium, --trailer640/840/1025/1300 not implementedFixed tokens. No dark feature-cardNo modal activator (#VideoModal/#GalleryModal with data-ui-args). No trailer player. No lazy srcsetdata-tag-geo-blocked should hold the region stringtest, 8 stories
B promo-listCloseMissing bgImage (Large), --image-only, --parallax, widget-header--light-modeColumn counts wrong for every size (see JSON)Dark mode uses bg-theme-primary. Legacy uses --fill-bg-featureNo click tracking or betting gatingMatches playlist.playlistItemstest, 6 stories
B promo-side-by-side(-list)Tailwind instead of promo-sbs__* BEM, no .wrapperimage-right alternation is correct841 is correctokNo #VideoModal activatorCTA should need linkTexttests, stories
B telstra-bartelstra-bar-v3__* BEM not reproducedAFL/AFLW handledtablet is 840 (min) in legacy, 841 in the port--fill-nav-secondary is correctTracking callback is okTakes ReactNode icons instead of content.additionalCss sprite + -white. Missing aflPlayUrl customPropertiestest, stories
B telstra-dropdownHeader background image missingn/aNo 1352 rulen/aFocus trap and Escape are okIcons should come from additionalCssClassestest, stories
B widget-headerArrow is a text glyph. Legacy uses the arrow-right sprite, or telstra-external plus _blank for external linksMissing --sidebar, --smaller-text, --has-sponsor (+ sponsor slot), --light-modeNo 2.8rem title ≤840 or 2.2rem ≤640Arrow fill should be --fill-accent-secondaryn/aMissing headingTag, backupTitle, cssClass and nested slottest, 5 stories

Article page widgets

Source page: afl.com.au/news/<id>/<slug>. Every legacy path below exists.

#idTypeRegionLegacy source (primary)Prior portThemeModesData
1telstra-barchromeheadertelstra-bar/telstra-bar-v3.ftl, _telstra-bar-v3.scss, js/telstra-bar.jsB telstra-bar, reworkyeslightcms (menu.children, customProperties)
2telstra-bar-club-menuchromeheadertelstra-bar/club-menu-v3.ftl, includes/components/club-list.ftlB club-menu, reworkyeslightcms
3telstra-bar-dropdownchromeheadertelstra-bar/telstra-dropdown-v3.ftl, includes/components/telstra-dropdown-v3.ftlB telstra-dropdown, reworknolightcms
4main-navigationchromeheadermain-navigation/main-navigation-bar.ftl, includes/_menu-list.ftl, js/navigation.js, js/navigation-drop-down.jsA site-header, discardyeslightcms
5main-navigation-dynamic-morebehaviourheadermain-navigation/js/dynamic-more.js, templates/dynamic-more.htmlnoneyeslightstatic
6aflid-userchromeheaderaflid-user/aflid-user.ftl, js/aflid-user.js, templates/*.htmlnoneyeslightapi: Okta authClient
7main-menu-regional-displaybehaviourheadermain-navigation/js/providers/MainMenuRegionalDisplayProvider.jsx (.js-regional-display)noneyeslightstatic (local site settings)
8advert-leaderboardelementheaderadvert/leaderboard-v2.ftl, advert/js/providers/AdvertisementProvider.jsxnonenolightapi: GPT (window.ReactGPTAds)
9article-headerpage-sectionmainarticle/includes/_article-header.ftl, _article-author.ftl (called from article/standard.ftl)noneyeslightcms
10article-author-photobehaviourmainarticle/js/article-author-photo.jsnonenolightapi: {aflApi}content/{account}/bio/en/{authorId}
11article-age-tagbehaviourmainarticle/js/article-age-tag.jsnonenolightstatic
12bio-trackingbehaviourmainNot found in the legacy repo or the cached HTMLnonenolightunknown
13article-bodypage-sectionmainarticle/standard.ftl (not static.ftl), _article-body.scss, js/article-body.jsA rich-text, reworkyeslightcms
14article-video-playerelementmainincludes/components/inline-player.ftl, includes/macros/feature-video.ftl, common/video/video.jsB placeholder, discardyeslightcms + Brightcove
15skip-to-contentbehaviourmainincludes/macros/feature-video.ftl, embeddable/js/skip-to-content.jsnonenolightstatic
16social-share-pageshared-blockmainincludes/components/social-share.ftl, social-share/share-page.js, common/social/page-share.jsnoneyeslightstatic
17advert-sticky-bannerelementoverlayadvert/sticky-banner-v2.ftl, advert/js/close-ad.jsnonenolightapi: GPT
18advert-mrec-sidebarelementsidebaradvert/mrec-v2.ftlnonenolightapi: GPT
19article-list-sidebar-must-watchelementsidebararticle-list/article-list-must-watch.ftl + widget-header--sidebar + media-thumbnail--sidebar-regularA article-list, discard (build on B media-thumbnail + widget-header)yeslightcms
20article-list-sidebar-next-upelementsidebararticle-list/article-list-sidebar.ftl (same markup)A article-list, discardyeslightcms
21video-sidebar-featuredelementsidebarvideo/featured-video.ftl. In the cached page it renders from article/featured-article.ftl (single-video__featured media-thumbnail--sidebar-featured)B media-thumbnail, reworkyeslightcms
22advert-mrec-sticky-sidebarelementsidebaradvert/mrec-sticky-v2.ftlnonenolightapi: GPT
23parallax-content-up-nextelementmainarticle/up-next.ftl, includes/components/parallax-content.ftl, common/content/parallax-content.jsnoneyeslight, darkcms (relatedContent / publishedBefore / publishedAfter)
24article-list-full-width-videoelementmainvideo-list/video-list-grid.ftl via media-listing.ftl (default thumbnail)A article-list, discardyeslightcms
25article-list-row-card-phabletelementmainarticle-list/article-list-4-per-row.ftl (media-thumbnail--row-card-phablet)A article-list, discardyeslightcms
26footer-menuchromefooterfooter-menu/footer-menu.ftl, partners.ftl, appstore.ftl, js/footer-menu.jsA global-footer, discardyeslightcms
27scroll-to-topbehaviourfooterfooter-menu/js/scroll-to-top.jsnoneyeslightstatic
28telstra-footerchromefootertelstra-footer/telstra-footer.ftlA global-footer, discardnolightcms
29page-notificationsbehaviouroverlayNot found in the legacy repo or the cached HTMLnonenolightunknown
30adhoc-event-notificationsbehaviouroverlaynotifications/adhoc-event-notifications.ftl, js/adhoc-notification.js, js/adhoc-modal.jsnonenolightapi: {aflApi}broadcasting/afl/live/{video|audio} (polled)
31trade-radio-mini-popupbehaviouroverlaytrade-radio/trade-radio-mini-popup.ftl, js/TradeRadioMiniPopupProvider.jsx, js/TradeRadioLoader.jsxnoneyeslightapi: {aflApi}broadcasting/events, plus a content item for the image
32site-settings-modalbehaviouroverlaycommon/react/components/site-settings-modal/**, mounted from templates/general.html (.js-site-settings)noneyeslightapi: Okta isAuthenticated, Salesforce marketing prefs, {aflApi}content
33gallery-modalbehaviouroverlaymodal/modal.ftl, common/modal/gallery-modal.js, common/modal/constructor.jsnoneyeslightapi: {aflApi}content/{account}/playlist/en/{id}
34video-modalbehaviouroverlayvideo-modal/video-modal.ftl, js/video-modal-widget.js, common/video/video-modal.jsnoneyeslightapi: {aflApi}content/{account}/video/en/{id} (+ promo for sponsors)
35upsell-modalbehaviouroverlayupsell-modal/upsell-modal.ftl, js/upsell-modal.jsnoneyeslightapi: content/.../video/en/{id}, then content/.../promo/en/{promoId}

Corrections to the brief and to page-catalogue/results.json, checked against the live HTML:

  • The article body comes from article/standard.ftl, not article/static.ftl. In the live HTML, article__body has data-script="aflm_article" and comes right after @articleHeader. Neither is true of static.ftl.
  • close-ad and the leaderboard/MRECs are the -v2 React-ad FTLs. The live markup contains .js-advert-2, which only the -v2 files emit.
  • The full-width default-thumbnail list ("Latest Videos") is a video-list FTL. Its data-widget="article-list" comes from the shared media-listing.ftl, not from the article-list/ folder.
  • The featured sidebar video in the cached page is article/featured-article.ftl. video/featured-video.ftl emits data-widget="video", which does not appear in either cached article.
  • page-notifications and bio-tracking don't exist anywhere in this repo. Confirm on the live page whether they are injected by the platform before scoping them.