Skip to content

feat(dashboards): show winner crown, cheeky hog and group titles on tiles - #114811

Open
pauldambra wants to merge 9 commits into
posthog-self-driving/featdashboards-add-tile-groups-and-bd7045from
posthog/tile-groups-frontend
Open

pauldambra wants to merge 9 commits into
posthog-self-driving/featdashboards-add-tile-groups-and-bd7045from
posthog/tile-groups-frontend

Conversation

@pauldambra

@pauldambra pauldambra commented Oct 9, 2026 •

Copy link
Copy Markdown
Member

Problem

People viewing a dashboard cannot see which tile in a group won, or what the group is called, even after an agent has set both. The fields exist but nothing draws them.

This is layer 2 of 2. It needs #114783 (the API and MCP layer) below it. Closes #114760.

Changes

  • A winner tile now shows a solid crown in its top left corner.
  • A cheeky-hog tile shows a hedgehog peeking over the tile's top edge on hover.
  • Each group shows its title above its first tile. Compaction and the narrow single column can reorder tiles, so the title follows the tile that renders first at the current width.
  • Decorations no longer clip in view mode. View mode sets content-visibility: auto, which cuts off anything outside the tile box. A tile with a crown or a group title opts out. A cheeky-hog tile opts out only while hovered. Other tiles keep it. This part is the riskiest to review.
  • The hog slides back down when the pointer leaves, not just up when it arrives.
  • A dashboard with a decorated tile gets 2.5rem of room above the grid, so a first-row crown, title or hog is not covered by the sticky filter bar. Dashboards without decorations keep the same layout.
  • Group keys such as __proto__ get no title. They used to crash the render.
  • A new story renders the crown, the group title and the hog in view mode, so the visual review now covers them. It adds two new snapshots to approve. The hover story applies the hover rule by hand.
  • Mechanical: the DashboardTile type and the helper tests.

There is no before. Layer 1 stores the fields and nothing draws them.

Light Dark
Crown and group title Solid crown and group title, light theme Solid crown and group title, dark theme
Hog on hover Crown and title at 520px
Hedgehog peeking over the tile edge Crown and title at 520px wide

How did you test this code?

Test rationale: The helper tests catch __proto__ and constructor keys returning a title, a hidden widget taking a group's title, and the title landing on a tile that compaction moved. The old helper failed all three.

  • dashboardTileGroups.test.ts: nine cases, parameterized.
  • The screenshots come from Storybook in a headless browser with fake data and normal view mode.
  • Not checked in a browser: a group whose first tile is a hidden widget, and compaction with stored vertical gaps. The unit tests cover both.
  • Not run: the visual review. Two customer analytics stories changed in an earlier run for a reason unrelated to tiles, a story that renders in the wrong mode.

Release status

  • No feature flag controls this change

Docs update

None.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Sonnet 5 (main loop and runners) and Opus 5.5 (one review and one frontend fix runner)


Created with PostHog Desktop

@pauldambra pauldambra self-assigned this Oct 9, 2026
@posthog

posthog Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

🦔 PostHog Review (standard) reviewed this pull request

Nothing worth raising.

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane

This PR is assigned to the backend Python lane. It runs backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Complexity (TypeScript) — 3 functions above the limit (max 30)

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

Function Location Complexity Limit
DashboardItems frontend/src/scenes/dashboard/DashboardItems.tsx:84 30 10
<anonymous> frontend/src/scenes/dashboard/DashboardItems.tsx:527 21 10
getGroupTitlesByTileId products/dashboards/frontend/dashboardTileGroups.ts:36 11 10
✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

✅ Duplication (TypeScript) — clean

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

