refactor: rebuild Help page as docs hub grid - #2092
Conversation
Mirror the godam.io/docs landing page: hero with site search, three sections of hub cards (On your site / The cloud platform / On your devices). Search opens godam.io/?s=<query> in a new tab. Hub copy, badges and slugs move to pages/help/constants.js so the docs base URL is a single constant. Cards without a published hub render an inert action instead of linking out.
There was a problem hiding this comment.
Pull request overview
Rebuilds the Help page as a documentation hub with searchable, categorized cards.
Changes:
- Adds documentation hub metadata, icons, cards, and external search.
- Introduces responsive styling for the redesigned page.
- Retains shared header, footer, and analytics controls.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
pages/help/App.js |
Renders the new documentation hub layout. |
pages/help/constants.js |
Defines documentation URLs and hub metadata. |
pages/help/components/DocsSearch.jsx |
Implements external documentation search. |
pages/help/components/HubCard.jsx |
Renders published and unavailable hubs. |
pages/help/components/HubIcon.jsx |
Provides hub SVG icons. |
pages/help/index.scss |
Styles the responsive Help page. |
assets/src/css/admin.scss |
Removes the former Help-page margin correction. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| <div className="godam-help-sections"> | ||
| { sections.map( ( section ) => ( | ||
| <section key={ section.id } className="godam-help-section"> | ||
| <p className="godam-help-eyebrow">{ section.label }</p> |
| #root-video-help { | ||
| background-image: url(../../assets/src/images/hero-bg.webp); | ||
| background-size: cover; | ||
| background-color: #fff; | ||
| } |
🔍 WordPress Plugin Check Report
📊 Report
❌ Errors (1)📁 readme.txt (1 error)
|
| 📍 Line | 🔖 Check | 💬 Message |
|---|---|---|
0 |
mismatched_plugin_name | Plugin name "GoDAM - Organize WordPress Media Library & File Manager with Unlimited Folders for Images, Videos & more" is different from the name declared in plugin header "GoDAM". |
0 |
trademarked_term | The plugin name includes a restricted term. Your chosen plugin name - "GoDAM - Organize WordPress Media Library & File Manager with Unlimited Folders for Images, Videos & more" - contains the restricted term "wordpress" which cannot be used at all in your plugin name. |
📁 composer.json (1 warning)
| 📍 Line | 🔖 Check | 💬 Message |
|---|---|---|
0 |
missing_composer_json_file | The "/vendor" directory using composer exists, but "composer.json" file is missing. |
📁 assets/build/blocks/godam-gallery-v2/render.php (2 warnings)
| 📍 Line | 🔖 Check | 💬 Message |
|---|---|---|
15 |
WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound | Global variables defined by a theme/plugin should start with the theme/plugin prefix. Found: "$inner_block_video_ids". |
23 |
WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound | Global variables defined by a theme/plugin should start with the theme/plugin prefix. Found: "$inner_block_video_ids". |
📁 assets/build/css/main.css (1 warning)
| 📍 Line | 🔖 Check | 💬 Message |
|---|---|---|
0 |
EnqueuedStylesScope | This style is being loaded in all contexts. |
📁 assets/src/libs/analytics.min.js (5 warnings)
| 📍 Line | 🔖 Check | 💬 Message |
|---|---|---|
0 |
EnqueuedScriptsScope | This script is being loaded in all frontend contexts. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880 (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880/2026/08/26/hello-world/ (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880/sample-page/ (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880/demo-attachment-post/ (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead. |
📁 assets/build/js/main.min.js (5 warnings)
| 📍 Line | 🔖 Check | 💬 Message |
|---|---|---|
0 |
EnqueuedScriptsScope | This script is being loaded in all frontend contexts. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880 (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880/2026/08/26/hello-world/ (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880/sample-page/ (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead. |
0 |
NonBlockingScripts.NoStrategy | This script on http://localhost:8880/demo-attachment-post/ (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead. |
🤖 Generated by WordPress Plugin Check Action • Learn more about Plugin Check
| * @return {string} Absolute search URL. | ||
| */ | ||
| export const getDocsSearchUrl = ( query ) => { | ||
| const params = new URLSearchParams( { s: query } ); |
There was a problem hiding this comment.
Search scope changed: post_type=docs was dropped.
The old help search built ?s=<q>&post_type=docs (docs only). getDocsSearchUrl now builds ?s=<q> with no post type, so the query runs against the whole godam.io site (blog, product, marketing pages), not just the documentation hubs. The hero copy says "search across every hub", but the hubs are all docs, so this looks broader than intended. If docs scoping should stay, restore the param:
| const params = new URLSearchParams( { s: query } ); | |
| const params = new URLSearchParams( { s: query, post_type: 'docs' } ); |
If searching the whole site is deliberate, please confirm.
| <div className="godam-help-sections"> | ||
| { sections.map( ( section ) => ( | ||
| <section key={ section.id } className="godam-help-section"> | ||
| <p className="godam-help-eyebrow">{ section.label }</p> |
There was a problem hiding this comment.
Section titles are not headings (a11y regression).
Each group label (On your site, The cloud platform, On your devices) renders as <p className="godam-help-eyebrow">, while card titles are <h3>. So the heading outline jumps from <h1> (hero) straight to <h3> (cards) with no <h2> for the section groups. The previous layout had a heading per section. Screen-reader users lose the section structure and hit a skipped heading level. Consider rendering section.label as an <h2> styled with the eyebrow class.
| </span> | ||
| </a> | ||
| ) : ( | ||
| <span className="godam-help-button godam-help-button--disabled" aria-disabled="true"> |
There was a problem hiding this comment.
Disabled cards still read "Open docs".
For Coming soon / Planned hubs (Shopify, iOS, macOS, Android) the greyed action still says "Open docs", which implies docs exist. The component comment says the badge should be "the only claim the card makes", but this action is itself a claim. Consider mirroring the badge text (e.g. "Coming soon") or omitting the action for hubs without a slug.
| eyebrow: __( 'Core · WordPress', 'godam' ), | ||
| title: __( 'GoDAM for WordPress', 'godam' ), | ||
| description: __( 'The WordPress plugin: upload, transcode, blocks, page builders, interactive layers, integrations & analytics.', 'godam' ), | ||
| badge: __( '70+ articles', 'godam' ), |
There was a problem hiding this comment.
Article counts and slugs are hardcoded and will drift.
Counts like 70+ articles / 5 articles have no source of truth and go stale as the docs change. The slug values (wordpress, woo, central, platform, chrome) must match the live hub URLs exactly or the "Open docs" link 404s. Worth confirming each resolves under https://godam.io/docs/<slug>/ (note WooCommerce maps to woo, not woocommerce).
| icon: Folder, | ||
| }, | ||
| ]; | ||
| const sections = getHubSections(); |
There was a problem hiding this comment.
Minor (build once): getHubSections() rebuilds the full sections/hubs array and re-runs every __() call on each App render. The data is static, so it could be a module-level constant or wrapped in useMemo and built once.
| } | ||
|
|
||
| &:hover { | ||
| &__eyebrow { |
There was a problem hiding this comment.
Minor (dedup): .godam-help-card__eyebrow repeats .godam-help-eyebrow almost verbatim (same 12px / 700 / 0.09em uppercase accent); only the margin differs. Sharing one class or a %placeholder and overriding just the margin would avoid the duplicate.
| icon: 'woocommerce', | ||
| eyebrow: __( 'Add-on · WooCommerce', 'godam' ), | ||
| title: __( 'GoDAM for WooCommerce', 'godam' ), | ||
| description: __( 'Make your store shoppable — shoppable video, product reels and product hotspots.', 'godam' ), |
There was a problem hiding this comment.
Style (copy): several hub descriptions use em-dashes (this line plus 71, 87, 96), as do the hero subtitle in App.js and the placeholder in DocsSearch.jsx. GoDAM copy elsewhere tends to avoid them - a hyphen or comma reads more consistently. Minor / subjective.
| import GoDAMFooter from '../godam/components/GoDAMFooter.jsx'; | ||
| import { useSaveMediaSettingsMutation, useGetMediaSettingsQuery } from '../godam/redux/api/media-settings.js'; | ||
| import { updateMediaSetting } from '../godam/redux/slice/media-settings.js'; | ||
| import { getHubSections } from './constants'; |
There was a problem hiding this comment.
Minor (consistency): these new imports omit file extensions (./constants, ./components/DocsSearch, ./components/HubCard), while the rest of the codebase imports with them (GoDAMHeader.jsx, media-settings.js). Same in DocsSearch.jsx and HubCard.jsx. Adding .js / .jsx keeps the style uniform.
Mirror the godam.io/docs landing page: hero with site search, three sections of hub cards (On your site / The cloud platform / On your devices). Search opens godam.io/?s= in a new tab.
Hub copy, badges and slugs move to pages/help/constants.js so the docs base URL is a single constant. Cards without a published hub render an inert action instead of linking out.
Demo
Screen.Recording.2026-08-26.at.7.56.40.AM.mov