Skip to content

Rebrand: rename bb-/bbb- prefixes to gnh-#284

Merged
simonsmallchua merged 28 commits into
mainfrom
chore/rebrand-gnh-prefix
Mar 28, 2026
Merged

Rebrand: rename bb-/bbb- prefixes to gnh-#284
simonsmallchua merged 28 commits into
mainfrom
chore/rebrand-gnh-prefix

Conversation

@simonsmallchua
Copy link
Copy Markdown
Contributor

@simonsmallchua simonsmallchua commented Mar 27, 2026

Summary

  • Renames all bb- CSS class prefixes to gnh- (Good Native Hover) across stylesheets and HTML
  • Renames all bbb- data binding attributes to gnh- in HTML and JavaScript
  • Renames 16 bb-*.js files to gnh-*.js
  • Renames BB_APP, BB_CONFIG, BBAuth globals to GNH_APP, GNH_CONFIG, GNHAuth
  • Renames bb_/bbb_ localStorage/sessionStorage keys to gnh_
  • Renames bbb-extension-auth/bbb-webflow-connect message sources to gnh-
  • Updates all documentation references

~1100 occurrences across ~50 files. No Go backend or database changes.

Note on storage keys

Existing users will lose bb_active_org_id and bbb_cli_auth_state from localStorage — they'll need to re-select their org or re-authenticate once. Low impact.

Test plan

  • go test ./... — all pass (no backend changes)
  • Zero remaining bb-/bbb-/BB_APP/BB_CONFIG/BBAuth in code files
  • Load dashboard, settings, job details in browser — verify UI renders correctly
  • Check browser console for JS errors
  • Verify data binding works: job cards populate, stats update, auth gating functions

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores

    • Renamed frontend namespace across the site: legacy prefixes replaced with the new gnh-* identifiers (attributes, classes, script/bootstrap footprints, storage keys and globals).
  • Style

    • Updated UI hooks and CSS selectors site-wide to align with the new naming.
  • Content

    • Page heading/title updated: “Blue Banded Bee” → “Hover”.

simonsmallchua and others added 7 commits March 27, 2026 17:13
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@supabase
Copy link
Copy Markdown

supabase Bot commented Mar 27, 2026

Updates to Preview Branch (chore/rebrand-gnh-prefix) ↗︎

Deployments Status Updated
Database Sat, 28 Mar 2026 03:26:51 UTC
Services Sat, 28 Mar 2026 03:26:51 UTC
APIs Sat, 28 Mar 2026 03:26:51 UTC

Tasks are run on every commit but only new migration files are pushed.
Close and reopen this PR if you want to apply changes from existing seed or migration files.

Tasks Status Updated
Configurations Sat, 28 Mar 2026 03:26:53 UTC
Migrations Sat, 28 Mar 2026 03:26:55 UTC
Seeding Sat, 28 Mar 2026 03:26:56 UTC
Edge Functions Sat, 28 Mar 2026 03:26:56 UTC

View logs for this Workflow Run ↗︎.
Learn more about Supabase for Git ↗︎.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 27, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Renames frontend and integration namespaces from bb*/BBB*/bbb* to gnh*/GNH* across documentation, HTML templates, CSS, JS globals/exports, data-binding attributes, and package entrypoint; no functional control-flow changes beyond identifier and selector updates.

Changes

Cohort / File(s) Summary
Documentation
Roadmap.md, docs/architecture/ARCHITECTURE.md, docs/development/ATTRIBUTE_SYSTEM.md, docs/plans/ui-implementation.md, docs/security/SECURITY_REMEDIATION_PLAN.md, docs/architecture/webflow-designer-extension.md, web/README.md, webflow-designer-extension-cli/README.md
Replaced bb*/bbb*/BB*/BBB* examples and filenames with gnh*/GNH*; updated bundle and attribute references in examples and migration notes.
Global HTML Pages & Auth UIs
auth-callback.html, auth-modal.html, cli-login.html, extension-auth.html, homepage.html, invite-welcome.html, welcome.html, web/templates/extension-auth.html
Swapped global app/config/auth globals and script includes to GNH_*/gnh-*; HTML class/selector namespace changes in auth modals/pages; script src updates to gnh bundles.
Core Bootstrap & Package
web/static/js/gnh-bootstrap.js, web/static/js/core.js, web/package.json
Renamed bootstrap/global namespace to GNH_APP, readiness attribute data-gnh-ready, config source to GNH_CONFIG; changed package.json main entry to static/js/core.js.
Data Binder & Attributes
web/static/js/gnh-data-binder.js, web/static/js/gnh-dashboard-actions.js, web/static/js/gnh-domain-search.js, web/static/app/lib/domain-search.js, web/templates/job-details.html
Renamed BBDataBinderGNHDataBinder, migrated data-bb-*/bbb-* attributes to data-gnh-*/gnh-*, and updated dashboard action attribute reads to gnh-action.
Auth & Auth Extension Scripts
web/static/js/gnh-auth-extension.js, web/static/js/auth.js, web/static/js/gnh-auth-extension.js, web/static/js/gnh-invite-flow.js, web/static/js/gnh-invite-welcome.js, web/static/js/gnh-welcome.js, web/static/app/test-module.html
Replaced window.BBAuth/BB* globals and storage keys with window.GNHAuth/GNH* and gnh_* keys; updated invite/auth flow global exports and related checks.
Global Nav & Navigation
web/static/js/gnh-global-nav.js, web/static/app/lib/global-nav.js, web/partials/global-nav.html
Switched global-nav to use GNH_APP readiness/org APIs and remapped DOM classes/selectors from .bb-* to .gnh-*; event name bb:org-switchedgnh:org-switched.
Pages & Page Scripts
dashboard.html, settings.html, web/static/app/pages/dashboard.js, web/static/app/pages/job-details.js, web/static/app/pages/settings.js, web/static/js/job-page.js, web/static/app/pages/webflow-jobs.js, web/static/app/pages/webflow-login.js
Migrated page templates and runtime selectors/bootstrapping comments to gnh-*/GNH_*; replaced many bbb-* binding attributes and bb-* classes with gnh-*.
Settings & Integrations
web/static/app/lib/settings/..., web/static/app/lib/settings/integrations/google.js, .../slack.js, .../webflow.js, web/static/app/lib/settings/organisations.js, web/static/app/lib/settings/team.js, web/static/app/lib/settings/schedules.js
Updated DOM selectors, delegation and template usage to gnh-action/gnh-id/gnh-template and remapped UI classes from bb-*/bbb-* to gnh-*; org-switched event renamed.
Integrations Runtime Modules
web/static/js/gnh-google.js, web/static/js/gnh-slack.js, web/static/js/gnh-webflow.js, web/static/js/gnh-invite-flow.js, web/static/js/gnh-domain-search.js
Replaced attribute/class selectors and message source identifiers to gnh-*; renamed global API objects (e.g., BBDomainSearchGNHDomainSearch).
Styles
web/static/styles/app.css
Comprehensive CSS class renames from .bb-*/.bbb-* to .gnh-* across nav, notifications, modals, auth, buttons, dashboard, jobs, settings, and utilities.
Static JS Bundles & Filenames
web/static/js/..., web/README.md, assorted HTML script tags
Updated references to static bundles and documented bundles from bb-* to gnh-* (e.g., bb-data-binder.jsgnh-data-binder.js, bb-global-nav.jsgnh-global-nav.js).
Backend config snippet
internal/api/handlers.go
Emits browser config into window.GNH_CONFIG instead of window.BBB_CONFIG in the injected snippet.
Utilities & Metadata
web/static/js/gnh-metadata.js, web/static/app/lib/auth-session.js, web/static/app/lib/integration-http.js
Tooltip/info icon attributes and tooltip classnames switched to gnh-*; comments updated to GNHAuth; integration-http comment references renamed.
Webflow Designer Extension CLI
webflow-designer-extension-cli/src/index.ts
Replaced persisted key and origin constants from bbb_*/DEFAULT_BBB_APP_ORIGIN to gnh_*/DEFAULT_GNH_APP_ORIGIN; message source/validation and GNH_CONFIG lookups updated.

Sequence Diagram(s)

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Rebrand: rename bb-/bbb- prefixes to gnh-' directly and accurately reflects the main objective of this changeset: a systematic rebranding that renames all CSS and attribute prefixes throughout the codebase.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 27, 2026

🏷️ Release Preview

When this PR is merged, it will automatically create:

  • Version: v0.30.2 (patch release)
  • Tag: v0.30.2
  • GitHub Release: Pre-release with changelog content

The changelog will be updated and committed automatically.


💡 Tip: Update the changelog heading to control release type:

  • ## [Unreleased] or ## [Unreleased:patch] → patch release (default)
  • ## [Unreleased:minor] → minor release
  • ## [Unreleased:major] → major release

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 19

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (8)
webflow-designer-extension-cli/README.md (1)

1-1: 🧹 Nitpick | 🔵 Trivial

Consider updating the document title.