⚠️ Bundle size — 🔺 +218 B (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 75.57 MiB · 🔺 +218 B (+0.0%)

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.67 MiB · 23 files 🔺 +1.9 KiB (+0.1%) █████████░ 90.7% of 1.84 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
3.83 MiB · 675 files 🔺 +1.9 KiB (+0.0%) ██████████ 95.0% of 4.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.79 MiB · 2,463 files 🔺 +1.9 KiB (+0.0%) █████████░ 93.4% of 8.34 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
9.95 MiB · 3,534 files 🔺 +4.4 KiB (+0.0%) █████████░ 91.1% of 10.92 MiB
today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
7.81 MiB · 2,473 files 🔺 +1.9 KiB (+0.0%) █████████░ 90.9% of 8.58 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
9.55 MiB · 3,373 files 🔺 +1.9 KiB (+0.0%) █████████░ 90.9% of 10.51 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
12.36 MiB · 4,204 files 🔺 +1.9 KiB (+0.0%) ████████░░ 78.6% of 15.72 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/dashboards/frontend/widgets/previews/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 zod/v4/locales/de.js stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/today/TodayReportPage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/activity/explore/EventsScene.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/index.tsx
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
839 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
317.7 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
220.8 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
101.6 KiB src/products.tsx
99.6 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
40.7 KiB src/lib/utils/eventUsageLogic.ts
38.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
33.9 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
29.0 KiB ../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
317.7 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
280.8 KiB src/taxonomy/core-filter-definitions-by-group.json
220.8 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
112.1 KiB ../packages/quill/packages/quill/dist/index.js
101.6 KiB src/products.tsx
99.6 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
317.7 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
280.8 KiB src/taxonomy/core-filter-definitions-by-group.json
220.8 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.9 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
112.1 KiB ../packages/quill/packages/quill/dist/index.js
101.6 KiB src/products.tsx
99.6 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
Size File
317.7 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
280.8 KiB src/taxonomy/core-filter-definitions-by-group.json
220.8 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
112.1 KiB ../packages/quill/packages/quill/dist/index.js
101.6 KiB src/products.tsx
99.6 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
317.7 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
280.8 KiB src/taxonomy/core-filter-definitions-by-group.json
220.8 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.9 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
112.1 KiB ../packages/quill/packages/quill/dist/index.js
101.6 KiB src/products.tsx
99.6 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
317.7 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
316.0 KiB ../node_modules/.pnpm/posthog-js@1.438.4_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
280.8 KiB src/taxonomy/core-filter-definitions-by-group.json
220.8 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.9 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
112.1 KiB ../packages/quill/packages/quill/dist/index.js
101.6 KiB src/products.tsx
99.6 KiB src/lib/api.ts

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.24 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.24 MiB · 19 files no change ████░░░░░░ 39.2% of 5.72 MiB
Deferred (lazy) 2.19 MiB · 44 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
865.8 KiB dist/toolbar/toolbar-app-URUTSZGS.css
671.1 KiB dist/toolbar/chunk-chunk-K7XHYQIA.js
259.5 KiB dist/toolbar/chunk-chunk-SAQX6YBT.js
138.9 KiB dist/toolbar/chunk-chunk-YVBTI34S.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
75.2 KiB dist/toolbar/toolbar-app-H5VXFD42.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-3EMQFTD2.js
21.7 KiB dist/toolbar/chunk-chunk-K2ZOYETV.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +85.6 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1007.80 MiB · 🔺 +85.6 KiB (+0.0%)

⚠️ Playwright — 2 flaky

🎭 Playwright report · View test results →

⚠️ 2 flaky tests:

  • Logout in another tab results in logout in the current tab too (chromium)
  • Creating a SQL insight with a variable and overriding it on a dashboard (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!

✅ Hogbox preview — ready, open the preview

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds: a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit ad4c100 · box box-3de208d3f98f · ready in 1116s (push → usable) · build log · rebuilds on every push, torn down on close

@posthog

posthog Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

PostHog Review alpha 🦔 If you find any issues helpful - please reply "valid", "invalid", etc., for evaluation purposes 🙏

Comment thread frontend/src/scenes/dashboard/DashboardItems.tsx Outdated
Comment thread frontend/src/scenes/dashboard/DashboardItems.scss Outdated
@pauldambra
pauldambra force-pushed the posthog/tile-groups-frontend branch from 48bedc9 to 559ca63 Compare October 9, 2026 22:15
@trunk-io

trunk-io Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

Failed Test Failure Summary Logs
Scenes-Other/Startup program NeedsBillingDetails smoke-test The test timed out while waiting for loading indicators or spinners to disappear. Logs ↗︎
Scenes-App/Project Homepage ProjectHomepage smoke-test The test timed out while waiting for loading indicators or spinners to disappear. Logs ↗︎
Scenes-App/OAuth/Authorize DefaultScopes smoke-test The test timed out while waiting for loading indicators or spinners to disappear. Logs ↗︎
Dashboards › Creating a SQL insight with a variable and overriding it on a dashboard The test failed because the page URL did not match the expected URL. Logs ↗︎

... and 2 more

View Full Report ↗︎ ⋅ Docs

pauldambra commented Oct 9, 2026 •

Copy link
Copy Markdown
Member Author

Note

🤖 Automated comment by QA Swarm — not written by a human

Review by one cheap first-pass reviewer (sonnet). It found nothing that needed a stronger reviewer, so none was called.

Verdict: ✅ APPROVE (round 3 @ 9f1af45)

No defects above LOW. The one LOW is fixed in this round.

Key findings

  • 🟢 LOW, fixed The hog tile's transition used var() and allow-discrete. A browser that does not know allow-discrete drops the whole line, so a hog tile lost its easing when the layout moved. The line now sits in an @supports block. I checked it in Chromium both ways: with support the hog stays visible about 200ms after the pointer leaves, and without support the tile keeps its normal transitions and the hog hides at once.
  • ⚪ NIT, left as is The 2.5rem space above the grid shows when any decoration exists, even one on a lower row. That is the design.
  • ⚪ NIT, left as is A tile of an unknown type with a badge would add the space and draw nothing. No such tile exists today.

Checked and clean

The spacing, drag, resize and settling rules still win over the hog rule, because they come later with the same or higher specificity. The custom properties always resolve, because the grid items sit inside the layout that defines them. hasTileDecorations follows the same widget rule as the render, and the test rows cover a title, a badge, a shown widget, a hidden widget and nothing. Dashboards with no decorations keep the same transitions as before.

Reviewer summaries

Reviewer Assessment
🧭 router Danger LOW, confidence HIGH. Reviewed only what changed since round 2. Delegated nothing.
Previous rounds (2)

round 1 @ 1547034: APPROVE, LOW and NIT items only.

round 2 @ dd1c4d0: APPROVE. The crown is a solid shape and a story renders the decorations. The first-row and hog items found there were fixed after it.


Automated by QA Swarm — not a human review

@pauldambra
pauldambra force-pushed the posthog/tile-groups-frontend branch from 1547034 to 6235cd6 Compare October 9, 2026 22:41
Comment thread frontend/src/scenes/dashboard/DashboardItems.tsx
@pauldambra
pauldambra force-pushed the posthog/tile-groups-frontend branch from dd1c4d0 to 54ad0c7 Compare October 9, 2026 23:00
@pauldambra
pauldambra removed this pull request from stack #114812 October 10, 2026 10:10
@pauldambra
pauldambra changed the base branch from posthog/tile-groups-backend to posthog-self-driving/featdashboards-add-tile-groups-and-bd7045 October 10, 2026 10:10
@pauldambra
pauldambra force-pushed the posthog/tile-groups-frontend branch from f69ee4c to 9fa220f Compare October 10, 2026 10:10
@pauldambra
pauldambra added this pull request to stack #114876 October 10, 2026 10:11
@pauldambra
pauldambra force-pushed the posthog/tile-groups-frontend branch from 8cac600 to eef4d2a Compare October 10, 2026 10:49
@pauldambra
pauldambra marked this pull request as ready for review October 10, 2026 10:49
@pauldambra pauldambra added the stamphog Request AI approval (no full review) label Oct 10, 2026 — with PostHog
@parameterai

parameterai Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Risk: No findings

The delta since the last review adds two string literals (data_warehouse_view, endpoint) to the SearchableEntity TypeScript union in frontend/src/types.ts (mirrored into generated api.schemas.ts). It is a type widening only, with no runtime, auth, or data-path effect; all previously reviewed dashboard decoration code is unchanged since 9f1af45.

Sentinel reviewed ad4c100 · Review settings

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-10T10:54:38.941261Z eef4d2a Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team October 10, 2026 10:50

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: eef4d2a09c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread frontend/src/scenes/dashboard/DashboardItems.tsx Outdated
stamphog[bot]

This comment was marked as outdated.

@pauldambra pauldambra added the stamphog Request AI approval (no full review) label Oct 10, 2026 — with PostHog
@stamphog
stamphog Bot dismissed their stale review October 10, 2026 11:24

A new stamphog review started for this PR — the fresh verdict replaces this approval.

stamphog[bot]

This comment was marked as outdated.

@posthog

posthog Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

🕓 This approval covered an earlier revision. There are new visual changes to review in the newer comment below.

✅ Visual changes approved by @pauldambra — baseline updated in 0f9464b.

View this run in PostHog

4 new.

Install the Visual Review Chrome extension to see visual review results at the top of your pull requests.

@stamphog
stamphog Bot dismissed their stale review October 10, 2026 14:23

A new stamphog review started for this PR — the fresh verdict replaces this approval.

stamphog[bot]

This comment was marked as outdated.

@stamphog
stamphog Bot dismissed their stale review October 10, 2026 15:23

A new stamphog review started for this PR — the fresh verdict replaces this approval.

@pauldambra pauldambra removed the stamphog Request AI approval (no full review) label Oct 10, 2026
@pauldambra pauldambra added the stamphog Request AI approval (no full review) label Oct 10, 2026 — with PostHog
stamphog[bot]

This comment was marked as outdated.

@posthog

posthog Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

✅ Visual changes approved by @pauldambra — baseline updated in 93e6b6e.

View this run in PostHog

1 changed.

Changed

Snapshot Before After
products-dashboards-tiles-tile-decorations--winner-with-group-title--light before after

Install the Visual Review Chrome extension to see visual review results at the top of your pull requests.

@stamphog
stamphog Bot dismissed their stale review October 10, 2026 18:24

A new stamphog review started for this PR — the fresh verdict replaces this approval.

@github-actions
github-actions Bot requested a deployment to preview-pr-114811 October 10, 2026 18:24 In progress
stamphog[bot]

This comment was marked as outdated.

pauldambra and others added 9 commits October 10, 2026 19:29
…iles

A winner tile gets a solid crown in its top left corner.
A cheeky-hog tile shows a hedgehog peeking out on hover.
Each group shows its title above its top left tile.
Decorations are no longer clipped in view mode, and the title picks the tile after layout compaction.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
No story rendered the crown, group title or hog, so the visual review could not catch the view-mode clipping bug.
Both stories render the real dashboard scene in view mode with fake data.
The hover story applies the hover rule by hand, because a play function cannot move the pointer.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
…it hog paint to hover

The group title now picks its tile from the layout of the breakpoint the grid renders, so a narrow single column puts the title on its first tile.
A cheeky-hog tile only skips off-screen rendering while hovered, so large dashboards keep the saving.
The decoration selectors use the direct-child form.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
…lear of the filter bar

The hog tile keeps its paint window open for the length of the slide down, so the hog slides out when the pointer leaves.
A dashboard with any decorated tile gets room above the grid, so a first-row crown, title or hog is not covered by the sticky filter bar.
Dashboards without decorations keep the same layout.
The hover story puts the hog on a first-row tile.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
The shared tile transition is now a CSS custom property, because stylelint and the formatter disagree about a multi-line Sass variable.
The hover rule now comes before the reduced motion rule, as the property order rule requires.
Behavior is unchanged: the hog tile keeps its paint window for the slide duration after the pointer leaves.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
A badge on a widget tile that is not shown, as in the export view, still added the 2.5rem strip above the grid.
The check now lives in a small function that uses the same widget rule as the render.
The crown glyph moves inline, so the decorations file holds one component.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
4 updated
Run: 73eb1ce0-e21b-4091-9745-8d15b65d7a11

Co-authored-by: pauldambra <984817+pauldambra@users.noreply.github.com>
…te transitions

The hog tile transition reads a custom property and uses allow-discrete.
A browser that does not know allow-discrete drops the whole declaration, so a hog tile lost its layout easing.
The declaration now sits in a supports block. Older browsers keep the normal tile transitions and the hog hides at once.

Generated-By: PostHog Desktop
Task-Id: a0588627-3b8c-4fc5-b331-716af1994715
1 updated
Run: ef9d8386-cb19-4715-8673-23894cf5e274

Co-authored-by: pauldambra <984817+pauldambra@users.noreply.github.com>
@pauldambra
pauldambra force-pushed the posthog/tile-groups-frontend branch from 93e6b6e to ad4c100 Compare October 10, 2026 18:29
@stamphog
stamphog Bot dismissed their stale review October 10, 2026 18:29

A new stamphog review started for this PR — the fresh verdict replaces this approval.

@stamphog stamphog 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.

Approved.

Contained frontend presentation changes with helper tests and no open substantive review concerns; no risky backend contracts or persistence behavior change. The existing memo comparator ignores decoration children, which may leave titles stale after updates, but this is a limited display issue rather than a policy showstopper.

  • Author wrote 0% of the modified lines and has 91 merged PRs in these paths (familiarity MODERATE).
Gate mechanics and policy version
Gate Result
prerequisites ✓ all clear
deny-list ✓ no deny categories matched
size ✓ 397L, 8F substantive, 555L/9F incl. docs/generated/snapshots — within ceiling
tier ✓ T1-agent / T1d-complex (555L, 9F, two-areas, feat)
stamphog 2.4.1 .stamphog/policy.yml @ ad4c100 · reviewed head ad4c100

@trunk-io

trunk-io Bot commented Oct 10, 2026

Copy link
Copy Markdown

Stacked PR 114881 failed testing in the merge queue. Please investigate the failure and re-submit the stack.

This branch was successfully deployed

1 active deployment
preview-pr-114811 — ad4c1003 Deployed Oct 10, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Dashboard tile groups and winner / cheeky-hog badges

1 participant