Skip to content

feat(ux): stabilize frontend rehydration and fix chat persistence - #51

Merged
TechHypeXP merged 1 commit into
mainfrom
feat/ui-ux-stabilization
Jun 5, 2026
Merged

feat(ux): stabilize frontend rehydration and fix chat persistence#51
TechHypeXP merged 1 commit into
mainfrom
feat/ui-ux-stabilization

Conversation

@TechHypeXP

@TechHypeXP TechHypeXP commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Addresses 'partial rehydration' and 'hollow dashboard' issues:

  • Chat persistence: Implemented complete reset in useChatStore.ts and triggered it on URL change in DashboardContainer.tsx.
  • Hollow Dashboard: Added hardening checks to prevent broken markdown blocks when dimensions are still loading.
  • UI/UX Polish: Global dark scrollbars, Z-index mapping for Chat/Processing Log, and chat auto-scroll.
  • Export Controls: Added dropdown for PDF and Markdown export in TopBar.
  • Cleanup: Stripped redundant LLM metadata tags from output.

Summary by Sourcery

Improve dashboard robustness, chat session handling, and export capabilities for analysis outputs.

New Features:

  • Add export controls in the console top bar to download analyses as full PDF or Markdown files.

Bug Fixes:

  • Ensure chat sessions are fully reset when starting a new analysis or navigating away to prevent stale conversations.
  • Prevent hollow or partially rendered dashboards by guarding persona selection and streaming grid rendering until dimensions are available.

Enhancements:

  • Refactor dashboard state usage to rely on shared stores for analysis status, metadata, and projections.
  • Add a loading placeholder for synthesis dimensions while projections are being prepared.
  • Adjust z-index layering so the chat dock sits cleanly above the processing log and other content.
  • Apply global dark-themed scrollbars for a more consistent UI across the app.
  • Strengthen UCIS prompt handling by removing trailing metadata markers and stripping completion tags from parsed output, and updating instructions to forbid closing tags in LLM responses.

Summary by cubic

Stabilizes frontend rehydration and fixes sticky chat sessions by resetting chat state on new analyses and URL changes. Improves streaming UX with safer rendering, export controls, and small visual polish.

  • Bug Fixes

    • Reset chat store on navigation/start (clears conversations, active thread, messages) to stop cross-session leakage.
    • Guard console rendering to avoid “hollow dashboard” during streaming; show placeholders and gate components until data is ready.
    • Normalize z-index layers and use --z-dock so the Chat dock sits above the Processing Log.
    • Remove stray LLM metadata tags: prompt forbids closing tags; parser strips “End of UCIS…Report”.
  • New Features

    • Export dropdown in TopBar: PDF via /api/analyses/{id}/export?format=pdf&scope=full and Markdown download.
    • Global dark scrollbars for consistent theming.
    • Clear empty states for graph and synthesis while dimensions load.

Written for commit bedb686. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added export functionality allowing you to save your analysis as PDF or Markdown files via a new export dropdown menu.
  • UI Improvements

    • Enhanced layer stacking for overlays and modals with improved z-index management.
    • Updated global scrollbar styling for consistent appearance across all browsers.
    • Improved chat session state management for smoother workflow transitions.

@TechHypeXP
TechHypeXP merged commit 9a1cab7 into main Jun 5, 2026
2 of 3 checks passed
@vercel

vercel Bot commented Jun 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hex-yt-intel Building Building Preview, Comment Jun 5, 2026 12:48am

@TechHypeXP
TechHypeXP deleted the feat/ui-ux-stabilization branch June 5, 2026 00:48
@sourcery-ai

sourcery-ai Bot commented Jun 5, 2026

Copy link
Copy Markdown

Reviewer's Guide

Refactors dashboard state usage around the analysis store/nucleus, hardens dimension rendering to avoid hollow dashboards, wires a new export dropdown into the console top bar, stabilizes chat persistence/reset behavior, and polishes global UI details like scrollbars, z‑index layering, and prompt output cleanup.

Sequence diagram for chat reset on analysis or URL change

sequenceDiagram
  actor User
  participant DashboardContainer
  participant useChatStore

  User->>DashboardContainer: setUrl(newUrl) / startAnalysis
  DashboardContainer->>DashboardContainer: useEffect([nucleus.analysis.id, url])
  alt nucleus.analysis.id exists or url exists
    DashboardContainer->>useChatStore: getState().reset()
    useChatStore->>useChatStore: reset state (conversations=[], activeId=null, messagesByConv={})
  end
