Skip to content

upstream 取り込み PR #2: v2 UI 小粒 / marketing / 9 commits#398

Merged
MocA-Love merged 10 commits intomainfrom
upstream/batch-2-safe-features
Apr 23, 2026
Merged

upstream 取り込み PR #2: v2 UI 小粒 / marketing / 9 commits#398
MocA-Love merged 10 commits intomainfrom
upstream/batch-2-safe-features

Conversation

@MocA-Love
Copy link
Copy Markdown
Owner

@MocA-Love MocA-Love commented Apr 23, 2026

Summary

upstream (superset-sh/superset) の残 67 commits 中、fork 固有機能と衝突しない 9 commits を慎重に cherry-pick。PR #388 の教訓を反映し、バッチサイズを 8-12 に抑え、事前 Codex 調査・fork 固有機能 baseline 検証・silent regression 検出手順を標準化。

取り込み内容(9 commits)

Desktop (v2 UI 小粒・スタートアップ・UX):

Marketing:

事前調査で PR #2 から除外した commits

Codex 事前分析 (/tmp/pr2-codex-preanalysis.md) により以下を PR #2 から外し、PR #2b / #5 へ移動:

Fork 側のコンフリクト解決

Fork 固有機能ヘルスチェック

作業前 baseline (/tmp/pr2-baseline/fork-features.txt) と作業後を grep で照合。全 14 項目変化なし:

  • 19 tRPC プロシージャ全数
  • 依存 ansi_up, @vscode/ripgrep, @xyflow/react
  • TERMINAL_OPTIONS (5 ファイル)
  • SUPERSET_WORKSPACE_NAME (24 箇所)
  • Kimi Code (moonshot-ai.kimi-code)
  • MainWindowEffects tearoff ガード
  • INCEPTION_AUTH_PROVIDER_ID
  • listBranches sortOrder (4) / pinDefault (3)
  • BROWSER_RELOAD hotkeys
  • port-scanner.ts Windows 分岐
  • electron-builder.ts dmg.size="4g"

Silent Regression 検出

Codex 事前分析で警告された以下のファイルを作業後に再検証し、fork 実装が silently 上書きされていないことを確認:

  • apps/desktop/src/main/index.ts
  • DashboardSidebarHeader.tsx
  • PromptGroup.tsx / DevicePicker.tsx / ProjectPickerPill.tsx
  • apps/marketing/src/app/globals.css
  • packages/shared/src/constants.ts
  • packages/ui/package.json
  • bun.lock

Test plan

  • bun install 正常完了
  • bun run typecheck グリーン (27/27 task)
  • bun run lint グリーン (4055 files checked, biome 指摘ゼロ)
  • fork 固有機能 baseline 比較で regression ゼロ
  • desktop dev 起動確認
  • v2 dashboard sidebar に Tasks link 表示
  • v2 sidebar の Project settings ボタンから settings route へ遷移
  • v1 hover card で長い workspace 名が折返し/省略表示
  • marketing /pricing ページ表示
  • marketing hero が dithered background でレンダリング
  • 新規 workspace modal のプロジェクトドロップダウンがスクロール可能

次の PR

Summary by CodeRabbit

Release Notes

  • New Features

    • Added pricing page with tier comparison and FAQ section
    • Introduced Tasks navigation in sidebar with filtering support
    • Enhanced header with improved desktop and mobile navigation
    • Added social media links (LinkedIn, YouTube)
    • Improved workspace color generation for better visual variety
  • Bug Fixes

    • Fixed project settings navigation flow
    • Improved long text handling in workspace display
    • Fixed selector pill animation behavior
  • Style & UI Updates

    • Redesigned footer layout with better organization
    • Updated CTA button styling and theme colors
    • Enhanced pricing tier UI with responsive design
    • Improved hover effects across components

Kitenite and others added 10 commits April 24, 2026 05:38
…rset-sh#3551)

requestLocalNetworkAccess was defined in local-network-permission.ts but
never called, so the Info.plist keys (NSLocalNetworkUsageDescription,
NSBonjourServices) wired up in electron-builder never had a trigger to
prompt the user. On macOS 15+ this causes outbound connections to
local-network IPs from the app and its spawned child processes (node,
python in the terminal) to be silently blocked, while system binaries
like curl escape the same TCC attribution.

Call it alongside requestAppleEventsAccess in app ready.

Refs superset-sh#3474
…h#3553)

