Skip to content

feat: launch-week feedback banner above the top bar - #168

Merged
obvious-autobuild-staging[bot] merged 3 commits into
masterfrom
feat/feedback-banner
Sep 1, 2026
Merged

feat: launch-week feedback banner above the top bar#168
obvious-autobuild-staging[bot] merged 3 commits into
masterfrom
feat/feedback-banner

Conversation

@obvious-autobuild-staging

@obvious-autobuild-staging obvious-autobuild-staging Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Why

Launch week needs a visible channel for feedback. A thin, non-dismissible banner above the top bar routes users straight to discussion #163 without displacing the converter, and comes down as soon as the team calls it.

What

  • FeedbackBanner (new component): full-width bar at the very top, above the TopBar. Copy: "Enjoy a cleaner, simpler CSVJSON. Leave feedback or ask for features here." — the whole phrase links to Welcome to the new CSVJSON app! #163, target=_blank, rel="noopener noreferrer".
  • Placed as the first child of the converter's h-svh flex column, so the flex panes absorb the banner's height instead of the page overflowing. No changes to the below-768px stacked layout — on mobile it simply sits above the top bar. Options bar never clips because SplitPane uses flex-1 min-h-0.
  • Styled with existing theme tokens (bg-muted, border-border, muted-foreground/foreground), py-1.5 text-sm to stay thinner than the TopBar; visible focus ring on the link (focus-visible:outline-ring). Dark and light themes both covered by tokens. No dismiss button — v1 is non-dismissible by design.
  • Rebuilt app/dist (prerender includes the banner) for the CI dist-freshness gate.
  • Extended .github/scripts/verify-seo.sh to assert the banner copy and discussion link exist in the built index.html.
  • fix(ci): the shim job's zero-tolerance "flatfile" remnant grep now matches the mandated discussion URL (the app's own GitHub org name). The check filters exactly that sanctioned URL out of the match set; verified a real remnant (gtag) is still caught.

How to Review

  • app/src/components/FeedbackBanner.tsx + its test (asserts exact copy, href, target, rel, and DOM order above the TopBar).
  • app/src/App.tsx — two-line mount.
  • .github/workflows/ci.yml — one narrow exemption to the remnant grep, required because the sanctioned URL contains "flatfile".
  • Intentionally excluded: dismiss button (launch-week banner, removed later), analytics (zero-telemetry spec).

Test Evidence

Local: lint, typecheck, 94/94 vitest tests, production build + prerender, verify-seo.sh, and the modified remnant grep (positive and negative) all green; banner copy and link confirmed in built index.html.

🔗 Obvious Project · 🧵 Obvious Thread

Full-width, non-dismissible banner linking 'Leave feedback or ask for
features here' to discussion #163. Rendered inside the h-svh flex column
so panes absorb its height. Included in the prerendered dist; SEO check
extended to assert banner copy + link in built index.html.
@obvious-autobuild-staging
obvious-autobuild-staging Bot marked this pull request as ready for review September 1, 2026 03:14
…ant grep

The launch-week banner links to github.com//discussions/163,
which the zero-tolerance 'flatfile' remnant pattern matches. Filter only
that exact URL out of the match set; every other hit still fails the shim job.

@obvious-autobuild-staging obvious-autobuild-staging Bot left a comment

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.

Obvious Code Review

Verdict: COMMENT (1 High, 1 Medium, 1 Suggestion)

High

  • .github/workflows/ci.yml:89 — Remnant-grep exemption filters whole lines; the main JS bundle is one 107KB line containing the sanctioned URL, so the entire application chunk is exempt from the zero-telemetry gate.

Medium

  • app/src/components/FeedbackBanner.tsx:17truncate clips the feedback link below ~525px viewports; mobile users get a permanently ellipsized CTA in a non-dismissible banner.

Suggestions

  • app/src/components/FeedbackBanner.tsx:8 — the discussion URL is now hardcoded in four places (component, test, verify-seo.sh, ci.yml); consider a single source or cross-referencing comment to ease the post-launch teardown.

View full review in Obvious

Comment thread .github/workflows/ci.yml Outdated
# GitHub discussions (contains "FlatFilers") — the sanctioned
# URL is exempt; everything else stays zero-tolerance.
if grep -riE 'segment|gtag|linkedin|carbonads|chikita|flatfile|typekit|putObject' "${targets[@]}" \
| grep -viF 'github.com/FlatFilers/csvjson-app/discussions/163'; then

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.

High · security — The remnant-grep exemption drops whole lines containing the sanctioned URL, but the main bundle app/dist/assets/index-UreU1wdh.js is minified to a handful of lines and the URL sits on a single 107,119-byte line holding essentially the whole app chunk. grep -viF exempts that entire line, so any future segment/gtag/carbonads/flatfile remnant anywhere in the main chunk passes CI silently — spec criterion 8's zero-tolerance gate is fail-open for the largest shipped artifact (verified by simulation: the exemption is the only reason the job passes on this tree). Strip the URL substring from matched lines and re-grep instead of filtering lines, e.g. grep -riE '…' "${targets[@]}" | sed 's#github[.]com/FlatFilers/csvjson-app/discussions/163##g' | grep . — the sed removes only the URL occurrence; every other pattern word on that 107KB line still fails the build.

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.

Replying to this comment
Fixed in f086136 — the pipeline now strips the sanctioned URL from matched lines and re-greps with the same pattern. One correction to the suggested snippet: ending with grep . would false-positive, because stripping the URL leaves non-empty residue (var u="https://";) on lines whose only hit was the sanctioned URL. The re-grep re-checks the remnant pattern itself, so only lines that still contain a real pattern after stripping fail. Verified: a synthetic minified line containing both the URL and gtag is caught; a sanctioned-URL-only line passes; the real tree (including the fresh bundle) passes.

Comment thread app/src/components/FeedbackBanner.tsx Outdated
data-testid="feedback-banner"
className="flex flex-shrink-0 items-center justify-center border-b border-border bg-muted px-4 py-1.5 text-sm text-muted-foreground"
>
<p className="truncate">

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.

Medium · reliability — The <p> carries truncate (nowrap + ellipsis) over the full 74-char phrase (~525px at text-sm). On a 360–375px phone (~343px available after px-4) the tail of the linked phrase — the banner's sole call to action — is ellipsized ("…Leave feedback or a…"), and the banner is non-dismissible by design, so mobile users see a permanently clipped CTA for launch week. Keep the link intact on small screens, e.g. hide the lead-in below sm (<span className="hidden sm:inline">Enjoy a cleaner, simpler CSVJSON.{" "}</span>) so the link fits, or apply the truncation to the lead-in span rather than the whole paragraph.

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.

Replying to this comment
Fixed in f086136 — dropped truncate and centered the paragraph, so it wraps instead of ellipsizing. I went with wrap rather than hiding the lead-in below sm because the launch-week spec mandates the exact full copy, and hiding the lead-in on phones would violate that; a two-line banner on the narrowest viewports is acceptable since the flex panes absorb the height.

- ci: strip the sanctioned discussions URL from matched lines and
  re-grep with the same pattern instead of dropping whole lines — a
  line-filter exempted the entire 107KB minified bundle line from the
  zero-telemetry gate. Verified: same-line gtag remnant is caught, a
  sanctioned-URL-only line passes.
- FeedbackBanner: drop truncate; the CTA no longer ellipsizes on
  360-375px phones — the paragraph wraps and stays fully readable.
- Cross-reference FEEDBACK_DISCUSSION_URL from verify-seo.sh so the
  post-launch teardown has one place to look.
@obvious-autobuild-staging

Copy link
Copy Markdown
Contributor Author

Replying to this comment

Replying to this comment
Both findings addressed in f086136: the remnant gate now strips the sanctioned URL and re-greps per line (High), and the banner wraps instead of truncating so the CTA is intact on mobile (Medium). The suggestion is covered by cross-reference comments in ci.yml and verify-seo.sh pointing at FEEDBACK_DISCUSSION_URL as the single source for the post-launch teardown.

@obvious-autobuild-staging obvious-autobuild-staging Bot left a comment

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.

Obvious Code Review

Verdict: COMMENT — Pass 2 clean.

No findings — clean pass.

All three Pass 1 findings resolved and verified at head f086136:

  • High (ci.yml remnant-grep exemption) — the pipeline now strips the sanctioned URL substring from matched lines and re-greps. Verified by simulation: current tree passes, an injected gtag on the 107KB bundle line fails the gate, and a remnant sharing a line with the sanctioned URL (the original failure mode) is caught.
  • Medium (banner CTA truncation)truncate replaced with text-center; the phrase wraps on narrow viewports and the rebuilt prerender still carries the banner copy and link.
  • Suggestion — canonical-source comments added to verify-seo.sh and ci.yml.

View full review in Obvious

@obvious-autobuild-staging

Copy link
Copy Markdown
Contributor Author

Replying to this comment

Replying to this comment
Thanks — all three findings addressed and verified. Proceeding to squash-merge per repo policy.

@obvious-autobuild-staging
obvious-autobuild-staging Bot merged commit af7847a into master Sep 1, 2026
3 checks passed
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