Loading

Sequence diagram for export dropdown actions in TopBar

sequenceDiagram
  actor User
  participant TopBar
  participant DashboardContainer
  participant Browser

  User->>TopBar: click Export button
  TopBar->>TopBar: setExportOpen(true)
  User->>TopBar: select Export as PDF
  TopBar-->>DashboardContainer: onExport("pdf")
  DashboardContainer->>DashboardContainer: handleExport("pdf")
  DashboardContainer->>Browser: window.open(/api/analyses/{id}/export?format=pdf&scope=full)

  User->>TopBar: select Export as Markdown
  TopBar-->>DashboardContainer: onExport("markdown")
  DashboardContainer->>DashboardContainer: handleExport("markdown")
  DashboardContainer->>Browser: URL.createObjectURL(blob)
  DashboardContainer->>Browser: a.click() to download .md file
Loading

File-Level Changes

Change Details Files
Stabilized dashboard state wiring and dimension rendering to prevent hollow dashboards and align with the synthesis nucleus/analysis store.
  • Replaced individual destructured analysis store fields with a single store object and updated all references to use store.*.
  • Replaced direct projection/analysis usage from the synthesis nucleus with a single nucleus object and updated all dependent calls.
  • Adjusted relations hook arguments and status checks to use nucleus.analysis and store.status.
  • Updated dimensions memoization to guard on nucleus.projection, derive statuses from store.status, and handle pending dimensions safely.
  • Hardened console rendering logic so PersonaSelector and StreamingGrid only render when dimensions exist, with a fallback placeholder when dimensions are still loading.
  • Normalized multiple status branches (console panels, graph empty states, ProcessingLog) to read from store.status.
  • Updated ChatDock props to use nucleus.analysis and store.videoMetadata instead of previous local variables.
  • Fixed history navigation typing by casting activeNav to string when compared with 'history'.
web/components/containers/DashboardContainer.tsx
Added export controls for PDF and Markdown in the console top bar and wired them to analysis data.
  • Extended TopBar props with an optional onExport callback that accepts 'pdf' or 'markdown'.
  • Added an Export button with a dropdown menu in TopBar, including outside-click dismissal and basic rise animation styling.
  • Implemented dropdown items that call onExport with the chosen format and close the menu.
  • Defined a shared dropdownItem style object for export menu entries.
  • Implemented handleExport in DashboardContainer to open a PDF export URL in a new tab or trigger a markdown file download built from store.analysis.analysis_markdown and nucleus.analysis.title.
  • Passed handleExport into TopBar via the new onExport prop.
web/components/templates/console/TopBar.tsx
web/components/containers/DashboardContainer.tsx
Stabilized chat persistence by fully resetting conversations on navigation or new analysis and aligning dock z-index with layout tokens.
  • Extended the chat store reset implementation to clear conversations in addition to activeId, messagesByConv, and error.
  • Updated DashboardContainer to trigger chat store reset whenever a new nucleus.analysis is created or the URL changes, not just when analysis.id exists.
  • Adjusted ChatDock container z-index to use the semantic --z-dock CSS variable instead of a hard-coded value.
web/store/useChatStore.ts
web/components/containers/DashboardContainer.tsx
web/components/templates/console/ChatDock.tsx
Refined global UI polish including scrollbars and z-index layering for docks, dropdowns, modals, and toasts.
  • Introduced a new --z-dock token and shifted dropdown, modal, and toast z-index tokens upward to preserve layering semantics.
  • Applied global dark scrollbar styling via scrollbar-width/scrollbar-color and -webkit-scrollbar rules for consistent appearance across browsers.
  • Ensured scrollbar track and thumb styling matches existing surface and line tokens, including hover state.
web/app/globals.css
Cleaned up UCIS prompt outputs and parsing by removing redundant closing metadata markers and stripping completion tags from parsed markdown.
  • Removed trailing markdown separators and the 'UCIS v5.1 – End of Prompt' footer from the ucis-v5.1 base prompt.
  • Updated the prompt factory to add an explicit instruction forbidding closing tags/metadata markers and requiring that output end after the last dimension.
  • Extended the UCIS markdown parser to strip 'End of UCIS ... Report' completion tags from the extracted section text before final cleanup.