Adds a Tasks nav entry (collapsed + expanded) alongside Workspaces,
mirroring v1: paywall gate, last-used filter restoration, and
active-route highlight.
…ojectPickerPill styling (superset-sh#3593)

The footer rendered two DevicePicker instances bound to the same draft
state. Remove the right-hand duplicate and restyle the remaining one to
use FormPickerTrigger so the Device/Project/Branch pickers read as one
segmented control (same text size, color, icon size).
…rset-sh#3622)

Replace the fixed Tailwind `-500` palette (22 entries, ~5 grey families,
several near-duplicate hue families) with a golden-angle hue generator
over fixed-L/C OKLCH. Successive workspace names land far apart on the
color wheel, eliminating the frequent collisions between concurrent dev
workspaces.
…superset-sh#3563)

* Remove video section

* Rband

* More brand

* Move pills

* CTA

* Color

* Grid line

* polish marketing hero, CTA, and testimonials

- Hero title: both segments at weight 500; "AI Agents." uses lo-res-21-ot-serif with Pixelify Sans fallback.
- Subtitle: "Orchestrate 100+ coding agents in parallel" (keep rest).
- Remove vertical grid lines from <main>.
- Move ProductDemo pills back under the mockup (no scroll transform).
- CTA heading matches FAQ styling; copy now "Try Superset now.".
- Add `role` field to Iven's testimonial (Engineer at Paraflow).
- TypewriterText: optional per-segment `render` for custom glyph rendering.
- Simplify DownloadButton classes (unify with buttonClasses).

* revert hero 'AI Agents.' styling to main version

* swap feature-demo background to paper-design Dithering shader

Replaces the canvas-based Bayer dither with @paper-design/shaders-react's
<Dithering> shader (shape="warp", type="4x4"), lazy-loaded via React.lazy.
Rendered at opacity 30% with mix-blend-screen over each card's palette.

* slow feature-demo dither shader from 0.3 to 0.15

* subtle hover on trusted-by logo tiles (brighter border + bg)

* soften Download button: ghost-style over solid foreground

* recolor Download button ghost style to brand orange

* match header CTA to brand ghost style

* push CTA button text to a more saturated orange

* restore cursor:pointer on <button> (Tailwind v4 preflight default is default)

* unify header CTA with DownloadButton

* update Chris Laupama role to TS Lead at Webflow

* match TrustedBy heading style to WallOfLove

* shrink TrustedBy heading one step

* use original compact size on TrustedBy heading, keep semibold

* update Elias role to Founder at Cleanroom

* update Chase role to Founding Engineer at Decoda Health

* update Felipe role to Codex at OpenAI

* drop unused Adobe Fonts kit scaffolding and lo-res-22 font-family

* restore mobile horizontal scroll on ProductDemo pills
…erset-sh#3639)

* feat(marketing): redesign header and footer IA

- Header: NavigationMenu dropdowns (Product, Resources) + Pricing, Enterprise
  top-level links; mobile hamburger with grouped flat list
- Footer: Notion-inspired 4-column grid (brand | Company | Resources | Legal)
  with auto-width link columns for even spacing
- Social icons: add LinkedIn + YouTube alongside Discord + X
- Add @source directive to marketing globals.css so Tailwind v4 scans
  packages/ui (fixes NavigationMenu positioning classes not compiling)
- Refresh navigation-menu.tsx to latest shadcn (adds radix-ui meta-package)
- Add CAREERS_URL (YC), TRUST_URL, STATUS_URL, LINKEDIN_URL, YOUTUBE_URL
  to @superset/shared/constants

* feat(marketing): add /pricing page

Public pricing page mirroring the desktop plans page (Free / Pro /
Enterprise) so prospects can see pricing before installing.

- Tier cards with Monthly/Yearly toggle (default Yearly, Save 25% badge)
- Comparison table: Usage / Features / Support / Security across 3 tiers,
  with Coming Soon pills on Remote workspaces, Mobile, CLI
- FAQ with 4 plan-mechanic questions
- Free + Pro CTAs point to DOWNLOAD_URL_MAC_ARM64 (billing happens in-app);
  Enterprise CTA routes to /enterprise contact form
- Tier + comparison data duplicated in pricing/constants.ts rather than
  shared via packages/shared — desktop's Plan shape carries app-specific
  CTA actions, marketing copy will evolve independently
- Add /pricing to sitemap (priority 0.9, monthly)

* feat(marketing): mobile plan selector; tone down pricing roundings

- ComparisonTable splits into desktop (full 3-col table) and mobile (3-pill
  selector + single-tier per-section view). Avoids horizontal scroll /
  column clipping on narrow viewports.
- Pricing selectors, badges, and "Popular" pill move from rounded-full to
  rounded-sm/rounded-md to match the blocky marketing aesthetic.
upstream superset-sh#3593 は selectedProject?.needsSetup === true で警告を出すが、
fork の ProjectOption 型にはこのフィールドが無い (upstream superset-sh#3566 v2
project create/import の依存)。PR #2b で superset-sh#3566 を取り込んだ後に再追加する。
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

📝 Walkthrough

Walkthrough

デスクトップアプリケーションはローカルネットワークアクセス権限要求機能を追加し、ワークスペース色生成をハッシュベースの計算方式に変更。マーケティングサイトは大規模にリファクタリングされ、新しいヘッダーナビゲーション、価格ページ、フッター再設計が実装された。その他、タスク機能の追加、プロジェクト設定ナビゲーション改善、UI コンポーネントの更新が含まれる。

Changes

Cohort / File(s) Summary
Desktop App Permission & Color System
apps/desktop/src/main/index.ts, apps/desktop/src/main/lib/dock-icon.ts
ローカルネットワークアクセス権限要求の初期化追加。ワークスペース色システムを Tailwind パレットから OKLCH ベースのハッシュ→色相→RGB 変換パイプラインに変更。
Desktop Renderer Navigation & UI
apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx, apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts, apps/desktop/src/renderer/routes/_authenticated/components/DashboardNewWorkspaceModal/components/DashboardNewWorkspaceForm/PromptGroup/components/ProjectPickerPill/ProjectPickerPill.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/components/WorkspaceHoverCard/WorkspaceHoverCard.tsx
サイドバーヘッダーに Tasks ナビゲーション控制追加。プロジェクト設定へのクライアント側ナビゲーション実装。プロジェクトピッカードロップダウンのスクロール/オーバーフロー動作改善。ワークスペース別名のテキスト折り返しと行制限を追加。
Marketing App Dependency & Colors
apps/marketing/package.json, apps/marketing/src/app/globals.css
@paper-design/shaders-react 依存性追加。ブランドカラー CSS 変数定義と Tailwind テーマ統合。
Marketing Header Navigation
apps/marketing/src/app/components/Header/Header.tsx, apps/marketing/src/app/components/Header/components/DesktopNav/DesktopNav.tsx, apps/marketing/src/app/components/Header/components/DesktopNav/index.ts, apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx, apps/marketing/src/app/components/Header/components/MobileNav/index.ts, apps/marketing/src/app/components/Header/components/SupersetLogo/SupersetLogo.tsx, apps/marketing/src/app/components/Header/components/SupersetLogo/index.ts, apps/marketing/src/app/components/Header/constants.ts
ヘッダーナビゲーション全体をリファクタリング。デスクトップ・モバイル別コンポーネント化。新しい NavLink インターフェース導入。ドロップダウンメニューとトップレベルリンク構造化。
Marketing CTA & HeroSection
apps/marketing/src/app/components/CTAButtons/HeaderCTA.tsx, apps/marketing/src/app/components/CTASection/CTASection.tsx, apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx, apps/marketing/src/app/components/HeroSection/HeroSection.tsx, apps/marketing/src/app/components/HeroSection/components/ProductDemo/ProductDemo.tsx, apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx
CTA ボタン統一化。セクション見出しテキストと`フォントスタイル更新。ダウンロードボタンのスタイリング改善。ヒーロー セクションのテキスト更新。アニメーション動作(ピル垂直移動)削除。タイプライター機能に カスタムレンダリングサポート追加。
Marketing Feature & Background Components
apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/FeatureDemo.tsx, apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx, apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/index.ts
MeshGradient から DitheredBackground に置き換え。新しいシェーダーベースの背景実装(Suspense でラップ)。
Marketing Footer & Social
apps/marketing/src/app/components/Footer/Footer.tsx, apps/marketing/src/app/components/SocialLinks/SocialLinks.tsx
フッター全体をリスポンシブグリッドレイアウトに再設計。データドリブンリンク構造。LinkedIn と YouTube ソーシャルリンク追加。
Marketing Sections & Styling
apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx, apps/marketing/src/app/components/VideoSection/VideoSection.tsx, apps/marketing/src/app/components/VideoSection/index.ts, apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx, apps/marketing/src/app/components/WallOfLoveSection/constants.ts
TrustedBySection ホバーエフェクト改善。VideoSection コンポーネント削除。WallOfLoveSection にロール属性サポート追加。
Marketing Pricing Page
apps/marketing/src/app/pricing/page.tsx, apps/marketing/src/app/pricing/constants.ts, apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx, apps/marketing/src/app/pricing/components/PricingHero/index.ts, apps/marketing/src/app/pricing/components/PricingTiers/PricingTiers.tsx, apps/marketing/src/app/pricing/components/PricingTiers/index.ts, apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx, apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/index.ts, apps/marketing/src/app/pricing/components/PricingTiers/components/PricingCard/PricingCard.tsx, apps/marketing/src/app/pricing/components/PricingTiers/components/PricingCard/index.ts, apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx, apps/marketing/src/app/pricing/components/ComparisonTable/index.ts, apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx, apps/marketing/src/app/pricing/components/PricingFAQ/index.ts
新規 /pricing ページ実装。価格設定データ構造定義(ティア、比較セクション、FAQ)。複数の価格コンポーネント作成(ヒーロー、ティアカード、比較表、FAQ アコーディオン)。
Marketing Layout & Fonts
apps/marketing/src/app/layout.tsx, apps/marketing/src/app/page.tsx, apps/marketing/src/app/sitemap.ts
Pixelify Sans フォント登録。ホームページから VideoSection 削除。sitemap に /pricing ルート追加。
Shared Constants & UI Package
packages/shared/src/constants.ts, packages/ui/package.json, packages/ui/src/components/ui/navigation-menu.tsx
会社定数に LinkedIn、YouTube、ステータス、信頼、採用 URL 追加。radix-ui パッケージ依存性追加。NavigationMenu コンポーネントのスタイリング精緻化と Radix UI インポート更新。

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐰 ワークスペースの色よ、ハッシュで輝く新しい光
ヘッダーは再び生まれ、モバイルとデスクトップ の調べ
価格ページは華やかに、FAQ の問いに答える
マーケティングの園に、タスクの扉が開く
コードの魔法、ウサギが祝う春の改新 🎉✨

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Description check ⚠️ Warning PR の説明は詳細で、取り込み内容、除外した commit の理由、fork 固有機能の維持、テスト計画をカバーしています。テンプレートの必須セクションは満たされていません。 説明テンプレートの必須セクション(Related Issues、Type of Change、Testing、Screenshots)を埋めてください。現在の説明は追加コンテキストとして機能しますが、正式なテンプレート構造が欠けています。
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive タイトルは日本語で記述されており、upstream から cherry-pick した 9 commits を示唆しますが、主な変更内容が不明確で、日本語に基づく解読が必要です。 タイトルを英語に統一し、主な変更の焦点を明確にしてください。例: 'Cherry-pick 9 upstream commits: v2 UI, marketing redesign, pricing page'
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ 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 upstream/batch-2-safe-features

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
Copy link
Copy Markdown

github-actions Bot commented Apr 23, 2026

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ⚠️ Neon database branch
  • ⚠️ Electric Fly.io app

Thank you for your contribution! 🎉

Copy link
Copy Markdown

@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

🧹 Nitpick comments (18)
apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx (1)

75-95: 分岐の重複を小さく整理できます(任意)。

render の有無で <span> ラッパが重複しています。ラッパ側を一箇所にし、children のみ切り替える形にするとメンテが楽になります。挙動は同じなので任意対応で問題ありません。

♻️ リファクタ案
-			if (segment.render) {
-				return (
-					<span
-						key={segment.text}
-						className={segment.className}
-						style={segment.style}
-					>
-						{segment.render(visibleText)}
-					</span>
-				);
-			}
-
-			return (
-				<span
-					key={segment.text}
-					className={segment.className}
-					style={segment.style}
-				>
-					{visibleText}
-				</span>
-			);
+			return (
+				<span
+					key={segment.text}
+					className={segment.className}
+					style={segment.style}
+				>
+					{segment.render ? segment.render(visibleText) : visibleText}
+				</span>
+			);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx`
around lines 75 - 95, The JSX duplicates the <span> wrapper for segments;
refactor the return inside the TypewriterText component to render a single
<span> and switch only the children: keep key={segment.text},
className={segment.className} and style={segment.style} on that single <span>
and use {segment.render ? segment.render(visibleText) : visibleText} as its
children so behavior stays identical while removing the duplicated wrapper code.
apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx (2)

49-58: アクセシビリティ: handle が表示から消える点の確認

testimonial.role ?? testimonial.handle により、role が設定されているテスティモニアル(現状はほぼ全件)では Twitter ハンドル(@...)が UI 上で完全に非表示になります。カード全体が testimonial.url(x.com へのリンク)になっているため機能上は辿れますが、視覚的にハンドル情報が失われるため、以下のいずれかを検討することをおすすめします:

  • rolehandle を併記する(例: 役職 · @handle``)
  • ハンドルを aria-labeltitle 属性として保持し、スクリーンリーダー/ホバーで参照可能にする

意図的に役職のみ表示する方針であれば、このコメントは無視して問題ありません。

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

In `@apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx`
around lines 49 - 58, The current UI uses testimonial.role ?? testimonial.handle
which hides the handle when role exists; update WallOfLoveSection to preserve
handle information by either rendering both (e.g., render testimonial.role
followed by "·" and testimonial.handle) or keeping the handle on the element via
attributes for accessibility (add title={testimonial.handle} and
aria-label={`@${testimonial.handle}`} to the same span or the outer link that
uses testimonial.url). Locate the span rendering testimonial.role ??
testimonial.handle and change it to output both values or add the
title/aria-label so screen readers and hover users can access the handle while
keeping the visible role.

73-78: Translated ボタンの非ホバー時ラベルが両ブランチで同一

この変更範囲外ですが、Line 74 の三項演算子は両分岐とも "Translated" を返しており無意味になっています(showOriginal の状態を示せていない)。近接変更のついでに、非ホバー時も状態に応じたラベル(例: showOriginal ? "Original" : "Translated")へ修正すると UX が改善します。

♻️ 提案する修正
-					<span className="group-hover:hidden">
-						{showOriginal ? "Translated" : "Translated"}
-					</span>
+					<span className="group-hover:hidden">
+						{showOriginal ? "Original" : "Translated"}
+					</span>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx`
around lines 73 - 78, The non-hover label currently uses a ternary that returns
"Translated" in both branches, so update the conditional in the
WallOfLoveSection component to reflect the showOriginal state: change the first
span's expression (the one with className "group-hover:hidden") to showOriginal
? "Original" : "Translated" so the UI shows "Original" when showOriginal is true
and "Translated" otherwise, leaving the hover-state span (className "hidden
group-hover:inline") as-is.
apps/marketing/src/app/components/HeroSection/HeroSection.tsx (1)

29-31: フォールバック追加は妥当

monospace フォールバックの追加により、--font-ibm-plex-mono のロード失敗時でも等幅フォントで描画される安全策となっており良い修正です。なお、Line 43 の TypewriterText 側の fontFamily: "var(--font-geist-pixel-grid)" には同様のフォールバックが無いため、ここで合わせて monospace などを追記しておくと一貫性が取れます(本 PR の範囲外でも可)。

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

In `@apps/marketing/src/app/components/HeroSection/HeroSection.tsx` around lines
29 - 31, HeroSection adds a monospace fallback for --font-ibm-plex-mono which is
good; mirror that change for the TypewriterText usage by updating the fontFamily
declaration on the TypewriterText component (the property currently set to
"var(--font-geist-pixel-grid)") to include a safe fallback like ", monospace"
(e.g., "var(--font-geist-pixel-grid), monospace") so that if the custom font
fails to load the text still renders with an appropriate fallback.
apps/marketing/src/app/components/Footer/Footer.tsx (2)

88-94: Props 型は interface で定義することを推奨。

FooterColumn / FooterLinkItem の props がインライン型リテラルで定義されています。コーディングガイドラインでは TypeScript のオブジェクト形状は interface の使用が推奨されているため、FooterColumnProps / FooterLinkItemProps として切り出すと一貫性が向上します。

♻️ 提案する差分
+interface FooterColumnProps {
+	title: string;
+	links: FooterLink[];
+}
+
-function FooterColumn({
-	title,
-	links,
-}: {
-	title: string;
-	links: FooterLink[];
-}) {
+function FooterColumn({ title, links }: FooterColumnProps) {
@@
-function FooterLinkItem({ link }: { link: FooterLink }) {
+interface FooterLinkItemProps {
+	link: FooterLink;
+}
+
+function FooterLinkItem({ link }: FooterLinkItemProps) {

As per coding guidelines: "Prefer interface for defining object shapes in TypeScript".

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

In `@apps/marketing/src/app/components/Footer/Footer.tsx` around lines 88 - 94,
The props for FooterColumn and FooterLinkItem are declared inline; extract them
into named interfaces to follow the project's TypeScript style guide by creating
FooterColumnProps and FooterLinkItemProps interfaces that describe { title:
string; links: FooterLink[] } (for FooterColumn) and the corresponding shape
used by FooterLinkItem, then update the function/component signatures
(FooterColumn and FooterLinkItem) to use these interfaces instead of inline type
literals to improve consistency and readability.

120-122: 装飾アイコンは aria-hidden 指定を推奨。

ArrowUpRight はホバー時のアフォーダンスを示す純粋な装飾要素です。スクリーンリーダーに不要な要素として読み上げられないよう aria-hidden="true" を付与することを推奨します(リンクテキストは既に link.label で伝達されています)。

♻️ 提案する差分
-				<ArrowUpRight className="h-3 w-3 opacity-0 transition-opacity group-hover:opacity-100" />
+				<ArrowUpRight
+					aria-hidden="true"
+					className="h-3 w-3 opacity-0 transition-opacity group-hover:opacity-100"
+				/>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/marketing/src/app/components/Footer/Footer.tsx` around lines 120 - 122,
The decorative icon ArrowUpRight inside the Footer link is read by assistive
tech; mark it as purely decorative by adding aria-hidden="true" to the
ArrowUpRight element (in the Footer component where ArrowUpRight is rendered
next to link.label) so screen readers ignore it while the link text remains
accessible.
apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx (1)

71-87: アクセシビリティ: Tasks ボタンに aria-label / aria-current が未設定

Collapsed 時はアイコンのみで可視ラベルが無く、Tooltip はフォーカス/ホバー時のみ表示されるためスクリーンリーダー利用者向けに aria-label="Tasks" を付与するのが望ましいです。また、アクティブ状態(isTasksOpen / isWorkspacesListOpen)はナビゲーションとして aria-current="page" を付与するとセマンティクスが向上します(既存の Workspaces ボタンにも同様)。今回の変更範囲の Tasks ボタンに限ってでも対応を検討してください。

Also applies to: 152-164

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

In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx`
around lines 71 - 87, The Tasks button lacks accessible labeling and state
semantics; update the button rendered in TooltipTrigger (the element using
onClick={handleTasksClick} and rendering HiOutlineClipboardDocumentList) to
include aria-label="Tasks" and add aria-current="page" when isTasksOpen is true
(i.e., set aria-current={isTasksOpen ? "page" : undefined}) so screen readers
get a persistent label and the active navigation state; apply the same
aria-current pattern used for the Workspaces button for consistency.
apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx (1)

27-27: テキスト色のみハードコードされています

bg-brand/10border-brand/20 はブランドトークンを使っている一方、テキスト色だけ text-[#ff8c3a] とハードコードされた値になっています。apps/marketing/src/app/globals.css で追加された --brand-light: #e8804a;(Tailwind トークン text-brand-light)とほぼ同系統の色なので、テーマトークンに揃えた方が今後のブランド色変更時に追従しやすいです。現状の #ff8c3a--brand-light と完全一致はしないため、意図した色であれば新トークンを 1 つ足すのも手です。

♻️ 提案差分(トークン化する場合)
-	const buttonClasses = `bg-brand/10 text-[`#ff8c3a`] border border-brand/20 ${sizeClasses} font-normal hover:bg-brand/15 hover:border-brand/35 transition-colors flex items-center gap-2 ${className}`;
+	const buttonClasses = `bg-brand/10 text-brand-light border border-brand/20 ${sizeClasses} font-normal hover:bg-brand/15 hover:border-brand/35 transition-colors flex items-center gap-2 ${className}`;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx` at line
27, The buttonClasses string in DownloadButton.tsx hardcodes the text color as
text-[`#ff8c3a`]; change this to use the theme token (e.g. text-brand-light) so it
follows the brand token in globals.css (--brand-light) and stays consistent with
bg-brand/10 and border-brand/20; update the class used in the buttonClasses
constant (and add a new Tailwind token only if the desired color truly differs
from --brand-light) so future brand color changes are applied consistently.
apps/marketing/src/app/globals.css (1)

3-3: Stylelint の警告は Tailwind v4 構文による誤検出

@source / @theme / @theme inline はいずれも Tailwind CSS v4 の正規ディレクティブであり、stylelint の scss/at-rule-no-unknown による指摘は false positive です。対応として、stylelint 設定側で Tailwind のディレクティブを ignoreAtRules に追加しておくと、今後他ファイルでも同様のノイズを抑えられます(例: ["tailwind", "apply", "layer", "config", "source", "theme", "utility", "variant", "custom-variant"])。修正は本 PR スコープ外でも問題ありません。

Also applies to: 10-14

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

In `@apps/marketing/src/app/globals.css` at line 3, Stylelint is falsely flagging
Tailwind v4 directives (`@source`, `@theme`, `@theme` inline) via the
scss/at-rule-no-unknown rule; update the stylelint config to add Tailwind
directives to ignoreAtRules (e.g., include "source", "theme", "tailwind",
"apply", "layer", "config", "utility", "variant", "custom-variant") so these
at-rules are treated as valid and the warnings in globals.css and other files
stop appearing.
apps/desktop/src/main/lib/dock-icon.ts (1)

12-20: ゴールデン角の適用方法とコメントの整合性について(任意)

JSDoc では「successive workspaces land far apart」と記載されていますが、ゴールデン角による均等分散はシーケンシャルな整数インデックス(0,1,2,… × 137.508 mod 360)に掛けたときに成立する性質です。ここでは入力が既に擬似ランダムな hash(workspaceName) なので、(hash * 137.508) % 360 の分布は実質 hash % 360 と同等で、「連続するワークスペースが遠くに配置される」保証にはなりません(dev 用途なので実害はありません)。

意図を活かすなら、ワークスペース名ではなく生成順インデックスを乗数に使うか、コメントを「名前ハッシュから決定的に色相を選ぶ(GOLDEN_ANGLE は色相空間の分散を意図した係数)」のように実装に合わせた表現へ微修正するのが素直です。

📝 コメント微修正の案
 /**
- * Deterministic workspace-name → RGB picker. Hashes the name to a hue via the
- * golden angle (137.508°) so successive workspaces land far apart on the color
- * wheel, then converts a fixed-lightness/chroma OKLCH point to sRGB.
+ * Deterministic workspace-name → RGB picker. Hashes the name into a hue
+ * (scaled by the golden angle for spread), then converts a fixed
+ * lightness/chroma OKLCH point at that hue to sRGB.
  */

また、L = 0.68 / C = 0.18 の組み合わせは一部色相で sRGB ガマット外となり、toSrgb 内の Math.max(0, Math.min(1, v)) で線形値がクランプされ、結果として意図より彩度の低い/色相のずれた色になる色相帯が存在します。dev 用のドックアイコン装飾なので許容範囲ですが、将来色の均質性が気になった際は C を少し下げる(例: 0.12–0.15)のが簡単な緩和策です。

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

In `@apps/desktop/src/main/lib/dock-icon.ts` around lines 12 - 20, The JSDoc for
pickWorkspaceColor misleadingly claims "successive workspaces land far apart"
though the code multiplies a name hash by GOLDEN_ANGLE; because
hash(workspaceName) is already pseudo-random this does not guarantee sequential
spacing — either change the implementation to use a sequential index ×
GOLDEN_ANGLE (use generation order instead of hash) or update the comment to
state that the function deterministically maps workspaceName via hash to a hue
using GOLDEN_ANGLE; additionally, to avoid sRGB-gamut clipping in toSrgb when
converting OKLCH, consider lowering C (e.g., to ~0.12–0.15) or document that L =
0.68 and C = 0.18 may clip for some hues.
apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx (1)

11-33: 4色タプルを要求しているにもかかわらず、colors[0] しか使用していません。

DitheredBackgroundProps.colorsreadonly [string, string, string, string] の 4 要素タプルを要求していますが、実装では colorFront={colors[0]} として最初の色のみを参照しており、残り 3 色は使用されていません。呼び出し側の FeatureDemo は constants.ts の FEATURES から 4 色全て(例:["#7f1d1d", "#991b1b", "#450a0a", "#1a1a2e"])を渡しているため、不要なデータを強制しているため、呼び出し側が不安になる可能性があります。

基盤となる @paper-design/shaders-reactDithering コンポーネントは 2 色シェーダーで、colorFront は単一の色文字列のみをサポートし、複数色には対応していません。

以下のいずれかに統一することを推奨します:

  • シェーダーが実際に単色のみで運用されるなら、props を color: string に簡潔化する。
  • 将来的に複数色を活用する予定があるなら、TODO コメントで明示する。
♻️ 単色前提に簡潔化する例
 interface DitheredBackgroundProps {
-	colors: readonly [string, string, string, string];
+	color: string;
 	className?: string;
 }

 export function DitheredBackground({
-	colors,
+	color,
 	className = "",
 }: DitheredBackgroundProps) {
   ...
-					colorFront={colors[0]}
+					colorFront={color}

(呼び出し側 FeatureDemo / FeaturesSectioncolor={colors[0]} に更新してください。)

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

In
`@apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx`
around lines 11 - 33, DitheredBackgroundProps currently requires a 4-tuple but
only uses the first element; change the API to a single color prop or document
intent: update the DitheredBackgroundProps to use color: string (replace colors:
readonly [string,...]) and adjust the component signature in DitheredBackground
to read color (defaulting className as before) and pass colorFront={color} into
the Dithering component; then update callers (e.g., FeatureDemo and wherever
FEATURES constants are used) to pass color={colors[0]} or simplify FEATURES to
supply a single color, or alternatively add a clear TODO comment in
DitheredBackgroundProps explaining why a 4-tuple is accepted but only the first
color is used if you intend to keep the tuple for future use.
apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx (1)

10-31: アクセシビリティ: トグルを role="group" でラップするのが望ましい

2 つのボタンは排他的トグルとして aria-pressed を付けているので機能的には問題ありませんが、外側の div にラベル付きの role="group"(または radiogroup として <input type="radio"> 構成)を与えると、支援技術で「Billing period」のまとまりとして認識しやすくなります。任意の改善案です。

♻️ 提案
-		<div className="inline-flex items-center gap-1 rounded-md border border-border bg-card p-1">
+		<div
+			role="group"
+			aria-label="Billing period"
+			className="inline-flex items-center gap-1 rounded-md border border-border bg-card p-1"
+		>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx`
around lines 10 - 31, Wrap the toggle container in BillingToggle with an
accessible group role and label: update the outer div in the BillingToggle
function to include role="group" and a descriptive accessible name (for example
aria-label="Billing period" or aria-labelledby pointing to a visible label), so
screen readers treat the two ToggleButton items as a labeled exclusive group; no
change needed to ToggleButton's aria-pressed behavior unless you opt to convert
to real radios.
apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx (1)

1-1: GridCross への相対的な深いインポートパス

@/app/blog/components/GridCross を pricing 配下から直接参照しているため、blog 固有コンポーネントへの暗黙的な結合が生まれています。ヘッダー/フッターなど複数ページで再利用されるのであれば、app/components/ 等の共通置き場所に移動するか再エクスポートして、ページ間のディレクトリ依存を整理することを検討してください。

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

In `@apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx` at
line 1, PricingHero.tsx currently imports GridCross directly from
"@/app/blog/components/GridCross", creating an implicit dependency on the blog
page; to fix, move the GridCross component to a shared location (e.g.,
app/components/GridCross) or add a re-export from a common barrel (e.g.,
app/components/index.ts) and update the import in PricingHero.tsx to the shared
path; specifically modify the import of GridCross in PricingHero.tsx to point at
the new shared module and remove blog-specific coupling so other pages can reuse
the component.
packages/ui/package.json (1)

37-37: radix-ui メタパッケージと個別 @radix-ui/react-navigation-menu の重複

navigation-menu.tsxradix-ui メタパッケージから NavigationMenu をインポートしており、直接依存として残っている @radix-ui/react-navigation-menu は冗長です。他の Radix プリミティブもまだ個別パッケージを直接 import しているため現在は共存で問題ありませんが、将来的に radix-ui 1 本に寄せるか、@radix-ui/react-navigation-menu を削除して重複した依存関係を整理することを検討してください。今回の PR では影響はありません。

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

In `@packages/ui/package.json` at line 37, The package.json currently lists a
redundant direct dependency "@radix-ui/react-navigation-menu" while the code
(navigation-menu.tsx) imports NavigationMenu from the radix-ui meta package;
remove the duplicate dependency from package.json (the
"@radix-ui/react-navigation-menu" entry) or alternatively update imports in
navigation-menu.tsx to consistently use the individual package—choose and apply
one approach across the repo (refer to navigation-menu.tsx and the
"@radix-ui/react-navigation-menu" dependency name to locate the change).
apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx (1)

63-83: colSpan={4} がハードコードされており、ティア数の変更に弱いです

現在は「Features 列 + PRICING_TIERS 3 列」で合計 4 になっていますが、将来 PRICING_TIERS を追加/削除するとセクション見出し行が列をまたぎきれずレイアウトが崩れます。PRICING_TIERS.length + 1 を使うと安全です。

♻️ 提案
-function DesktopSectionGroup({
-	title,
-	children,
-}: {
-	title: string;
-	children: React.ReactNode;
-}) {
+function DesktopSectionGroup({
+	title,
+	colSpan,
+	children,
+}: {
+	title: string;
+	colSpan: number;
+	children: React.ReactNode;
+}) {
 	return (
 		<>
 			<tr>
 				<td
-					colSpan={4}
+					colSpan={colSpan}
 					className="border-b border-border bg-accent/20 px-4 py-3 text-xs font-medium uppercase tracking-wide text-muted-foreground"
 				>
 					{title}
 				</td>
 			</tr>
 			{children}
 		</>
 	);
 }

呼び出し側で colSpan={PRICING_TIERS.length + 1} を渡してください。

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

In
`@apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx`
around lines 63 - 83, The DesktopSectionGroup currently hardcodes colSpan={4},
which breaks if PRICING_TIERS changes; update DesktopSectionGroup to accept a
numeric prop (e.g., colSpan) and use that instead of the constant so callers can
pass PRICING_TIERS.length + 1; locate the DesktopSectionGroup function and
replace the literal colSpan with the prop, and update its call sites to pass
colSpan={PRICING_TIERS.length + 1}.
apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx (1)

3-3: framer-motion をプロジェクト全体で motion/react に統一することを検討してください

framer-motion v12.23.26 では、公式ドキュメントにより motion/react からのインポートが推奨されています。現在、プロジェクトは両方の import スタイルが混在しており、packages/ui/src/components/ai-elements/shimmer.tsx では既に motion/react を使用しているのに対し、他の大多数のファイルは framer-motion を使用しています。整合性を図るため、motion パッケージへの統一的な移行と import パスの標準化が望ましいです。

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

In `@apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx` at line
3, Update the framer-motion import in PricingFAQ.tsx: currently it imports
AnimatePresence and motion from "framer-motion"; change this to the project's
chosen React entrypoint (match the existing pattern used elsewhere, e.g. import
AnimatePresence and motion from "framer-motion/react" or the project's
"motion/react" alias) so the file's import for AnimatePresence and motion is
consistent with packages/ui/src/components/ai-elements/shimmer.tsx and the rest
of the codebase.
apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx (1)

19-66: Esc キー / 外側クリックでの閉じる操作がありません

現状トグルボタン以外では閉じられず、同一ルートへ遷移した場合もドロワーが開いたままになります(onNavigate は異なるパス遷移時のみ効果的)。一般的なモバイルナビ UX に合わせて、Escape キーや背景スクロール時の自動クローズを検討してください。必須ではないのでお好みで。

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

In `@apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx`
around lines 19 - 66, MobileNav currently only toggles via its button; add
Escape-key and outside-click close plus optional background-scroll lock: create
a ref for the motion.div panel and add a useEffect in MobileNav that (1) listens
for 'keydown' and calls setIsOpen(false) when event.key === 'Escape', (2)
listens for pointer/mousedown events on document and closes when the click
target is outside the panel ref, and (3) when isOpen is true set
document.body.style.overflow = 'hidden' and restore on close; ensure you clean
up all listeners and restore overflow in the effect cleanup; keep existing
close() and onNavigate behavior (MobileSection onNavigate still calls close).
apps/marketing/src/app/pricing/constants.ts (1)

19-19: Partial<Record<string, string>> の冗長性を検討

featureLimits フィールド自体が ? で optional になっているため、Partial<> ラッパーは型上の実質的な利点がありません。

また、featureLimits は PRICING_TIERS データ内で一度も使用されておらず、コードベース全体でも参照されていません。設計意図が「ティアごとの特定キー値マップ」であれば、キーセットを TierId に限定して型安全性を高めることを検討してください:

-	featureLimits?: Partial<Record<string, string>>;
+	featureLimits?: Record<TierId, string>;

ただし、このフィールドが将来的な使用を想定している場合は、そのまま保持してもかまいません。

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

In `@apps/marketing/src/app/pricing/constants.ts` at line 19, featureLimits
フィールドは既に optional (?) なので Partial<Record<string, string>> のラップは冗長で、さらに
PRICING_TIERS 内やプロジェクトで参照されていないため選択肢は三つです:不要なら featureLimits
プロパティを削除して型をシンプルにする、将来保守のため残すなら型を Record<TierId, string> のようにキーを TierId
に限定して型安全性を高める、あるいは本当に任意のキーを許す必要があるなら Partial を外して単に Record<string,string> |
undefined にする — 対象は apps/marketing/src/app/pricing/constants.ts の featureLimits
宣言と PRICING_TIERS 定義を確認して意図に沿う選択を反映してください。
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@apps/desktop/src/renderer/routes/_authenticated/components/DashboardNewWorkspaceModal/components/DashboardNewWorkspaceForm/PromptGroup/components/ProjectPickerPill/ProjectPickerPill.tsx`:
- Around line 48-52: The current unconditional onWheel handler on PopoverContent
(in ProjectPickerPill) calls event.stopPropagation() for every wheel event which
can block ancestor scroll handlers; instead, restrict wheel interception to the
actual scrollable dropdown content (e.g. the Radix CommandList) or only when
that content is scrollable/at its scroll bounds: move the wheel handler to the
CommandList component (or query/select the CommandList inside PopoverContent)
and call stopPropagation() only when the CommandList can scroll (scrollHeight >
clientHeight) or when the wheel would attempt to scroll beyond its bounds;
otherwise let the event bubble so modal/ancestor scroll logic still runs. Ensure
you update the onWheel attachment and logic around PopoverContent and
CommandList accordingly.

In
`@apps/marketing/src/app/components/Header/components/DesktopNav/DesktopNav.tsx`:
- Around line 72-94: FeatureCard currently links to "/" which is too generic for
the promo copy; update the Link href inside the FeatureCard component (the Link
wrapped by NavigationMenuLink in FeatureCard) to point to the specific product
page (e.g. "/desktop" or the intended landing route) or make href configurable
via props so the CTA directs users to the proper product/landing page instead of
the marketing root.

In `@apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx`:
- Around line 84-105: The external anchor elements rendered in the links.map
branch don't call the onNavigate handler, so the drawer stays open when opening
external links; update the external branch (the <a> element rendered for
link.external) to include onClick={onNavigate} (keep target="_blank" and
rel="noopener noreferrer") so clicking external links also triggers the same
navigation/close logic as the internal Link branch; ensure the onClick prop is
added to the anchor that currently uses key={link.href}, href={link.href}, and
the same className so behavior and styling remain consistent.

In `@apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx`:
- Around line 51-67: The region's aria-labelledby currently points to its own id
(contentId); change it to reference the FAQ trigger button's id instead (e.g.,
`${contentId}-trigger`). Add or update the trigger button element to include
id={`${contentId}-trigger`} and then set the motion.div's aria-labelledby to
that trigger id (use the same contentId base to build the trigger id). Ensure
the motion.div keeps id={contentId} for region identification but not as its own
label, and verify any toggle logic using isOpen still matches these ids.

---

Nitpick comments:
In `@apps/desktop/src/main/lib/dock-icon.ts`:
- Around line 12-20: The JSDoc for pickWorkspaceColor misleadingly claims
"successive workspaces land far apart" though the code multiplies a name hash by
GOLDEN_ANGLE; because hash(workspaceName) is already pseudo-random this does not
guarantee sequential spacing — either change the implementation to use a
sequential index × GOLDEN_ANGLE (use generation order instead of hash) or update
the comment to state that the function deterministically maps workspaceName via
hash to a hue using GOLDEN_ANGLE; additionally, to avoid sRGB-gamut clipping in
toSrgb when converting OKLCH, consider lowering C (e.g., to ~0.12–0.15) or
document that L = 0.68 and C = 0.18 may clip for some hues.

In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx`:
- Around line 71-87: The Tasks button lacks accessible labeling and state
semantics; update the button rendered in TooltipTrigger (the element using
onClick={handleTasksClick} and rendering HiOutlineClipboardDocumentList) to
include aria-label="Tasks" and add aria-current="page" when isTasksOpen is true
(i.e., set aria-current={isTasksOpen ? "page" : undefined}) so screen readers
get a persistent label and the active navigation state; apply the same
aria-current pattern used for the Workspaces button for consistency.

In `@apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx`:
- Line 27: The buttonClasses string in DownloadButton.tsx hardcodes the text
color as text-[`#ff8c3a`]; change this to use the theme token (e.g.
text-brand-light) so it follows the brand token in globals.css (--brand-light)
and stays consistent with bg-brand/10 and border-brand/20; update the class used
in the buttonClasses constant (and add a new Tailwind token only if the desired
color truly differs from --brand-light) so future brand color changes are
applied consistently.