The title still references "Blue Banded Bee" which appears to be the old branding. Should this be updated to reflect the new "Good Native Hover" / "GNH" naming convention for consistency with the rebrand?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webflow-designer-extension-cli/README.md` at line 1, Update the README title
string that currently reads "# Blue Banded Bee Webflow Designer Extension (Smoke
Test)" to reflect the rebrand; replace the old branding with the new name (e.g.,
"Good Native Hover" or "GNH") so the header becomes something like "# Good
Native Hover (GNH) Webflow Designer Extension (Smoke Test)" to ensure
consistency across documentation.
auth-modal.html (1)

1-364: ⚠️ Potential issue | 🟡 Minor

Address Prettier formatting.

The pipeline indicates this file is not formatted according to Prettier. Please run Prettier to fix formatting before merging.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@auth-modal.html` around lines 1 - 364, The HTML file (elements like
authModal, loginForm, signupForm, resetForm and functions
showSignupForm/showLoginForm) is not formatted to Prettier standards; run your
project's Prettier formatter (or npm/yarn script like npm run format) against
auth-modal.html, or apply the repo's .prettierrc settings, then stage the
resulting formatted file and push the changes so the file conforms to Prettier
rules before merging.
web/static/js/gnh-invite-flow.js (1)

183-188: ⚠️ Potential issue | 🟠 Major

Rename window.BBInviteFlow to window.GNHInviteFlow across all files.

The global export at line 183 still uses the old BB prefix, inconsistent with the updated GNHAuth references. Additionally, three other files depend on this export and must be updated:

  • web/static/js/gnh-settings.js (lines 270, 272, 1080)
  • web/static/js/gnh-invite-welcome.js (line 50)

Rename the declaration and all usages to maintain consistency with the rebrand.

Proposed changes

In web/static/js/gnh-invite-flow.js (line 183):