web/lib/prompts/ucis-v5.1.ts
web/lib/prompts/factory.ts
web/lib/utils/ucis-parser.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@supabase

supabase Bot commented Jun 5, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project adnmbikaqnxivalqoild because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6713d180-fffb-4ba2-ba3c-bc07c9796aaf

📥 Commits

Reviewing files that changed from the base of the PR and between ac59b32 and bedb686.

📒 Files selected for processing (8)
  • web/app/globals.css
  • web/components/containers/DashboardContainer.tsx
  • web/components/templates/console/ChatDock.tsx
  • web/components/templates/console/TopBar.tsx
  • web/lib/prompts/factory.ts
  • web/lib/prompts/ucis-v5.1.ts
  • web/lib/utils/ucis-parser.ts
  • web/store/useChatStore.ts

Walkthrough

PR adds PDF/Markdown export to the dashboard TopBar via a new callback and dropdown UI, introduces CSS z-index tokens for consistent UI layering, rewires DashboardContainer to use Zustand stores, updates dimension and pane rendering logic to reflect analysis state, and refines UCIS output by tightening prompts and stripping completion tags.

Changes

Dashboard export, stacking, and output quality

Layer / File(s) Summary
Z-index stacking and scrollbar styling
web/app/globals.css
Introduces --z-dock: 40 and updates --z-dropdown, --z-modal, --z-toast to values 50, 60, 70. Adds global dark scrollbar styling for Firefox (scrollbar-width, scrollbar-color) and WebKit browsers (::-webkit-scrollbar* sizing/colors).
TopBar export button and dropdown UI
web/components/templates/console/TopBar.tsx
TopBar adds optional onExport?: (format: 'pdf' | 'markdown') => void callback. Component manages export dropdown visibility via useState and renders export button with positioned dropdown menu that invokes callback on format selection.
DashboardContainer state acquisition and export wiring
web/components/containers/DashboardContainer.tsx
DashboardContainer now acquires state via useAnalysisStore() and useSynthesisNucleus(). Implements handleExport for PDF (window.open) and Markdown (blob download) export, wires to TopBar. Chat store reset effect now clears when analysis ID or URL changes.
ChatDock z-index CSS variable integration
web/components/templates/console/ChatDock.tsx
ChatDock dock shell's hardcoded zIndex: 50 is replaced with zIndex: 'var(--z-dock)' to use the new layering token.
Dashboard pane rendering and dimension status logic
web/components/containers/DashboardContainer.tsx
Dimension status now computed from store.status with pending-dimension branching. Console pane uses store.status/store.error/store.videoMetadata for AnalysisHero and BentoMetadata. Synthesis pane conditionally renders PersonaSelector, StreamingGrid, or "Preparing dimensions" placeholder. All status checks and graph-empty messaging switched from old variables to store.* references.
UCIS prompt tightening and parser cleanup
web/lib/prompts/factory.ts, web/lib/prompts/ucis-v5.1.ts, web/lib/utils/ucis-parser.ts
getUCISPrompt adds "CRITICAL" instruction to prevent closing tags and metadata. Parser's extractSection() strips "End of UCIS … Report" completion tags. UCIS v5.1 template receives trailing newline normalization.
Chat store reset enhancement
web/store/useChatStore.ts
reset() now explicitly clears the conversations array.

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly Related PRs

  • Hex-Tech-Lab/hex-yt-intel#16: UCIS output tightening (prompt refinement + "End of UCIS" marker stripping) aligns directly with that PR's persona-weighted UCIS v5 prompt/validator work.
  • Hex-Tech-Lab/hex-yt-intel#31: ChatDock stacking via --z-dock and DashboardContainer's dock wiring relate to that PR's chat-dock relocation/refactor.
  • Hex-Tech-Lab/hex-yt-intel#17: DashboardContainer state rewiring to use Zustand useAnalysisStore aligns with that PR introducing the global store.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/ui-ux-stabilization
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/ui-ux-stabilization

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

Pipeline Status: All checks passed. Ready to merge.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey - I've found 2 issues, and left some high level feedback:

  • In TopBar.tsx, dropdownItem is typed as React.CSSProperties but React isn’t imported as a namespace, which will break type-checking; consider importing type CSSProperties from react and using that instead.
  • In ChatDock, setting zIndex: 'var(--z-dock)' as any relies on a type escape hatch and passes a string where a number is expected; it would be more robust to move this to a CSS class that uses the custom property for z-index.
  • The chat reset effect in DashboardContainer now runs whenever url changes, which means typing or editing the URL field will clear the chat; if the intent is to reset only when a new analysis starts or navigation actually occurs, consider keying the effect off nucleus.analysis?.id or the router location instead of the raw input value.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In TopBar.tsx, `dropdownItem` is typed as `React.CSSProperties` but `React` isn’t imported as a namespace, which will break type-checking; consider importing `type CSSProperties` from `react` and using that instead.
- In ChatDock, setting `zIndex: 'var(--z-dock)' as any` relies on a type escape hatch and passes a string where a number is expected; it would be more robust to move this to a CSS class that uses the custom property for z-index.
- The chat reset effect in DashboardContainer now runs whenever `url` changes, which means typing or editing the URL field will clear the chat; if the intent is to reset only when a new analysis starts or navigation actually occurs, consider keying the effect off `nucleus.analysis?.id` or the router location instead of the raw input value.

## Individual Comments

### Comment 1
<location path="web/components/templates/console/TopBar.tsx" line_range="15-20" />
<code_context>
 }

-export function TopBar({ search, onSearchChange, onSearchSubmit, tier, account }: TopBarProps) {
+export function TopBar({ search, onSearchChange, onSearchSubmit, onExport, tier, account }: TopBarProps) {
+  const [exportOpen, setExportOpen] = useState(false);
+
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Avoid rendering the export control when no export handler is provided.

The Export control currently renders even when `onExport` is undefined, making it look clickable but doing nothing. Please render this block only when `onExport` is provided, or at least disable the button when it isn’t.

Suggested implementation:

```typescript
import { ReactNode, useState } from 'react';
import { Icon } from '@/components/templates/_shared/primitives';

export interface TopBarProps {
  search: string;
  onSearchChange: (value: string) => void;
  onSearchSubmit?: () => void;
  onExport?: (format: 'pdf' | 'markdown') => void;
  tier?: string;
  account?: ReactNode;
}

```

To fully implement "Avoid rendering the export control when no export handler is provided", you should adjust the JSX where the Export UI is rendered inside `TopBar`:

1. Ensure the `TopBar` component signature includes `onExport` (and `account` if used in JSX):
   ```ts
   export function TopBar({ search, onSearchChange, onSearchSubmit, onExport, tier, account }: TopBarProps) {
   ```
2. Wrap the export trigger UI so it only renders when `onExport` is provided, e.g.:
   ```tsx
   {onExport && (
     <Button onClick={() => setExportOpen(true)} /* ...rest */>
       Export
     </Button>
   )}
   ```
   Alternatively, if you must always render the button for layout reasons, at least disable it:
   ```tsx
   <Button
     onClick={() => onExport && setExportOpen(true)}
     disabled={!onExport}
     /* ...rest */
   >
     Export
   </Button>
   ```
3. If there is an export modal/popover that calls `onExport`, keep that guarded as well:
   ```tsx
   const handleExport = (format: 'pdf' | 'markdown') => {
     if (!onExport) return;
     onExport(format);
     setExportOpen(false);
   };
   ```
These changes ensure the export control is not presented as interactable when `onExport` is `undefined`, matching your review comment.
</issue_to_address>

### Comment 2
<location path="web/components/templates/console/ChatDock.tsx" line_range="100" />
<code_context>
     right: 0,
     bottom: 0,
-    zIndex: 50,
+    zIndex: 'var(--z-dock)' as any,
     borderTop: '1px solid var(--line)',
     background: 'rgb(11 14 20 / 0.97)',
</code_context>
<issue_to_address>
**suggestion:** Using `as any` for `zIndex` suggests the styling might be better handled via CSS classes.

Casting to `any` to support a CSS variable weakens type safety and can hide future issues. Since `--z-dock` already lives in `globals.css`, prefer a dedicated class (e.g. `.hx-chatdock`) that sets `z-index: var(--z-dock);` and keep the inline `zIndex` as a typed numeric value.

Suggested implementation:

```typescript
    left: 0,
    right: 0,
    bottom: 0,
    zIndex: 50,
    borderTop: '1px solid var(--line)',
    background: 'rgb(11 14 20 / 0.97)',
    backdropFilter: 'blur(12px)',

```

To fully align with your comment about preferring a CSS class that uses `var(--z-dock)`:

1. In `globals.css`, add a class such as:
   ```css
   .hx-chatdock {
     z-index: var(--z-dock);
   }
   ```
2. In `ChatDock.tsx`, ensure the root container of the dock has `className="hx-chatdock"` (or merged via something like `clsx` if it already has classes).

You may then choose to:
- Either rely purely on the class for `z-index` (remove the inline `zIndex`), **or**
- Keep the inline numeric `zIndex` as a fallback and let the class override it via CSS specificity if needed.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +15 to 20
export function TopBar({ search, onSearchChange, onSearchSubmit, onExport, tier, account }: TopBarProps) {
const [exportOpen, setExportOpen] = useState(false);

return (
<div style={{ display: "flex", alignItems: "center", gap: 12, padding: "12px 24px" }}>
<label

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

suggestion (bug_risk): Avoid rendering the export control when no export handler is provided.

The Export control currently renders even when onExport is undefined, making it look clickable but doing nothing. Please render this block only when onExport is provided, or at least disable the button when it isn’t.

Suggested implementation:

import { ReactNode, useState } from 'react';
import { Icon } from '@/components/templates/_shared/primitives';

export interface TopBarProps {
  search: string;
  onSearchChange: (value: string) => void;
  onSearchSubmit?: () => void;
  onExport?: (format: 'pdf' | 'markdown') => void;
  tier?: string;
  account?: ReactNode;
}

To fully implement "Avoid rendering the export control when no export handler is provided", you should adjust the JSX where the Export UI is rendered inside TopBar:

  1. Ensure the TopBar component signature includes onExport (and account if used in JSX):
    export function TopBar({ search, onSearchChange, onSearchSubmit, onExport, tier, account }: TopBarProps) {
  2. Wrap the export trigger UI so it only renders when onExport is provided, e.g.:
    {onExport && (
      <Button onClick={() => setExportOpen(true)} /* ...rest */>
        Export
      </Button>
    )}
    Alternatively, if you must always render the button for layout reasons, at least disable it:
    <Button
      onClick={() => onExport && setExportOpen(true)}
      disabled={!onExport}
      /* ...rest */
    >
      Export
    </Button>
  3. If there is an export modal/popover that calls onExport, keep that guarded as well:
    const handleExport = (format: 'pdf' | 'markdown') => {
      if (!onExport) return;
      onExport(format);
      setExportOpen(false);
    };

These changes ensure the export control is not presented as interactable when onExport is undefined, matching your review comment.

right: 0,
bottom: 0,
zIndex: 50,
zIndex: 'var(--z-dock)' as any,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

suggestion: Using as any for zIndex suggests the styling might be better handled via CSS classes.

Casting to any to support a CSS variable weakens type safety and can hide future issues. Since --z-dock already lives in globals.css, prefer a dedicated class (e.g. .hx-chatdock) that sets z-index: var(--z-dock); and keep the inline zIndex as a typed numeric value.

Suggested implementation:

    left: 0,
    right: 0,
    bottom: 0,
    zIndex: 50,
    borderTop: '1px solid var(--line)',
    background: 'rgb(11 14 20 / 0.97)',
    backdropFilter: 'blur(12px)',

To fully align with your comment about preferring a CSS class that uses var(--z-dock):

  1. In globals.css, add a class such as:
    .hx-chatdock {
      z-index: var(--z-dock);
    }
  2. In ChatDock.tsx, ensure the root container of the dock has className="hx-chatdock" (or merged via something like clsx if it already has classes).

You may then choose to:

  • Either rely purely on the class for z-index (remove the inline zIndex), or
  • Keep the inline numeric zIndex as a fallback and let the class override it via CSS specificity if needed.

TechHypeXP added a commit that referenced this pull request Jun 5, 2026
* fix(ci): un-wedge type-check — collapse redundant ternary + dedupe @types/react

Two errors broke the Type Check gate on main (introduced via #51), stranding
the #51 UX work undeployed (Build/Deploy were skipped):

1. DashboardContainer.tsx:277 (TS2367): the block is already inside
   `{store.status !== 'idle' && (...)}`, so the inner `!== 'idle'` ternary was
   provably-always-true. Collapsed to its truthy branch (dead `: null` removed).

2. Duplicate @types/react (Link/ForceGraph2D "cannot be used as a JSX
   component"): a transitive dep with a loose peer ('@types/react': '>=18.0.0')
   floated 19.2.15 alongside the pinned 19.0.0 → two incompatible ReactNode
   defs. Added a pnpm `overrides` block pinning @types/react + @types/react-dom
   to 19.0.0. NOTE: pnpm 11.5.1 no longer reads `pnpm.overrides` from
   package.json — it lives in pnpm-workspace.yaml.

Verified: web tsc --noEmit = 0 errors, eslint = 0. No major version bumps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): address CodeRabbit review — align @types/react to 19.2.x + state-aware synthesis placeholder

Clears the two CodeRabbit comments on #52:
1. @types/react / @types/react-dom: 19.0.0 → ^19.2.0 (resolves to a single
   19.2.16) — aligns types with the React 19.2.6 runtime (covers useEffectEvent,
   <Activity>, etc.) AND still collapses the duplicate that caused the JSX-component
   errors. Verified: lockfile resolves ONE @types/react version; web tsc 0.
2. DashboardContainer synthesis placeholder is now state-aware: 'complete' with zero
   dimensions → "No synthesis dimensions were produced"; 'error' → failure note;
   otherwise the spinner + "Preparing…". Mirrors the graph placeholder pattern.

Gates: web tsc 0, eslint 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Kelly Bakri <noreply@github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
TechHypeXP added a commit that referenced this pull request Jul 31, 2026
Co-authored-by: Kelly Bakri <noreply@github.com>
TechHypeXP pushed a commit that referenced this pull request Jul 31, 2026
…ypes/react

Two errors broke the Type Check gate on main (introduced via #51), stranding
the #51 UX work undeployed (Build/Deploy were skipped):

1. DashboardContainer.tsx:277 (TS2367): the block is already inside
   `{store.status !== 'idle' && (...)}`, so the inner `!== 'idle'` ternary was
   provably-always-true. Collapsed to its truthy branch (dead `: null` removed).

2. Duplicate @types/react (Link/ForceGraph2D "cannot be used as a JSX
   component"): a transitive dep with a loose peer ('@types/react': '>=18.0.0')
   floated 19.2.15 alongside the pinned 19.0.0 → two incompatible ReactNode
   defs. Added a pnpm `overrides` block pinning @types/react + @types/react-dom
   to 19.0.0. NOTE: pnpm 11.5.1 no longer reads `pnpm.overrides` from
   package.json — it lives in pnpm-workspace.yaml.

Verified: web tsc --noEmit = 0 errors, eslint = 0. No major version bumps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
TechHypeXP added a commit that referenced this pull request Jul 31, 2026
* fix(ci): un-wedge type-check — collapse redundant ternary + dedupe @types/react

Two errors broke the Type Check gate on main (introduced via #51), stranding
the #51 UX work undeployed (Build/Deploy were skipped):

1. DashboardContainer.tsx:277 (TS2367): the block is already inside
   `{store.status !== 'idle' && (...)}`, so the inner `!== 'idle'` ternary was
   provably-always-true. Collapsed to its truthy branch (dead `: null` removed).

2. Duplicate @types/react (Link/ForceGraph2D "cannot be used as a JSX
   component"): a transitive dep with a loose peer ('@types/react': '>=18.0.0')
   floated 19.2.15 alongside the pinned 19.0.0 → two incompatible ReactNode
   defs. Added a pnpm `overrides` block pinning @types/react + @types/react-dom
   to 19.0.0. NOTE: pnpm 11.5.1 no longer reads `pnpm.overrides` from
   package.json — it lives in pnpm-workspace.yaml.

Verified: web tsc --noEmit = 0 errors, eslint = 0. No major version bumps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): address CodeRabbit review — align @types/react to 19.2.x + state-aware synthesis placeholder

Clears the two CodeRabbit comments on #52:
1. @types/react / @types/react-dom: 19.0.0 → ^19.2.0 (resolves to a single
   19.2.16) — aligns types with the React 19.2.6 runtime (covers useEffectEvent,
   <Activity>, etc.) AND still collapses the duplicate that caused the JSX-component
   errors. Verified: lockfile resolves ONE @types/react version; web tsc 0.
2. DashboardContainer synthesis placeholder is now state-aware: 'complete' with zero
   dimensions → "No synthesis dimensions were produced"; 'error' → failure note;
   otherwise the spinner + "Preparing…". Mirrors the graph placeholder pattern.

Gates: web tsc 0, eslint 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Kelly Bakri <noreply@github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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.

2 participants