In
`@apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx`:
- Around line 11-33: DitheredBackgroundProps currently requires a 4-tuple but
only uses the first element; change the API to a single color prop or document
intent: update the DitheredBackgroundProps to use color: string (replace colors:
readonly [string,...]) and adjust the component signature in DitheredBackground
to read color (defaulting className as before) and pass colorFront={color} into
the Dithering component; then update callers (e.g., FeatureDemo and wherever
FEATURES constants are used) to pass color={colors[0]} or simplify FEATURES to
supply a single color, or alternatively add a clear TODO comment in
DitheredBackgroundProps explaining why a 4-tuple is accepted but only the first
color is used if you intend to keep the tuple for future use.

In `@apps/marketing/src/app/components/Footer/Footer.tsx`:
- Around line 88-94: The props for FooterColumn and FooterLinkItem are declared
inline; extract them into named interfaces to follow the project's TypeScript
style guide by creating FooterColumnProps and FooterLinkItemProps interfaces
that describe { title: string; links: FooterLink[] } (for FooterColumn) and the
corresponding shape used by FooterLinkItem, then update the function/component
signatures (FooterColumn and FooterLinkItem) to use these interfaces instead of
inline type literals to improve consistency and readability.
- Around line 120-122: The decorative icon ArrowUpRight inside the Footer link
is read by assistive tech; mark it as purely decorative by adding
aria-hidden="true" to the ArrowUpRight element (in the Footer component where
ArrowUpRight is rendered next to link.label) so screen readers ignore it while
the link text remains accessible.