-  window.BBInviteFlow = {
+  window.GNHInviteFlow = {

In web/static/js/gnh-settings.js:

-    if (!window.BBInviteFlow?.handleInviteTokenFlow) return;
+    if (!window.GNHInviteFlow?.handleInviteTokenFlow) return;
-    const result = await window.BBInviteFlow.handleInviteTokenFlow({
+    const result = await window.GNHInviteFlow.handleInviteTokenFlow({
-      } else if (window.BBInviteFlow?.getInviteToken?.()) {
+      } else if (window.GNHInviteFlow?.getInviteToken?.()) {

In web/static/js/gnh-invite-welcome.js (line 50):

-    const inviteFlow = window.BBInviteFlow;
+    const inviteFlow = window.GNHInviteFlow;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-invite-flow.js` around lines 183 - 188, The global export
is still named window.BBInviteFlow but should be renamed to window.GNHInviteFlow
to match the rebrand; update the export in gnh-invite-flow.js to
window.GNHInviteFlow (exporting getInviteToken, clearInviteTokenFromURL,
fetchInvitePreview, handleInviteTokenFlow) and rename all usages/calls of
BBInviteFlow to GNHInviteFlow in the dependent files mentioned (gnh-settings.js
occurrences around the referenced lines and gnh-invite-welcome.js at line 50) so
callers reference the new symbol consistently.
web/static/app/pages/settings.js (1)

259-261: 🧹 Nitpick | 🔵 Trivial

Rename custom event to align with rebrand.

The bb:org-switched event still uses the old prefix. If the rebrand should be comprehensive, this event needs renaming to gnh:org-switched across all 17 dispatch and listen sites in the codebase (gnh-settings.js, gnh-global-nav.js, gnh-data-binder.js, core.js, app/lib/global-nav.js, app/lib/settings/organisations.js, app/pages/settings.js, and app/pages/dashboard.js).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/app/pages/settings.js` around lines 259 - 261, The custom event
name "bb:org-switched" must be renamed to the new brand "gnh:org-switched"
everywhere it's dispatched or listened for; update all listeners (e.g., the
document listener in settings.js that calls refreshSections()) and all dispatch
sites (search for dispatchEvent or CustomEvent uses named "bb:org-switched" in
gnh-settings.js, gnh-global-nav.js, gnh-data-binder.js, core.js,
app/lib/global-nav.js, app/lib/settings/organisations.js, app/pages/settings.js,
app/pages/dashboard.js) to use "gnh:org-switched" so names match across the
codebase and preserve existing payloads and handler logic.
docs/security/SECURITY_REMEDIATION_PLAN.md (1)

116-147: ⚠️ Potential issue | 🟡 Minor

Retitle Issue 4 with the renamed file.

The heading above this block still says bb-data-binder.js:586, while the file reference and checklist here now use gnh-data-binder.js. The plan should use one filename throughout.

Patch
-## Issue 4: ESLint - Non-literal RegExp (bb-data-binder.js:586)
+## Issue 4: ESLint - Non-literal RegExp (gnh-data-binder.js:586)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/security/SECURITY_REMEDIATION_PLAN.md` around lines 116 - 147, Update
the heading that currently references bb-data-binder.js so it consistently names
gnh-data-binder.js throughout the SECURITY_REMEDIATION_PLAN.md entry; locate the
block that starts with "**Severity**: MEDIUM **File**:" and change the filename
in the heading/issue title to "gnh-data-binder.js" to match the rest of the
checklist and implementation plan, and ensure any other occurrences of
"bb-data-binder.js" in that section are renamed and consistent.
web/static/js/gnh-auth-extension.js (1)

284-310: ⚠️ Potential issue | 🟡 Minor

Rename BBDomainSearch to GNHDomainSearch for consistency.

The module BBDomainSearch (defined in web/static/js/gnh-domain-search.js and referenced throughout web/static/js/gnh-auth-extension.js) uses the old naming convention, whilst the selector .gnh-domain-search and file name use the new convention. To maintain consistency across the rebrand, this should be renamed to GNHDomainSearch.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-auth-extension.js` around lines 284 - 310, In
setupJobDomainSearch(), update all references from window.BBDomainSearch to
window.GNHDomainSearch (including the setupDomainSearchInput call) to match the
rebrand; ensure the same rename is applied anywhere else this file references
BBDomainSearch and confirm the module defined in gnh-domain-search.js
exports/attaches window.GNHDomainSearch so setupJobDomainSearch() can call
GNHDomainSearch.setupDomainSearchInput with the same options (input, container,
clearOnSelect, onSelectDomain, onCreateDomain, onError).
web/README.md (1)

57-67: ⚠️ Potential issue | 🟡 Minor

Fix the custom element name in the embed example.

The snippet still opens with <bb-data-loader> but now closes with </gnh-data-loader>. Copied as-is, that is invalid markup and the component will never upgrade.

🛠 Suggested fix
-<bb-data-loader
+<gnh-data-loader
   endpoint="/v1/jobs"
   template=".job-card.template"
   target=".jobs-grid"
   auto-load="true"
   require-auth="true"
 >
 </gnh-data-loader>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/README.md` around lines 57 - 67, The HTML embed example uses a mismatched
custom element tag: it opens with <bb-data-loader> but closes with
</gnh-data-loader>, which makes the markup invalid; update the closing tag to
match the opening tag (<bb-data-loader>) so the custom element can upgrade
correctly (look for the example block showing the bb-data-loader element and fix
the closing tag).
web/static/js/core.js (1)

79-92: ⚠️ Potential issue | 🔴 Critical

Use GNH_CONFIG here, not BGNH_CONFIG.

Line 80, Line 90, and Line 125 use a misspelled global. The rebrand renamed the config namespace to GNH_CONFIG, so this leaves ensureConfig() waiting on a symbol that will never be set and makes coreReady reject before the rest of the frontend initialises.

🛠 Suggested fix
-    if (window.BGNH_CONFIG) {
+    if (window.GNH_CONFIG) {
       return;
     }
@@
-    if (!window.BGNH_CONFIG) {
-      throw new Error("BGNH_CONFIG missing after loading /config.js");
+    if (!window.GNH_CONFIG) {
+      throw new Error("GNH_CONFIG missing after loading /config.js");
     }
@@
-    const config = window.BGNH_CONFIG || {};
+    const config = window.GNH_CONFIG || {};

Also applies to: 124-128

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/core.js` around lines 79 - 92, The ensureConfig() function is
checking the wrong global; replace all uses of BGNH_CONFIG with the rebranded
GNH_CONFIG so the function awaits the correct namespace. In function
ensureConfig (and any nearby references such as around coreReady), update the
conditional checks and the post-load existence check to use window.GNH_CONFIG
instead of window.BGNH_CONFIG so loading /config.js correctly unblocks
initialization.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@auth-modal.html`:
- Line 6: The close button <button class="gnh-modal-close"
onclick="closeAuthModal()">&times;</button> lacks an explicit type and can
default to type="submit" inside a form; update the element to include
type="button" to prevent unintended form submissions while preserving the
onclick handler and class (i.e., modify the <button class="gnh-modal-close"
onclick="closeAuthModal()"> element to explicitly set type="button").

In `@CHANGELOG.md`:
- Around line 97-99: The changelog's pre-rebrand entries were incorrectly
rewritten to use post-rebrand names (e.g., GNH_APP, gnh-bootstrap.js); revert
those entries in the sections before the 0.30.0/rebrand release so they use the
original artifact names that were shipped (restore original names for items such
as "Global nav notification badge", "bridge export", and "gnh-bootstrap.js"
occurrences in the pre-0.30.0 entries), and ensure the same fix is applied to
the other affected ranges mentioned (lines around 183-190 and 393-398) so only
entries from the rebrand release onward use the new GNH_APP/gnh-* terminology.

In `@cli-login.html`:
- Line 20: Run Prettier on the changed HTML file to fix formatting
inconsistencies; specifically reformat the line that assigns window.GNH_APP (the
statement "window.GNH_APP = Object.assign({}, window.GNH_APP || {}, { cliAuth:
true });") so it matches the project's Prettier config, then stage and commit
the formatted file.

In `@dashboard.html`:
- Around line 281-285: Several <button> elements are missing an explicit type
and therefore default to "submit"; add type="button" to each non-submit
control—specifically update the button with gnh-action="refresh-dashboard" and
the other buttons in the noted ranges (the buttons using class "gnh-btn
gnh-btn-secondary" and other gnh-action attributes in the 321-334, 372-385,
425-439, 459-462, 582-585 ranges) so they explicitly declare type="button" to
prevent accidental form submission.

In `@docs/architecture/ARCHITECTURE.md`:
- Around line 314-320: Update the example markup so it uses the live contract
attribute `gnh-id` (not `gnh-data-job-id`) for action payloads and point the
script tag to the real JavaScript entry point instead of `dashboard.html`;
specifically change the element using `gnh-data-job-id="123"` to use
`gnh-id="123"` (preserving the `gnh-action="view-job-details"` attribute) and
update the `<script src="...">` to reference the actual dashboard JS bundle used
by the app (the real entry file loaded by the dashboard, e.g., the dashboard
bundle or main JS file) so the comment “JavaScript automatically handles
gnh-action attributes” is accurate.

In `@docs/development/ATTRIBUTE_SYSTEM.md`:
- Around line 5-7: The overview incorrectly includes the old namespace expansion
phrase "Blue Banded Bee" after introducing the new `gnh-` prefix; remove the
parenthetical "(Blue Banded Bee)" or replace it with a correct, matching
description so the first paragraph is not self-contradictory—update the sentence
that mentions the `gnh-` namespace prefix to omit the old name and ensure only
the new `gnh-` identifier is referenced.

In `@extension-auth.html`:
- Line 11: Update the user-facing branding by replacing the "Blue Banded Bee"
text in the <title> element and the page heading (e.g., the <h1> or main
heading) with the new product name "GNH_APP" (Good Native Hover); locate the
<title> tag and the corresponding heading node in extension-auth.html and update
their inner text to the new name so the UI matches the codebase namespace.

In `@web/package.json`:
- Line 5: The package.json "main" field currently points to a non-existent file
"static/js/gnh-components.js"; update the "main" property to reference an actual
built bundle (e.g., the real output file from your build) or
restore/generate/rename the component bundle so that
"static/js/gnh-components.js" exists (alternatively revert to the previous name
"bb-components.js" if that is the correct artifact). Ensure the change is made
in package.json's "main" field and that your build process outputs the
referenced filename so the module can be resolved at runtime.

In `@web/partials/global-nav.html`:
- Around line 15-18: The nav action buttons (e.g., the button with id="loginBtn"
and the other buttons in the same nav blocks around lines 26-44 and 127-143) are
missing explicit types and default to "submit"; update each <button> used for
non-form actions to include type="button" so they do not trigger form
submission—locate the buttons by their ids/classes (e.g., id="loginBtn", any
class="gnh-button gnh-button-primary"/secondary within the nav partial) and add
type="button" to each.

In `@web/static/js/auth.js`:
- Around line 21-23: The runtime config lookup in auth.js uses the old bootstrap
global name BGNH_CONFIG causing missing-config fallbacks; update all occurrences
of BGNH_CONFIG to the rebranded GNH_CONFIG (e.g., the runtimeConfig initializer
and any other checks around auth/Turnstile gating such as the spots around lines
37-40 and 910-911) so the code reads window.GNH_CONFIG (and the equivalent
process-side lookup) and any references to the BGNH_CONFIG identifier are
renamed to GNH_CONFIG to restore proper auth initialization and Turnstile
gating.

In `@web/static/js/gnh-dashboard-actions.js`:
- Line 8: The selector and fallback are duplicated by copy/paste: change the
event.target.closest call to use a single selector "[gnh-action]" (remove the
duplicate), and replace the redundant getAttribute("gnh-action") ||
getAttribute("gnh-action") with a single element.getAttribute("gnh-action"); if
you actually intended a fallback, replace the second operand with the correct
alternate attribute (e.g., "data-gnh-action") instead of repeating the same
string.

In `@web/static/js/gnh-data-binder.js`:
- Around line 952-958: The code only reads gnh-* attributes from the single root
`instance`, causing renamed bindings (gnh-style:*, gnh-class, gnh-href, gnh-src,
gnh-attr:*) to be missed on descendant nodes of the cloned template; update the
logic to walk every node in the cloned instance (root and all descendants) and
for each node iterate its attributes and call `this.processTemplate(attr.value,
data)` as done for `gnh-style:`; ensure you handle the patterns `gnh-style:`,
`gnh-class`, `gnh-href`, `gnh-src`, and `gnh-attr:` when inspecting attribute
names so renamed bindings are applied to every node rather than only the root.
- Around line 463-465: The resolver currently only looks up forms by the
data-gnh-form attribute and therefore misses forms using the shorthand gnh-form;
update the lookup to select a form that matches either attribute (e.g. query for
`[data-gnh-form="${action}"],[gnh-form="${action}"]`) and when reading the
endpoint check both endpoint attributes (data-gnh-endpoint and gnh-endpoint) on
the found element before falling back to `/v1/${action}` so the const form
resolution and endpoint retrieval handle both full and shorthand attribute
names.
- Around line 84-89: scanAndBind() currently misses prefixed and shorthand
bindings because the CSS selectors only match literal attribute names; update
scanAndBind() to discover elements by inspecting attribute names rather than
relying solely on fixed selectors: iterate document.querySelectorAll('*') (or
broaden the initial NodeList) and for each element check element.attributes for
names that startWith 'gnh-style' or 'gnh-attr' (including names like
'gnh-style:width' and 'gnh-attr:data-id') and also check for shorthand
attributes 'gnh-src', 'gnh-alt', 'gnh-title', 'gnh-placeholder', 'gnh-value' and
the existing data-gnh-bind-style/data-gnh-bind-attr; when a match is found call
registerStyleElement() or registerAttrElement() for that element (and ensure
createTemplateInstance() likewise iterates attributes with startsWith to handle
gnh-attr:* on template instances).

In `@web/static/js/job-page.js`:
- Around line 1118-1123: The code currently tolerates a missing bootstrap global
and later dereferences window.GNH_APP.buildRestartJobPayload(job) causing
delayed runtime failures; change the startup sequence to require window.GNH_APP
to exist immediately: before awaiting whenReady/coreReady (the block around
window.GNH_APP?.whenReady and window.GNH_APP?.coreReady) check if window.GNH_APP
is defined and if not log a clear error and throw/abort startup so execution
stops early, and also add or keep a defensive guard before calling
buildRestartJobPayload(job) to avoid unguarded dereference; reference the
symbols window.GNH_APP, whenReady, coreReady, and buildRestartJobPayload when
making these changes.

In `@web/static/styles/app.css`:
- Line 1239: Several CSS declarations use quoted generic font family names and
an incorrectly cased keyword: remove the unnecessary quotes around the font
family names (e.g., change "Monaco", "Menlo", monospace to Monaco, Menlo,
monospace) in the font-family declarations referenced (the occurrences at the
same locations as the diff, e.g., the lines that set those font-family values)
and change the CSS keyword currentColor to lowercase currentcolor where it
appears (the occurrence flagged at the other location). Update each font-family
and the keyword in their respective rules so they comply with Stylelint's
unquoted font-family and keyword-case rules.

In `@web/templates/extension-auth.html`:
- Around line 11-17: Update the comment that references the runtime global to
use the correct symbol: replace mentions of window.BGNH_CONFIG with
window.GNH_CONFIG so the loading note points to the actual runtime namespace;
locate the string in the comment block that currently lists "/config.js — sets
window.BGNH_CONFIG" and change it to "/config.js — sets window.GNH_CONFIG"
(ensure any other occurrences of BGNH_CONFIG in the same file/comment are
similarly updated).

In `@web/templates/job-details.html`:
- Line 27: Several toolbar/menu buttons (e.g., the button with id
"revokeShareLinkBtn" and buttons with labels like "Revoke Link", plus other
toolbar/menu controls around lines referenced) are missing an explicit type and
default to submit; update each of those button elements (including the ones in
the blocks around lines 39-45, 47-64, 133, 338-350, 353, and 369-371) to include
type="button" so they don’t act as form submitters — locate elements by their id
attributes (e.g., revokeShareLinkBtn) or visible text and add type="button" to
each button element.

In `@webflow-designer-extension-cli/src/index.ts`:
- Around line 31-35: The code is reading the wrong global (window.BGNH_CONFIG)
so fetchSupabaseConfig() and other lookups never find the real config; update
all references to use window.GNH_CONFIG instead of window.BGNH_CONFIG (e.g.,
inside fetchSupabaseConfig() and the other occurrences around the
constants/initialisation logic), and use safe optional checks (optional
chaining/null checks) when accessing properties on window.GNH_CONFIG to avoid
runtime errors if it’s undefined.

---

Outside diff comments:
In `@auth-modal.html`:
- Around line 1-364: The HTML file (elements like authModal, loginForm,
signupForm, resetForm and functions showSignupForm/showLoginForm) is not
formatted to Prettier standards; run your project's Prettier formatter (or
npm/yarn script like npm run format) against auth-modal.html, or apply the
repo's .prettierrc settings, then stage the resulting formatted file and push
the changes so the file conforms to Prettier rules before merging.

In `@docs/security/SECURITY_REMEDIATION_PLAN.md`:
- Around line 116-147: Update the heading that currently references
bb-data-binder.js so it consistently names gnh-data-binder.js throughout the
SECURITY_REMEDIATION_PLAN.md entry; locate the block that starts with
"**Severity**: MEDIUM **File**:" and change the filename in the heading/issue
title to "gnh-data-binder.js" to match the rest of the checklist and
implementation plan, and ensure any other occurrences of "bb-data-binder.js" in
that section are renamed and consistent.

In `@web/README.md`:
- Around line 57-67: The HTML embed example uses a mismatched custom element
tag: it opens with <bb-data-loader> but closes with </gnh-data-loader>, which
makes the markup invalid; update the closing tag to match the opening tag
(<bb-data-loader>) so the custom element can upgrade correctly (look for the
example block showing the bb-data-loader element and fix the closing tag).

In `@web/static/app/pages/settings.js`:
- Around line 259-261: The custom event name "bb:org-switched" must be renamed
to the new brand "gnh:org-switched" everywhere it's dispatched or listened for;
update all listeners (e.g., the document listener in settings.js that calls
refreshSections()) and all dispatch sites (search for dispatchEvent or
CustomEvent uses named "bb:org-switched" in gnh-settings.js, gnh-global-nav.js,
gnh-data-binder.js, core.js, app/lib/global-nav.js,
app/lib/settings/organisations.js, app/pages/settings.js,
app/pages/dashboard.js) to use "gnh:org-switched" so names match across the
codebase and preserve existing payloads and handler logic.

In `@web/static/js/core.js`:
- Around line 79-92: The ensureConfig() function is checking the wrong global;
replace all uses of BGNH_CONFIG with the rebranded GNH_CONFIG so the function
awaits the correct namespace. In function ensureConfig (and any nearby
references such as around coreReady), update the conditional checks and the
post-load existence check to use window.GNH_CONFIG instead of window.BGNH_CONFIG
so loading /config.js correctly unblocks initialization.

In `@web/static/js/gnh-auth-extension.js`:
- Around line 284-310: In setupJobDomainSearch(), update all references from
window.BBDomainSearch to window.GNHDomainSearch (including the
setupDomainSearchInput call) to match the rebrand; ensure the same rename is
applied anywhere else this file references BBDomainSearch and confirm the module
defined in gnh-domain-search.js exports/attaches window.GNHDomainSearch so
setupJobDomainSearch() can call GNHDomainSearch.setupDomainSearchInput with the
same options (input, container, clearOnSelect, onSelectDomain, onCreateDomain,
onError).

In `@web/static/js/gnh-invite-flow.js`:
- Around line 183-188: The global export is still named window.BBInviteFlow but
should be renamed to window.GNHInviteFlow to match the rebrand; update the
export in gnh-invite-flow.js to window.GNHInviteFlow (exporting getInviteToken,
clearInviteTokenFromURL, fetchInvitePreview, handleInviteTokenFlow) and rename
all usages/calls of BBInviteFlow to GNHInviteFlow in the dependent files
mentioned (gnh-settings.js occurrences around the referenced lines and
gnh-invite-welcome.js at line 50) so callers reference the new symbol
consistently.

In `@webflow-designer-extension-cli/README.md`:
- Line 1: Update the README title string that currently reads "# Blue Banded Bee
Webflow Designer Extension (Smoke Test)" to reflect the rebrand; replace the old
branding with the new name (e.g., "Good Native Hover" or "GNH") so the header
becomes something like "# Good Native Hover (GNH) Webflow Designer Extension
(Smoke Test)" to ensure consistency across documentation.
🪄 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: ASSERTIVE

Plan: Pro

Run ID: 383dbcd4-14aa-4651-8e0b-0d0473419ca6

📥 Commits

Reviewing files that changed from the base of the PR and between 369c893 and 495a3ac.

📒 Files selected for processing (61)
  • CHANGELOG.md
  • Roadmap.md
  • auth-callback.html
  • auth-modal.html
  • cli-login.html
  • dashboard.html
  • docs/architecture/ARCHITECTURE.md
  • docs/development/ATTRIBUTE_SYSTEM.md
  • docs/plans/ui-implementation.md
  • docs/security/SECURITY_REMEDIATION_PLAN.md
  • extension-auth.html
  • homepage.html
  • internal/api/handlers.go
  • invite-welcome.html
  • settings.html
  • web/README.md
  • web/package.json
  • web/partials/global-nav.html
  • web/static/app/lib/auth-session.js
  • web/static/app/lib/config.js
  • web/static/app/lib/domain-search.js
  • web/static/app/lib/global-nav.js
  • web/static/app/lib/integration-http.js
  • web/static/app/lib/invite-flow.js
  • web/static/app/lib/settings/account.js
  • web/static/app/lib/settings/integrations/google.js
  • web/static/app/lib/settings/integrations/slack.js
  • web/static/app/lib/settings/integrations/webflow.js
  • web/static/app/lib/settings/schedules.js
  • web/static/app/lib/settings/team.js
  • web/static/app/pages/dashboard.js
  • web/static/app/pages/job-details.js
  • web/static/app/pages/settings.js
  • web/static/app/pages/webflow-jobs.js
  • web/static/app/pages/webflow-login.js
  • web/static/app/test-module.html
  • web/static/js/auth.js
  • web/static/js/core.js
  • web/static/js/gnh-admin.js
  • web/static/js/gnh-auth-extension.js
  • web/static/js/gnh-bootstrap.js
  • web/static/js/gnh-dashboard-actions.js
  • web/static/js/gnh-data-binder.js
  • web/static/js/gnh-domain-search.js
  • web/static/js/gnh-global-nav.js
  • web/static/js/gnh-google.js
  • web/static/js/gnh-integration-http.js
  • web/static/js/gnh-invite-flow.js
  • web/static/js/gnh-invite-welcome.js
  • web/static/js/gnh-metadata.js
  • web/static/js/gnh-settings.js
  • web/static/js/gnh-slack.js
  • web/static/js/gnh-webflow.js
  • web/static/js/gnh-welcome.js
  • web/static/js/job-page.js
  • web/static/styles/app.css
  • web/templates/extension-auth.html
  • web/templates/job-details.html
  • webflow-designer-extension-cli/README.md
  • webflow-designer-extension-cli/src/index.ts
  • welcome.html

Comment thread auth-modal.html Outdated
Comment thread CHANGELOG.md Outdated
Comment on lines +97 to +99
- Global nav notification badge race condition (guarded with `GNH_APP.coreReady`)
- Extension job cards rendering as plain status text (missing bridge export)
- Job details init crash when `bb-bootstrap.js` not loaded
- Job details init crash when `gnh-bootstrap.js` not loaded
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Keep pre-rebrand release notes using the original artefact names.

These sections describe versions released before 0.30.0, which this file itself identifies as the Hover rebrand. Rewriting those older entries to GNH_APP / gnh-* makes the changelog inaccurate for anyone debugging or diffing those shipped tags. Please keep the original names in pre-rebrand sections and only switch terminology from the rebrand release onward.

Also applies to: 183-190, 393-398

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` around lines 97 - 99, The changelog's pre-rebrand entries were
incorrectly rewritten to use post-rebrand names (e.g., GNH_APP,
gnh-bootstrap.js); revert those entries in the sections before the
0.30.0/rebrand release so they use the original artifact names that were shipped
(restore original names for items such as "Global nav notification badge",
"bridge export", and "gnh-bootstrap.js" occurrences in the pre-0.30.0 entries),
and ensure the same fix is applied to the other affected ranges mentioned (lines
around 183-190 and 393-398) so only entries from the rebrand release onward use
the new GNH_APP/gnh-* terminology.

Comment thread cli-login.html Outdated
Comment thread dashboard.html
Comment on lines 281 to 285
<button
class="bb-btn bb-btn-secondary"
bbb-action="refresh-dashboard"
class="gnh-btn gnh-btn-secondary"
gnh-action="refresh-dashboard"
aria-label="Refresh dashboard data"
>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot Mar 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add explicit type="button" to the non-submit controls.

These buttons currently default to submit. They are action and close controls, so the implicit type makes them prone to accidental form submission if the surrounding markup is ever nested or refactored.

Also applies to: 321-334, 372-385, 425-439, 459-462, 582-585

🧰 Tools
🪛 HTMLHint (1.9.2)

[warning] 282-282: The type attribute must be present on elements.

(button-type-require)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dashboard.html` around lines 281 - 285, Several <button> elements are missing
an explicit type and therefore default to "submit"; add type="button" to each
non-submit control—specifically update the button with
gnh-action="refresh-dashboard" and the other buttons in the noted ranges (the
buttons using class "gnh-btn gnh-btn-secondary" and other gnh-action attributes
in the 321-334, 372-385, 425-439, 459-462, 582-585 ranges) so they explicitly
declare type="button" to prevent accidental form submission.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged — type="button" is a pre-existing HTMLHint concern, not introduced by this rename. Tracked separately to keep this PR scoped to the rebrand.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@simonsmallchua — Understood, makes sense to keep this PR focused on the rebrand. Would you like me to open a follow-up GitHub issue to track adding type="button" to the non-submit button elements in dashboard.html (and any other affected pages), so it doesn't get lost?

Comment thread docs/architecture/ARCHITECTURE.md Outdated
Comment thread web/static/js/job-page.js
Comment thread web/static/styles/app.css
Comment thread web/templates/extension-auth.html Outdated
<a id="shareLinkAnchor" href="#" target="_blank" rel="noopener noreferrer">—</a>
</div>
<button id="revokeShareLinkBtn" class="bb-btn-secondary bb-btn" aria-label="Revoke share link">Revoke Link</button>
<button id="revokeShareLinkBtn" class="gnh-btn-secondary gnh-btn" aria-label="Revoke share link">Revoke Link</button>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot Mar 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add type="button" to the toolbar and menu controls.

These buttons still rely on the default submit type. That keeps the HTMLHint warnings open and makes the page fragile if any of these sections ever ends up inside a form.

Also applies to: 39-45, 47-64, 133-133, 338-350, 353-353, 369-371

🧰 Tools
🪛 HTMLHint (1.9.2)

[warning] 27-27: The type attribute must be present on elements.

(button-type-require)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/templates/job-details.html` at line 27, Several toolbar/menu buttons
(e.g., the button with id "revokeShareLinkBtn" and buttons with labels like
"Revoke Link", plus other toolbar/menu controls around lines referenced) are
missing an explicit type and default to submit; update each of those button
elements (including the ones in the blocks around lines 39-45, 47-64, 133,
338-350, 353, and 369-371) to include type="button" so they don’t act as form
submitters — locate elements by their id attributes (e.g., revokeShareLinkBtn)
or visible text and add type="button" to each button element.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged — type="button" is a pre-existing HTMLHint concern, not introduced by this rename. Tracked separately to keep this PR scoped to the rebrand.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@simonsmallchua, understood — that's a reasonable call to keep this PR focused on the rebrand. Would you like me to open a follow-up GitHub issue to track adding type="button" to those buttons in web/templates/job-details.html?

Comment thread webflow-designer-extension-cli/src/index.ts Outdated
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
web/static/js/gnh-auth-extension.js (2)

16-21: 🧹 Nitpick | 🔵 Trivial

JSDoc parameter type references old naming.

The @param {Object} dataBinder comment describes it as a "BBDataBinder instance" but should reference the rebranded name for consistency.

Proposed fix
 /**
  * Initialise authentication with data binder integration
- * `@param` {Object} dataBinder - BBDataBinder instance
+ * `@param` {Object} dataBinder - GNHDataBinder instance
  * `@param` {Object} options - Configuration options
  * `@returns` {Promise<void>}
  */

Similar updates needed at lines 81, 504, and 655.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-auth-extension.js` around lines 16 - 21, Update the JSDoc
annotations that refer to the old "BBDataBinder" name: wherever the param is
documented as "@param {Object} dataBinder - BBDataBinder instance" (and the
similar JSDoc blocks later for the same parameter), change the descriptive
type/name to the rebranded name while keeping the param identifier (dataBinder)
and type (Object) intact; search for the JSDoc blocks that document the
dataBinder parameter (the initial "Initialise authentication with data binder
integration" block and the subsequent docs that reference dataBinder) and
replace the "BBDataBinder" text in the description with the new branding to
ensure consistency.

1-14: 🧹 Nitpick | 🔵 Trivial

Documentation still references old naming conventions.

The module header comment on line 6 still references "BBDataBinder". For consistency with the rebrand, consider updating documentation references.

Proposed fix
 /**
  * Hover Authentication Extension
  * Data binding integration for the unified authentication system
  *
  * This module provides integration between the core auth system (auth.js)
- * and the BBDataBinder for seamless authentication in dashboard applications.
+ * and the GNHDataBinder for seamless authentication in dashboard applications.
  *
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-auth-extension.js` around lines 1 - 14, The module header
comment still references the old name "BBDataBinder"; update that documentation
string in web/static/js/gnh-auth-extension.js to the current data binder name
used in the codebase (replace "BBDataBinder" with the project's rebranded name,
e.g. the new binder identifier) so comments match the rebrand and README; search
for the symbol "BBDataBinder" in the file and update the header comment and any
other occurrences to the new name.
web/README.md (1)

60-67: ⚠️ Potential issue | 🔴 Critical

Fix mismatched custom element tags in the Quick Start snippet.

The example opens <bb-data-loader> but closes </gnh-data-loader>, so the markup is invalid and copy/paste integration will fail.

Suggested fix
-<bb-data-loader
+<gnh-data-loader
   endpoint="/v1/jobs"
   template=".job-card.template"
   target=".jobs-grid"
   auto-load="true"
   require-auth="true"
 >
 </gnh-data-loader>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/README.md` around lines 60 - 67, The Quick Start snippet has mismatched
custom element tags: it opens with <bb-data-loader> but closes with
</gnh-data-loader>; update the closing tag to match the opening tag (use
</bb-data-loader>) so the custom element name bb-data-loader is consistent, or
alternatively change the opening tag to <gnh-data-loader> if that is the
intended component name; ensure the tag name used in both the opening and
closing tags (bb-data-loader or gnh-data-loader) matches exactly.
♻️ Duplicate comments (1)
auth-modal.html (1)

6-8: ⚠️ Potential issue | 🟡 Minor

Add explicit type="button" to the close control.

Line 6 still omits type, so it can default to submit in a form context.

Suggested fix
-      <button class="gnh-modal-close" onclick="closeAuthModal()">
+      <button type="button" class="gnh-modal-close" onclick="closeAuthModal()">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@auth-modal.html` around lines 6 - 8, The close button element using class
"gnh-modal-close" and the onclick handler closeAuthModal() is missing an
explicit type, which can make it act as a form submit; update the button element
to include type="button" so clicking it only invokes closeAuthModal() and does
not submit any surrounding form.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/development/ATTRIBUTE_SYSTEM.md`:
- Around line 190-199: Replace the incorrect "Old Attribute" values that
currently show data-gnh-* with the legacy forms (data-bb-* and bbb-*) so the
migration table maps actual legacy attributes to the new gnh-* names;
specifically update the rows referencing data-gnh-bind, data-gnh-bind-attr,
data-gnh-bind-style, data-gnh-template, data-gnh-show-if, data-gnh-auth,
data-gnh-info (and the gnh-action row if it lists a data-gnh variant) to show
their legacy equivalents (e.g., data-bb-bind / bbb-bind → gnh-text,
data-bb-bind-attr / bbb-bind-attr → gnh-class, gnh-href, gnh-attr:name,
data-bb-bind-style / bbb-bind-style → gnh-style:prop, data-bb-template /
bbb-template → gnh-template, data-bb-show-if / bbb-show-if → gnh-show,
data-bb-auth / bbb-auth → gnh-auth, data-bb-info / bbb-info → gnh-help) so the
table accurately reflects migrating from legacy data-bb*/bbb* attributes to
gnh-*.

In `@web/static/app/lib/global-nav.js`:
- Around line 153-157: The code is directly probing window.GNH_APP.coreReady and
may miss readiness on cold loads; instead call and await the app's readiness
helper: replace checks that read window.GNH_APP?.coreReady with awaiting
window.GNH_APP.whenReady() (e.g. in the IIFE where updateDisplay, initialiseOrg,
notification/quota start-up run), then call window.GNH_APP.initialiseOrg() after
whenReady resolves before invoking updateDisplay; apply the same change to the
other similar blocks that reference coreReady/initialiseOrg so core/auth are
guaranteed ready before proceeding.

---

Outside diff comments:
In `@web/README.md`:
- Around line 60-67: The Quick Start snippet has mismatched custom element tags:
it opens with <bb-data-loader> but closes with </gnh-data-loader>; update the
closing tag to match the opening tag (use </bb-data-loader>) so the custom
element name bb-data-loader is consistent, or alternatively change the opening
tag to <gnh-data-loader> if that is the intended component name; ensure the tag
name used in both the opening and closing tags (bb-data-loader or
gnh-data-loader) matches exactly.

In `@web/static/js/gnh-auth-extension.js`:
- Around line 16-21: Update the JSDoc annotations that refer to the old
"BBDataBinder" name: wherever the param is documented as "@param {Object}
dataBinder - BBDataBinder instance" (and the similar JSDoc blocks later for the
same parameter), change the descriptive type/name to the rebranded name while
keeping the param identifier (dataBinder) and type (Object) intact; search for
the JSDoc blocks that document the dataBinder parameter (the initial "Initialise
authentication with data binder integration" block and the subsequent docs that
reference dataBinder) and replace the "BBDataBinder" text in the description
with the new branding to ensure consistency.
- Around line 1-14: The module header comment still references the old name
"BBDataBinder"; update that documentation string in
web/static/js/gnh-auth-extension.js to the current data binder name used in the
codebase (replace "BBDataBinder" with the project's rebranded name, e.g. the new
binder identifier) so comments match the rebrand and README; search for the
symbol "BBDataBinder" in the file and update the header comment and any other
occurrences to the new name.

---

Duplicate comments:
In `@auth-modal.html`:
- Around line 6-8: The close button element using class "gnh-modal-close" and
the onclick handler closeAuthModal() is missing an explicit type, which can make
it act as a form submit; update the button element to include type="button" so
clicking it only invokes closeAuthModal() and does not submit any surrounding
form.
🪄 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: ASSERTIVE

Plan: Pro

Run ID: 4013cfe4-d01d-4922-942e-4a8718026dda

📥 Commits

Reviewing files that changed from the base of the PR and between 495a3ac and ac405d6.

📒 Files selected for processing (12)
  • CHANGELOG.md
  • Roadmap.md
  • auth-modal.html
  • cli-login.html
  • dashboard.html
  • docs/architecture/ARCHITECTURE.md
  • docs/development/ATTRIBUTE_SYSTEM.md
  • web/README.md
  • web/partials/global-nav.html
  • web/static/app/lib/global-nav.js
  • web/static/app/test-module.html
  • web/static/js/gnh-auth-extension.js

Comment thread docs/development/ATTRIBUTE_SYSTEM.md Outdated
Comment thread web/static/app/lib/global-nav.js Outdated
simonsmallchua and others added 4 commits March 27, 2026 21:25
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
settings.html (3)

95-101: ⚠️ Potential issue | 🟡 Minor

Add type="button" to prevent unintended form submission.

The "Create Organisation" button is missing an explicit type attribute. While currently not inside a form, adding type="button" is defensive coding and ensures consistent behaviour if the DOM structure changes.

Proposed fix
                  <button
                    class="gnh-org-create-btn"
                    id="settingsCreateOrgBtn"
                    aria-label="Create a new organisation"
+                   type="button"
                  >
                    Create Organisation
                  </button>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@settings.html` around lines 95 - 101, The Create Organisation button lacks an
explicit type which can cause it to act as a submit button if later placed
inside a form; update the <button> element with id "settingsCreateOrgBtn" (class
"gnh-org-create-btn") to include type="button" to ensure it never triggers form
submission.

188-193: ⚠️ Potential issue | 🟡 Minor

Multiple buttons are missing explicit type="button" attributes.

HTMLHint flagged 17 buttons without type attributes. Buttons default to type="submit", which can cause unintended form submissions or page reloads. The following buttons should have type="button" added:

  • Line 96: Create Organisation button
  • Line 189: Reset password button
  • Line 378: Manage billing button
  • Line 433: Slack disconnect button
  • Line 446: Slack connect button
  • Line 486: Google Analytics connect button
  • Line 513: Google Analytics disconnect button
  • Line 616: Webflow disconnect button
  • Line 733: Webflow connect button
  • Line 854: Member remove button (template)
  • Line 869: Copy invite link button (template)
  • Line 874: Revoke invite button (template)
  • Line 886: Plan switch button (template)
  • Line 906: Modal close button

Note: Line 252 (Send invite) is correctly implicit as it's a form submit button.

Example fix for one button (apply pattern to others)
              <button
-                 class="gnh-button gnh-button-outline"
+                 class="gnh-button gnh-button-outline"
+                 type="button"
                  id="settingsResetPassword"
                >
                  Send reset email
                </button>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@settings.html` around lines 188 - 193, Several buttons (e.g., the Reset
password button with id="settingsResetPassword" and other interactive buttons
using class "gnh-button" or inside member/invite/plan/modal templates) are
missing explicit type attributes and therefore default to type="submit"; update
each of those button elements to include type="button" (for example add
type="button" to the <button id="settingsResetPassword" ...>), and apply the
same change to all other non-submit buttons referenced in the review (Create
Organisation, Manage billing, Slack connect/disconnect, Google Analytics
connect/disconnect, Webflow connect/disconnect, member remove, copy invite link,
revoke invite, plan switch, modal close), ensuring buttons that are meant to
submit forms (like the Send invite) remain without type or explicitly use
type="submit".

779-827: ⚠️ Potential issue | 🟡 Minor

Add missing CSS definitions for schedule status classes.

The HTML rebranding to gnh-* classes is correct, but CSS definitions are missing for gnh-schedule-info, gnh-schedule-status, gnh-schedule-enabled, and gnh-schedule-disabled. These classes are used in the HTML template and dynamically applied in schedules.js (line 82). Define these classes in the stylesheet to ensure proper styling of the schedule status indicator.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@settings.html` around lines 779 - 827, The template uses schedule-related
classes (gnh-schedule-info, gnh-schedule-status, gnh-schedule-enabled,
gnh-schedule-disabled) referenced from schedules.js (around line 82) but no CSS
exists; add rules to your stylesheet that style .gnh-schedule-info
(layout/spacing alongside .gnh-job-header), .gnh-schedule-status (font-size,
padding, border-radius, inline-block), and distinct color/state styles for
.gnh-schedule-enabled (e.g., green background/text) and .gnh-schedule-disabled
(e.g., gray/red background/text) so the status indicator displays correctly
within the gnh-job-card template.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@settings.html`:
- Around line 95-101: The Create Organisation button lacks an explicit type
which can cause it to act as a submit button if later placed inside a form;
update the <button> element with id "settingsCreateOrgBtn" (class
"gnh-org-create-btn") to include type="button" to ensure it never triggers form
submission.
- Around line 188-193: Several buttons (e.g., the Reset password button with
id="settingsResetPassword" and other interactive buttons using class
"gnh-button" or inside member/invite/plan/modal templates) are missing explicit
type attributes and therefore default to type="submit"; update each of those
button elements to include type="button" (for example add type="button" to the
<button id="settingsResetPassword" ...>), and apply the same change to all other
non-submit buttons referenced in the review (Create Organisation, Manage
billing, Slack connect/disconnect, Google Analytics connect/disconnect, Webflow
connect/disconnect, member remove, copy invite link, revoke invite, plan switch,
modal close), ensuring buttons that are meant to submit forms (like the Send
invite) remain without type or explicitly use type="submit".
- Around line 779-827: The template uses schedule-related classes
(gnh-schedule-info, gnh-schedule-status, gnh-schedule-enabled,
gnh-schedule-disabled) referenced from schedules.js (around line 82) but no CSS
exists; add rules to your stylesheet that style .gnh-schedule-info
(layout/spacing alongside .gnh-job-header), .gnh-schedule-status (font-size,
padding, border-radius, inline-block), and distinct color/state styles for
.gnh-schedule-enabled (e.g., green background/text) and .gnh-schedule-disabled
(e.g., gray/red background/text) so the status indicator displays correctly
within the gnh-job-card template.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: d03adb7b-8784-41e6-b7de-6e8996896851

📥 Commits

Reviewing files that changed from the base of the PR and between ac405d6 and f0b5132.

📒 Files selected for processing (1)
  • settings.html

simonsmallchua and others added 3 commits March 27, 2026 21:29
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
webflow-designer-extension-cli/README.md (1)

41-41: ⚠️ Potential issue | 🟡 Minor

Inconsistent branding: "BBB auth popup" should be updated.

Line 41 still references "BBB auth popup" which is inconsistent with the rebrand to Hover/GNH namespace.

📝 Suggested fix
-2. Click `Sign in / Create account` to open BBB auth popup and obtain token.
+2. Click `Sign in / Create account` to open Hover auth popup and obtain token.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webflow-designer-extension-cli/README.md` at line 41, Update the README line
that currently reads "Click `Sign in / Create account` to open BBB auth popup
and obtain token." to use the new branding: replace "BBB auth popup" with the
Hover/GNH auth popup (or "Hover auth popup" / "GNH auth popup" depending on
preferred namespace) so the sentence becomes consistent with the rebrand; search
for the exact phrase "BBB auth popup" in the README and change it wherever it
appears.
docs/architecture/webflow-designer-extension.md (1)

18-19: ⚠️ Potential issue | 🟡 Minor

Inconsistent branding: "BBB" references remain.

Line 18 still references "BBB-hosted" and "BBB app domain" while the rest of the PR renames these to the Hover/GNH namespace. This should be updated for consistency.

📝 Suggested fix
-- Extension initiates auth via popup to BBB-hosted `/extension-auth.html`.
+- Extension initiates auth via popup to Hover-hosted `/extension-auth.html`.
 - Popup reuses existing shared auth system in `web/static/js/auth.js`.

And update line 53 if it similarly references "BBB app domain".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/architecture/webflow-designer-extension.md` around lines 18 - 19, Update
the remaining "BBB" branding mentions in the documentation to the new Hover/GNH
naming: replace phrases like "BBB-hosted" and "BBB app domain" with the
Hover/GNH equivalent (e.g., "Hover/GNH-hosted" or "Hover app domain") wherever
the doc references `/extension-auth.html` and related auth flows, and scan the
same document for any other "BBB" occurrences (including the spot noted around
line 53) to make the terminology consistent.
web/README.md (1)

109-145: ⚠️ Potential issue | 🟡 Minor

Documentation still references BBDataBinder instead of GNHDataBinder.

Lines 111 and 142 still use the old class name:

  • Line 111: "The BBDataBinder library provides..."
  • Line 142: const binder = new BBDataBinder({ debug: true });

These should be updated to GNHDataBinder to match the renamed class.

📝 Suggested fix
-The `BBDataBinder` library provides a template + data binding system that allows
+The `GNHDataBinder` library provides a template + data binding system that allows
 you to create flexible HTML layouts while JavaScript automatically handles data
 fetching, authentication, and real-time updates.
 <!-- Initialize -->
 <script>
-  const binder = new BBDataBinder({ debug: true });
+  const binder = new GNHDataBinder({ debug: true });
   await binder.init();
 </script>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/README.md` around lines 109 - 145, Update the README references from the
old class name to the renamed class: replace occurrences of BBDataBinder with
GNHDataBinder (specifically the descriptive line mentioning the library and the
example instantiation `const binder = new BBDataBinder({ debug: true });`),
ensuring the example uses `const binder = new GNHDataBinder({ debug: true });`
and any explanatory text mentions GNHDataBinder so names match the renamed
class.
web/static/js/gnh-data-binder.js (1)

991-1007: 🧹 Nitpick | 🔵 Trivial

Consider renaming internal variable bbbAttr to gnhAttr for consistency.

The variable name bbbAttr still references the old prefix. While this doesn't affect runtime behaviour, renaming it to gnhAttr would improve code consistency with the broader rebrand.

♻️ Suggested rename
     bindingAttrs.forEach((attrName) => {
-      const bbbAttr = `gnh-${attrName}`;
-      instance.querySelectorAll(`[${bbbAttr}]`).forEach((el) => {
-        if (el.hasAttribute(bbbAttr)) {
-          const template = el.getAttribute(bbbAttr);
+      const gnhAttr = `gnh-${attrName}`;
+      instance.querySelectorAll(`[${gnhAttr}]`).forEach((el) => {
+        if (el.hasAttribute(gnhAttr)) {
+          const template = el.getAttribute(gnhAttr);
           const value = this.processTemplate(template, data);
           if (value !== null) {
             // Set the actual HTML attribute

Apply the same change at line 1007 for storageAttrs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-data-binder.js` around lines 991 - 1007, Rename the
internal variable bbbAttr to gnhAttr for consistency in the attribute-binding
logic: in the block that builds and queries attributes (the loop using attrName
and instance.querySelectorAll) and in the storageAttrs loop, replace occurrences
of bbbAttr with gnhAttr and update all uses (querySelectorAll(`[${gnhAttr}]`),
el.hasAttribute(gnhAttr), el.getAttribute(gnhAttr)) so the variable name matches
the gnh-* prefix while preserving existing behavior in the methods
processTemplate and setAttribute.
web/static/js/core.js (1)

354-360: ⚠️ Potential issue | 🟡 Minor

Inconsistent event naming: bb:org-ready should be renamed to gnh:org-ready across the codebase.

The bb:org-switched event was renamed to gnh:org-switched (line 417), but bb:org-ready on line 357 still uses the old prefix. This creates naming inconsistency. Additionally, listeners for bb:org-ready exist in multiple files that would also need updating:

  • web/static/js/gnh-global-nav.js (lines 220, 322, 575)
  • web/static/app/lib/global-nav.js (lines 130, 219, 443)

Rename the event and update all listeners to use the gnh: prefix for consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/core.js` around lines 354 - 360, Rename the custom event
"bb:org-ready" to "gnh:org-ready" wherever it is dispatched and listened for:
update the CustomEvent in core.js (where CustomEvent("bb:org-ready", ... ) is
created) and change all corresponding event listeners that reference
"bb:org-ready" in gnh-global-nav.js and global-nav.js to "gnh:org-ready" so the
prefix matches the already-renamed "gnh:org-switched" event and maintains
consistency across the codebase.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@web/package.json`:
- Line 5: The package's "main" points to static/js/core.js which is an IIFE that
only sets window globals (no module.exports / ES exports), so consumers
requiring/importing the package will get undefined; either document that this
package is browser-only in the README (mentioning the use via <script> tags and
the dev dependency "serve") or add a module entry: wrap core.js in a
CommonJS/ESM-compatible wrapper or create a new entry file that requires/imports
the IIFE and then re-exports the intended globals (e.g., export or
module.exports for the symbols currently attached to window) so consumers can
import/require the package reliably.

In `@web/static/js/core.js`:
- Around line 25-29: The code is mixing legacy data-bb-* and new data-gnh-*
script state attributes (see existing.dataset.bbReady,
existing.dataset.bbLoader, existing.getAttribute("data-gnh-ready")), so update
the loader to consistently use data-gnh-*: replace writes that set data-bb-ready
/ data-bb-loader with data-gnh-ready / data-gnh-loader (methods that set
attributes or dataset keys), and update reads to prefer
existing.dataset.gnhReady / existing.dataset.gnhLoader while retaining a
fallback to the legacy existing.dataset.bbReady / existing.dataset.bbLoader for
compatibility; ensure the same change is applied wherever these keys are checked
(including the checks around readyState).

In `@webflow-designer-extension-cli/README.md`:
- Line 53: Update the README line that currently reads "Extension opens `GET
/extension-auth.html` on BBB app domain." to use the new brand name instead of
"BBB app domain"; locate the exact string "`GET /extension-auth.html`" and the
phrase "BBB app domain" and replace "BBB app domain" with the rebranded name
(ensure punctuation and casing match surrounding text).

In `@webflow-designer-extension-cli/src/index.ts`:
- Around line 31-35: getStoredBaseUrl() and getStoredToken() currently only read
the new constants (API_BASE_STORAGE_KEY, API_TOKEN_STORAGE_KEY) which causes
upgrades to ignore legacy values; update both functions to first attempt to read
the legacy storage keys (the previous names used before gnh_), if a legacy value
exists copy it into the new key (persisting it under API_BASE_STORAGE_KEY /
API_TOKEN_STORAGE_KEY) and then return that value; if neither new nor legacy
exists, fall back to DEFAULT_GNH_APP_ORIGIN (for base URL) or null/empty for
token. Apply the same migration/read-and-rewrite pattern to the other identical
read path referenced around the file (the code block that duplicates
getStoredBaseUrl/getStoredToken behavior).

---

Outside diff comments:
In `@docs/architecture/webflow-designer-extension.md`:
- Around line 18-19: Update the remaining "BBB" branding mentions in the
documentation to the new Hover/GNH naming: replace phrases like "BBB-hosted" and
"BBB app domain" with the Hover/GNH equivalent (e.g., "Hover/GNH-hosted" or
"Hover app domain") wherever the doc references `/extension-auth.html` and
related auth flows, and scan the same document for any other "BBB" occurrences
(including the spot noted around line 53) to make the terminology consistent.

In `@web/README.md`:
- Around line 109-145: Update the README references from the old class name to
the renamed class: replace occurrences of BBDataBinder with GNHDataBinder
(specifically the descriptive line mentioning the library and the example
instantiation `const binder = new BBDataBinder({ debug: true });`), ensuring the
example uses `const binder = new GNHDataBinder({ debug: true });` and any
explanatory text mentions GNHDataBinder so names match the renamed class.

In `@web/static/js/core.js`:
- Around line 354-360: Rename the custom event "bb:org-ready" to "gnh:org-ready"
wherever it is dispatched and listened for: update the CustomEvent in core.js
(where CustomEvent("bb:org-ready", ... ) is created) and change all
corresponding event listeners that reference "bb:org-ready" in gnh-global-nav.js
and global-nav.js to "gnh:org-ready" so the prefix matches the already-renamed
"gnh:org-switched" event and maintains consistency across the codebase.

In `@web/static/js/gnh-data-binder.js`:
- Around line 991-1007: Rename the internal variable bbbAttr to gnhAttr for
consistency in the attribute-binding logic: in the block that builds and queries
attributes (the loop using attrName and instance.querySelectorAll) and in the
storageAttrs loop, replace occurrences of bbbAttr with gnhAttr and update all
uses (querySelectorAll(`[${gnhAttr}]`), el.hasAttribute(gnhAttr),
el.getAttribute(gnhAttr)) so the variable name matches the gnh-* prefix while
preserving existing behavior in the methods processTemplate and setAttribute.

In `@webflow-designer-extension-cli/README.md`:
- Line 41: Update the README line that currently reads "Click `Sign in / Create
account` to open BBB auth popup and obtain token." to use the new branding:
replace "BBB auth popup" with the Hover/GNH auth popup (or "Hover auth popup" /
"GNH auth popup" depending on preferred namespace) so the sentence becomes
consistent with the rebrand; search for the exact phrase "BBB auth popup" in the
README and change it wherever it appears.
🪄 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: ASSERTIVE

Plan: Pro

Run ID: 91111601-440a-42e4-bcee-e6b6f2cc7edb

📥 Commits

Reviewing files that changed from the base of the PR and between f0b5132 and 1fb0a2e.

📒 Files selected for processing (29)
  • docs/architecture/webflow-designer-extension.md
  • docs/development/ATTRIBUTE_SYSTEM.md
  • docs/security/SECURITY_REMEDIATION_PLAN.md
  • extension-auth.html
  • web/README.md
  • web/package.json
  • web/static/app/lib/config.js
  • web/static/app/lib/global-nav.js
  • web/static/app/lib/settings/account.js
  • web/static/app/lib/settings/organisations.js
  • web/static/app/pages/dashboard.js
  • web/static/app/pages/job-details.js
  • web/static/app/pages/settings.js
  • web/static/app/pages/webflow-login.js
  • web/static/app/test-module.html
  • web/static/js/auth.js
  • web/static/js/core.js
  • web/static/js/gnh-auth-extension.js
  • web/static/js/gnh-dashboard-actions.js
  • web/static/js/gnh-data-binder.js
  • web/static/js/gnh-domain-search.js
  • web/static/js/gnh-global-nav.js
  • web/static/js/gnh-invite-flow.js
  • web/static/js/gnh-invite-welcome.js
  • web/static/js/gnh-settings.js
  • web/static/js/job-page.js
  • web/templates/extension-auth.html
  • webflow-designer-extension-cli/README.md
  • webflow-designer-extension-cli/src/index.ts

Comment thread web/package.json
"version": "1.0.0",
"description": "Web Components for Hover dashboard integration",
"main": "static/js/bb-components.js",
"main": "static/js/core.js",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if this package is imported/required anywhere in the codebase
echo "Searching for require or import of `@goodnative/web-components`:"
rg -n "@goodnative/web-components" --type=js --type=ts

echo ""
echo "Checking if core.js has any module exports:"
rg -n "module\.exports|export " web/static/js/core.js || echo "No module exports found in core.js"

Repository: Harvey-AU/hover

Length of output: 201


Consider documenting browser-only usage or adding a module wrapper.

The main field points to static/js/core.js, which has no module.exports or ES module exports—only an IIFE that sets window globals. This is acceptable if the package is exclusively used via <script> tags (which aligns with the serve dev dependency). However, if external npm consumers are expected to require or import this package, they will receive undefined.

If browser-only usage is the intended design, add a note to the README. If module consumption may happen in future, add a simple CommonJS wrapper to core.js or create an entry point with proper exports.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/package.json` at line 5, The package's "main" points to static/js/core.js
which is an IIFE that only sets window globals (no module.exports / ES exports),
so consumers requiring/importing the package will get undefined; either document
that this package is browser-only in the README (mentioning the use via <script>
tags and the dev dependency "serve") or add a module entry: wrap core.js in a
CommonJS/ESM-compatible wrapper or create a new entry file that requires/imports
the IIFE and then re-exports the intended globals (e.g., export or
module.exports for the symbols currently attached to window) so consumers can
import/require the package reliably.

Comment thread web/static/js/core.js
Comment thread webflow-designer-extension-cli/README.md Outdated
Comment thread webflow-designer-extension-cli/src/index.ts
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
web/static/js/gnh-data-binder.js (2)

994-1024: 🧹 Nitpick | 🔵 Trivial

Consider renaming bbbAttr variable to match the new prefix.

The variable bbbAttr (lines 997 and 1013) now holds gnh-* attribute names, making the name misleading. A rename to gnhAttr or simply bindAttr would improve clarity.

Suggested rename
     const bindingAttrs = ["href", "src", "alt", "title", "placeholder"];
     bindingAttrs.forEach((attrName) => {
-      const bbbAttr = `gnh-${attrName}`;
-      instance.querySelectorAll(`[${bbbAttr}]`).forEach((el) => {
-        if (el.hasAttribute(bbbAttr)) {
-          const template = el.getAttribute(bbbAttr);
+      const gnhAttr = `gnh-${attrName}`;
+      instance.querySelectorAll(`[${gnhAttr}]`).forEach((el) => {
+        if (el.hasAttribute(gnhAttr)) {
+          const template = el.getAttribute(gnhAttr);
           const value = this.processTemplate(template, data);
           if (value !== null) {
             // Set the actual HTML attribute
             el.setAttribute(attrName, value);
           }
         }
       });
     });

-    // Handle data storage attributes (gnh-id, gnh-value) - these stay as gnh-* with interpolated values
+    // Handle data storage attributes (gnh-id, gnh-value) — these stay as gnh-* with interpolated values
     const storageAttrs = ["id", "value"];
     storageAttrs.forEach((attrName) => {
-      const bbbAttr = `gnh-${attrName}`;
-      instance.querySelectorAll(`[${bbbAttr}]`).forEach((el) => {
-        if (el.hasAttribute(bbbAttr)) {
-          const template = el.getAttribute(bbbAttr);
+      const gnhAttr = `gnh-${attrName}`;
+      instance.querySelectorAll(`[${gnhAttr}]`).forEach((el) => {
+        if (el.hasAttribute(gnhAttr)) {
+          const template = el.getAttribute(gnhAttr);
           const value = this.processTemplate(template, data);
           if (value !== null) {
-            // Keep as gnh-* attribute with interpolated value for handlers to read
-            el.setAttribute(bbbAttr, value);
+            // Keep as gnh-* attribute with interpolated value for handlers to read
+            el.setAttribute(gnhAttr, value);
           }
         }
       });
     });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-data-binder.js` around lines 994 - 1024, Rename the
misleading local variable bbbAttr to a clearer name (e.g., gnhAttr or bindAttr)
in the data-binding loops that handle bindingAttrs and storageAttrs so it
matches the new gnh-* prefix; update every occurrence inside the blocks where
bindingAttrs.forEach and storageAttrs.forEach use instance.querySelectorAll,
el.hasAttribute, el.getAttribute, and el.setAttribute as well as any references
in the surrounding code (the variable is used alongside processTemplate and the
DOM operations) to avoid breaking behavior.

695-710: ⚠️ Potential issue | 🟠 Major

Rename BB_ACTIVE_ORG and BB_ORGANISATIONS to GNH_ACTIVE_ORG and GNH_ORGANISATIONS for rebrand consistency.

These globals are internal to the codebase and used across multiple files (core.js, gnh-settings.js, gnh-data-binder.js, and organisations.js), but retain the old BB_ prefix whilst the rest of the rebrand migrates to GNH_. Renaming these globals is necessary to maintain consistency with the other rebranded identifiers (GNH_APP, GNH_CONFIG, GNHAuth).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/static/js/gnh-data-binder.js` around lines 695 - 710, Rename the two
globals BB_ACTIVE_ORG and BB_ORGANISATIONS to GNH_ACTIVE_ORG and
GNH_ORGANISATIONS throughout the codebase (update assignments, checks like
Array.isArray(window.BB_ORGANISATIONS), pushes, and any event detail references
such as in gnh-data-binder.js where window.BB_ACTIVE_ORG = newOrg and
window.BB_ORGANISATIONS.push(newOrg)); update all usages in core.js,
gnh-settings.js, gnh-data-binder.js, organisations.js to reference
window.GNH_ACTIVE_ORG and window.GNH_ORGANISATIONS instead, preserving the same
logic and type checks so behavior remains identical.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@web/static/js/gnh-data-binder.js`:
- Around line 994-1024: Rename the misleading local variable bbbAttr to a
clearer name (e.g., gnhAttr or bindAttr) in the data-binding loops that handle
bindingAttrs and storageAttrs so it matches the new gnh-* prefix; update every
occurrence inside the blocks where bindingAttrs.forEach and storageAttrs.forEach
use instance.querySelectorAll, el.hasAttribute, el.getAttribute, and
el.setAttribute as well as any references in the surrounding code (the variable
is used alongside processTemplate and the DOM operations) to avoid breaking
behavior.
- Around line 695-710: Rename the two globals BB_ACTIVE_ORG and BB_ORGANISATIONS
to GNH_ACTIVE_ORG and GNH_ORGANISATIONS throughout the codebase (update
assignments, checks like Array.isArray(window.BB_ORGANISATIONS), pushes, and any
event detail references such as in gnh-data-binder.js where window.BB_ACTIVE_ORG
= newOrg and window.BB_ORGANISATIONS.push(newOrg)); update all usages in
core.js, gnh-settings.js, gnh-data-binder.js, organisations.js to reference
window.GNH_ACTIVE_ORG and window.GNH_ORGANISATIONS instead, preserving the same
logic and type checks so behavior remains identical.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9a04b4b3-b8c5-4d4a-bb82-98eed11e59ee

📥 Commits

Reviewing files that changed from the base of the PR and between 1fb0a2e and 93940e7.

📒 Files selected for processing (3)
  • auth-modal.html
  • docs/architecture/ARCHITECTURE.md
  • web/static/js/gnh-data-binder.js

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@github-actions
Copy link
Copy Markdown
Contributor

🐝 Review App Deployed

Homepage: https://hover-pr-284.fly.dev
Dashboard: https://hover-pr-284.fly.dev/dashboard

@simonsmallchua simonsmallchua merged commit 478b366 into main Mar 28, 2026
11 checks passed
@simonsmallchua simonsmallchua deleted the chore/rebrand-gnh-prefix branch March 28, 2026 03:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant