WEB-4512 Footer AI provider links#109
Conversation
📝 WalkthroughWalkthroughThe footer banner markup, provider links, bottom layout, social-link accessibility attributes, and footer-specific responsive styling were updated. ChangesFooter update
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant FooterTemplate
participant ai-buttons
participant resources.Get
participant absolute-link
FooterTemplate->>ai-buttons: render provider links with shared query
ai-buttons->>resources.Get: load provider icons
ai-buttons->>absolute-link: pass provider URL, icon, and label
absolute-link-->>FooterTemplate: render outbound anchor
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@layouts/partials/footer.html`:
- Line 110: Update the footer banner link anchor in the bannerLinks rendering
loop to avoid duplicate fixed IDs: remove the unused id attribute or incorporate
the current banner item index into the generated value, while preserving the
existing label, URL, and accessibility attributes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: f1e28e64-3ba5-47f0-9b39-89813b751658
⛔ Files ignored due to path filters (5)
assets/icons/chatgpt.svgis excluded by!**/*.svgassets/icons/claude.svgis excluded by!**/*.svgassets/icons/gemini.svgis excluded by!**/*.svgassets/icons/grok.svgis excluded by!**/*.svgassets/icons/perplexity.svgis excluded by!**/*.svg
📒 Files selected for processing (2)
assets/scss/_styles_project.scsslayouts/partials/footer.html
0d3e69d to
6125f37
Compare
The footer banner adds icon links that open ChatGPT, Claude, Gemini, Grok, or Perplexity prefilled with a GoodData overview prompt, plus layout and a11y tweaks: logo/subtitle wrap, subscribe-action sublinks filtered out, aria-labels on icon-only social buttons. The learn-assets Footer.css the theme loads is older than the live site's footer styles, so local overrides bring visuals in line with www.gooddata.ai: 48px icon buttons in a 12px-gap left-aligned row, live text rhythm for the subtitle, and a full-width banner item with 80px vertical padding.
6125f37 to
a9aa49c
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@layouts/partials/footer.html`:
- Around line 24-31: Update the footer sublinks wrapper condition around the
`$link.items` loop so it renders only when at least one item passes the existing
`$sublink` eligibility checks: action is not "subscribe", and both link and
title are present. Preserve the current filtering and rendering for eligible
entries, while preventing the `<ul>` and collapse target from being emitted when
none remain.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 51af8a08-2f77-47ff-8d0a-974c3cb712e7
⛔ Files ignored due to path filters (5)
assets/icons/chatgpt.svgis excluded by!**/*.svgassets/icons/claude.svgis excluded by!**/*.svgassets/icons/gemini.svgis excluded by!**/*.svgassets/icons/grok.svgis excluded by!**/*.svgassets/icons/perplexity.svgis excluded by!**/*.svg
📒 Files selected for processing (2)
assets/scss/_styles_project.scsslayouts/partials/footer.html
🚧 Files skipped from review as they are similar to previous changes (1)
- assets/scss/_styles_project.scss
| {{ if and $link.items (gt (len $link.items) 0) }} | ||
| <ul class="gd-footer-banner-sublinks gd-footer-sublinks collapse d-lg-flex" id="gd-footer-banner-sublinks-item-{{ $index }}"> | ||
| <ul class="gd-footer-banner-sublinks gd-footer-sublinks collapse d-lg-flex w-100 justify-content-lg-end" id="gd-footer-banner-sublinks-item-{{ $index }}"> | ||
| {{ range $sublink := $link.items }} | ||
| <li class="gd-footer-banner-sublinks-item gd-footer-sublinks-item"> | ||
| {{ if and $sublink.link $sublink.title }} | ||
| {{ template "absolute-link" (dict "url" $sublink.link "text" $sublink.title "class" "gd-footer-sublinks-item-link" "idPrefix" "footer-link-") }} | ||
| {{ else }} | ||
| <span class="gd-footer-sublinks-item-link"> </span> | ||
| {{ end }} | ||
| </li> | ||
| {{ if and (ne $sublink.action "subscribe") $sublink.link $sublink.title }} | ||
| <li class="gd-footer-banner-sublinks-item gd-footer-sublinks-item"> | ||
| {{ template "absolute-link" (dict "url" $sublink.link "text" $sublink.title "class" "gd-footer-banner-sublinks-item-link gd-footer-sublinks-item-link" "idPrefix" "footer-sublink-") }} | ||
| </li> | ||
| {{ end }} |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Avoid emitting an empty sublinks list after filtering.
The condition on Line 24 checks raw $link.items, while Line 27 filters out subscribe and invalid entries. If none remain, the template still emits an empty <ul> and collapse target, which can leave blank full-width spacing. Gate the wrapper on at least one eligible sublink.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@layouts/partials/footer.html` around lines 24 - 31, Update the footer
sublinks wrapper condition around the `$link.items` loop so it renders only when
at least one item passes the existing `$sublink` eligibility checks: action is
not "subscribe", and both link and title are present. Preserve the current
filtering and rendering for eligible entries, while preventing the `<ul>` and
collapse target from being emitted when none remain.
Summary
Proof of concept for the footer half of the AI entry-points work (the navbar Ask AI button + Kapa widget live in their own PR, #108):
assets/icons/). Render unconditionally as part of the shared footer.subscribe-action sublinks filtered out,aria-labelsupport on icon-only social buttons, mobile collapse title rendered withsafeHTML.learn-assets/css/Footer.cssthe theme loads is older than the live site's footer styles, so_styles_project.scssoverrides it: 48px icon buttons in a 12px-gap left-aligned row (was 29px right-aligned), live text rhythm for the subtitle, and a full-width banner item with 80px vertical padding (was 30px, centered at max-width 1360px). Overrides use higher-specificity descendant selectors because Footer.css loads after the theme stylesheet; the banner padding is scoped to Footer.css's own ≥993px breakpoint so mobile is untouched.Verification
Built cleanly with Hugo 0.119 (current production version). Rendered footer measured against the live gooddata.ai footer with headless Chromium — icon button sizes, gaps, margins, and banner padding now match the live computed styles.
Known intentional differences from the live footer: no "Subscribe for updates" link (filtered), no language dropdown row (docs has its own language switching).
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Style