In `@apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx`:
- Around line 19-66: MobileNav currently only toggles via its button; add
Escape-key and outside-click close plus optional background-scroll lock: create
a ref for the motion.div panel and add a useEffect in MobileNav that (1) listens
for 'keydown' and calls setIsOpen(false) when event.key === 'Escape', (2)
listens for pointer/mousedown events on document and closes when the click
target is outside the panel ref, and (3) when isOpen is true set
document.body.style.overflow = 'hidden' and restore on close; ensure you clean
up all listeners and restore overflow in the effect cleanup; keep existing
close() and onNavigate behavior (MobileSection onNavigate still calls close).

In
`@apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx`:
- Around line 75-95: The JSX duplicates the <span> wrapper for segments;
refactor the return inside the TypewriterText component to render a single
<span> and switch only the children: keep key={segment.text},
className={segment.className} and style={segment.style} on that single <span>
and use {segment.render ? segment.render(visibleText) : visibleText} as its
children so behavior stays identical while removing the duplicated wrapper code.

In `@apps/marketing/src/app/components/HeroSection/HeroSection.tsx`:
- Around line 29-31: HeroSection adds a monospace fallback for
--font-ibm-plex-mono which is good; mirror that change for the TypewriterText
usage by updating the fontFamily declaration on the TypewriterText component
(the property currently set to "var(--font-geist-pixel-grid)") to include a safe
fallback like ", monospace" (e.g., "var(--font-geist-pixel-grid), monospace") so
that if the custom font fails to load the text still renders with an appropriate
fallback.

In `@apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx`:
- Around line 49-58: The current UI uses testimonial.role ?? testimonial.handle
which hides the handle when role exists; update WallOfLoveSection to preserve
handle information by either rendering both (e.g., render testimonial.role
followed by "·" and testimonial.handle) or keeping the handle on the element via
attributes for accessibility (add title={testimonial.handle} and
aria-label={`@${testimonial.handle}`} to the same span or the outer link that
uses testimonial.url). Locate the span rendering testimonial.role ??
testimonial.handle and change it to output both values or add the
title/aria-label so screen readers and hover users can access the handle while
keeping the visible role.
- Around line 73-78: The non-hover label currently uses a ternary that returns
"Translated" in both branches, so update the conditional in the
WallOfLoveSection component to reflect the showOriginal state: change the first
span's expression (the one with className "group-hover:hidden") to showOriginal
? "Original" : "Translated" so the UI shows "Original" when showOriginal is true
and "Translated" otherwise, leaving the hover-state span (className "hidden
group-hover:inline") as-is.

In `@apps/marketing/src/app/globals.css`:
- Line 3: Stylelint is falsely flagging Tailwind v4 directives (`@source`, `@theme`,
`@theme` inline) via the scss/at-rule-no-unknown rule; update the stylelint config
to add Tailwind directives to ignoreAtRules (e.g., include "source", "theme",
"tailwind", "apply", "layer", "config", "utility", "variant", "custom-variant")
so these at-rules are treated as valid and the warnings in globals.css and other
files stop appearing.

In
`@apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx`:
- Around line 63-83: The DesktopSectionGroup currently hardcodes colSpan={4},
which breaks if PRICING_TIERS changes; update DesktopSectionGroup to accept a
numeric prop (e.g., colSpan) and use that instead of the constant so callers can
pass PRICING_TIERS.length + 1; locate the DesktopSectionGroup function and
replace the literal colSpan with the prop, and update its call sites to pass
colSpan={PRICING_TIERS.length + 1}.

In `@apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx`:
- Line 3: Update the framer-motion import in PricingFAQ.tsx: currently it
imports AnimatePresence and motion from "framer-motion"; change this to the
project's chosen React entrypoint (match the existing pattern used elsewhere,
e.g. import AnimatePresence and motion from "framer-motion/react" or the
project's "motion/react" alias) so the file's import for AnimatePresence and
motion is consistent with packages/ui/src/components/ai-elements/shimmer.tsx and
the rest of the codebase.

In `@apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx`:
- Line 1: PricingHero.tsx currently imports GridCross directly from
"@/app/blog/components/GridCross", creating an implicit dependency on the blog
page; to fix, move the GridCross component to a shared location (e.g.,
app/components/GridCross) or add a re-export from a common barrel (e.g.,
app/components/index.ts) and update the import in PricingHero.tsx to the shared
path; specifically modify the import of GridCross in PricingHero.tsx to point at
the new shared module and remove blog-specific coupling so other pages can reuse
the component.

In
`@apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx`:
- Around line 10-31: Wrap the toggle container in BillingToggle with an
accessible group role and label: update the outer div in the BillingToggle
function to include role="group" and a descriptive accessible name (for example
aria-label="Billing period" or aria-labelledby pointing to a visible label), so
screen readers treat the two ToggleButton items as a labeled exclusive group; no
change needed to ToggleButton's aria-pressed behavior unless you opt to convert
to real radios.

In `@apps/marketing/src/app/pricing/constants.ts`:
- Line 19: featureLimits フィールドは既に optional (?) なので Partial<Record<string,
string>> のラップは冗長で、さらに PRICING_TIERS 内やプロジェクトで参照されていないため選択肢は三つです:不要なら
featureLimits プロパティを削除して型をシンプルにする、将来保守のため残すなら型を Record<TierId, string> のようにキーを
TierId に限定して型安全性を高める、あるいは本当に任意のキーを許す必要があるなら Partial を外して単に Record<string,string>
| undefined にする — 対象は apps/marketing/src/app/pricing/constants.ts の
featureLimits 宣言と PRICING_TIERS 定義を確認して意図に沿う選択を反映してください。

In `@packages/ui/package.json`:
- Line 37: The package.json currently lists a redundant direct dependency
"@radix-ui/react-navigation-menu" while the code (navigation-menu.tsx) imports
NavigationMenu from the radix-ui meta package; remove the duplicate dependency
from package.json (the "@radix-ui/react-navigation-menu" entry) or alternatively
update imports in navigation-menu.tsx to consistently use the individual
package—choose and apply one approach across the repo (refer to
navigation-menu.tsx and the "@radix-ui/react-navigation-menu" dependency name to
locate the change).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 23fe4065-f037-4561-9732-9cfa2e82261c

📥 Commits

Reviewing files that changed from the base of the PR and between 426776a and 4f991f4.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (52)
  • apps/desktop/src/main/index.ts
  • apps/desktop/src/main/lib/dock-icon.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarHeader/DashboardSidebarHeader.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts
  • apps/desktop/src/renderer/routes/_authenticated/components/DashboardNewWorkspaceModal/components/DashboardNewWorkspaceForm/PromptGroup/components/ProjectPickerPill/ProjectPickerPill.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/components/WorkspaceHoverCard/WorkspaceHoverCard.tsx
  • apps/marketing/package.json
  • apps/marketing/src/app/components/CTAButtons/HeaderCTA.tsx
  • apps/marketing/src/app/components/CTASection/CTASection.tsx
  • apps/marketing/src/app/components/DownloadButton/DownloadButton.tsx
  • apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/FeatureDemo.tsx
  • apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/DitheredBackground.tsx
  • apps/marketing/src/app/components/FeaturesSection/components/FeatureDemo/components/DitheredBackground/index.ts
  • apps/marketing/src/app/components/Footer/Footer.tsx
  • apps/marketing/src/app/components/Header/Header.tsx
  • apps/marketing/src/app/components/Header/components/DesktopNav/DesktopNav.tsx
  • apps/marketing/src/app/components/Header/components/DesktopNav/index.ts
  • apps/marketing/src/app/components/Header/components/MobileNav/MobileNav.tsx
  • apps/marketing/src/app/components/Header/components/MobileNav/index.ts
  • apps/marketing/src/app/components/Header/components/SupersetLogo/SupersetLogo.tsx
  • apps/marketing/src/app/components/Header/components/SupersetLogo/index.ts
  • apps/marketing/src/app/components/Header/constants.ts
  • apps/marketing/src/app/components/HeroSection/HeroSection.tsx
  • apps/marketing/src/app/components/HeroSection/components/ProductDemo/ProductDemo.tsx
  • apps/marketing/src/app/components/HeroSection/components/TypewriterText/TypewriterText.tsx
  • apps/marketing/src/app/components/SocialLinks/SocialLinks.tsx
  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
  • apps/marketing/src/app/components/VideoSection/VideoSection.tsx
  • apps/marketing/src/app/components/VideoSection/index.ts
  • apps/marketing/src/app/components/WallOfLoveSection/WallOfLoveSection.tsx
  • apps/marketing/src/app/components/WallOfLoveSection/constants.ts
  • apps/marketing/src/app/globals.css
  • apps/marketing/src/app/layout.tsx
  • apps/marketing/src/app/page.tsx
  • apps/marketing/src/app/pricing/components/ComparisonTable/ComparisonTable.tsx
  • apps/marketing/src/app/pricing/components/ComparisonTable/index.ts
  • apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx
  • apps/marketing/src/app/pricing/components/PricingFAQ/index.ts
  • apps/marketing/src/app/pricing/components/PricingHero/PricingHero.tsx
  • apps/marketing/src/app/pricing/components/PricingHero/index.ts
  • apps/marketing/src/app/pricing/components/PricingTiers/PricingTiers.tsx
  • apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/BillingToggle.tsx
  • apps/marketing/src/app/pricing/components/PricingTiers/components/BillingToggle/index.ts
  • apps/marketing/src/app/pricing/components/PricingTiers/components/PricingCard/PricingCard.tsx
  • apps/marketing/src/app/pricing/components/PricingTiers/components/PricingCard/index.ts
  • apps/marketing/src/app/pricing/components/PricingTiers/index.ts
  • apps/marketing/src/app/pricing/constants.ts
  • apps/marketing/src/app/pricing/page.tsx
  • apps/marketing/src/app/sitemap.ts
  • packages/shared/src/constants.ts
  • packages/ui/package.json
  • packages/ui/src/components/ui/navigation-menu.tsx
💤 Files with no reviewable changes (3)
  • apps/marketing/src/app/components/VideoSection/VideoSection.tsx
  • apps/marketing/src/app/components/VideoSection/index.ts
  • apps/marketing/src/app/page.tsx

Comment thread apps/marketing/src/app/pricing/components/PricingFAQ/PricingFAQ.tsx
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.

4 participants