Skip to content

feat(quill): add viewportClassName to DialogBody - #70445

Merged
adamleithp merged 1 commit into
masterfrom
posthog-code/quill-dialog-body-viewport-classname
Jul 14, 2026
Merged

feat(quill): add viewportClassName to DialogBody#70445
adamleithp merged 1 commit into
masterfrom
posthog-code/quill-dialog-body-viewport-classname

Conversation

@adamleithp

Copy link
Copy Markdown
Contributor

Problem

There's no clean way to style the scrollable viewport inside a quill dialog (the element with data-slot="scroll-area-viewport"). DialogBody defaults its render to a ScrollArea, and any className you pass lands on the scroll-area root, not the viewport that actually scrolls. The dialog CSS also hard-codes 1rem padding on that viewport, so opting into full-bleed content (an embedded list, a table) meant reaching for the verbose render={<ScrollArea viewportClassName="…" />} escape hatch.

Why: consumers need the dialog's scroll viewport to accept a class (for example to drop the default padding), without dropping down to a custom render.

Changes

  • Add an optional viewportClassName prop to DialogBody, forwarded to the ScrollArea's existing viewportClassName. So <DialogBody viewportClassName="p-0"> now styles the scroll-area-viewport directly.
  • Add a FullBleedBody Storybook story demonstrating the padding override.
  • Note it in the primitives AGENTS.md Dialog section.

Backward compatible: the prop is optional and defaults to undefined, so existing dialogs render identically. It's a pure pass-through (same name ScrollArea already exposes) and is ignored when a custom render is supplied, since those consumers already control the ScrollArea.

How did you test this code?

  • Built @posthog/quill-primitives (vite build, which emits .d.ts), so the new prop and its forwarding typecheck cleanly.
  • Ran tsc --noEmit over the package src: dialog.tsx and dialog.stories.tsx are clean (the only errors are pre-existing and unrelated, in progress.stories.tsx).
  • I (Claude, via PostHog Code) did not open Storybook to eyeball it in this environment. The FullBleedBody story is added so a reviewer (or the visual-regression suite) can confirm the p-0 viewport renders edge to edge while the default stories are unchanged.

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

Component reference updated in-repo (packages/quill/packages/primitives/AGENTS.md). No posthog.com docs affected.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Adam directed this; I (Claude, via PostHog Code) implemented it.

Key decision: the prop lives on DialogBody, not DialogContent. DialogContent only renders its children plus the close button and never owns a scroll area, whereas DialogBody's default render is the ScrollArea that produces the scroll-area-viewport. Named it viewportClassName to match the prop it forwards to on ScrollArea, keeping the API consistent. Both the target and the name were confirmed with the requester.

Also considered doing nothing, since <DialogBody render={<ScrollArea viewportClassName="…" />}> already works today. Chose to add the shorthand because the render override is verbose for what's a common need. No repo skills were required for this change.


Created with PostHog Code

Forwards to the ScrollArea's existing viewportClassName so consumers can style the dialog's scroll-area-viewport (for example viewportClassName="p-0" to drop the default body padding for full-bleed content) without a custom render override.

Generated-By: PostHog Code
Task-Id: e599f64a-42ae-46b2-a1d0-e77b10698c09
@adamleithp adamleithp self-assigned this Jul 13, 2026
@github-actions

github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Bundle size — no change

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

Total: 64.34 MiB · no change

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.21 MiB · 22 files 🔺 +75 B (+0.0%) ███░░░░░░░ 28.1% of 4.29 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.10 MiB · 2,972 files no change █████████░ 87.5% of 9.25 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.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/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
668 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
278.6 KiB ../node_modules/.pnpm/posthog-js@1.399.2/node_modules/posthog-js/dist/rrweb.js
267.7 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
234.9 KiB src/taxonomy/core-filter-definitions-by-group.json
221.5 KiB ../node_modules/.pnpm/posthog-js@1.399.2/node_modules/posthog-js/dist/module.js
164.0 KiB src/queries/validators.js
154.3 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
105.9 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

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

⚠️ Dist folder size — 🔺 +1.1 KiB (+0.0%)

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

Total: 1279.92 MiB · 🔺 +1.1 KiB (+0.0%)

@adamleithp
adamleithp marked this pull request as ready for review July 13, 2026 13:21
@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team July 13, 2026 13:22
@adamleithp adamleithp added the stamphog Request AI approval (no full review) label Jul 13, 2026
@greptile-apps

greptile-apps Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "feat(quill): add viewportClassName to Di..." | Re-trigger Greptile

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

Small, additive, backward-compatible prop on a design-system component plus docs and a story — no risky territory touched, and the author has STRONG familiarity with this exact code.

  • Author wrote 100% of the modified lines and has 37 merged PRs in these paths (familiarity STRONG).
  • 👍 on the PR from greptile-apps[bot], hex-security-app[bot].
Gate mechanics and policy version
Gate Result
prerequisites all clear
deny-list no deny categories matched
size 47L, 2F substantive, 51L/3F incl. docs/generated/snapshots — within ceiling
tier T1-agent / T1b-small (51L, 3F, single-area, feat)
stamphog 2.0.0b3 .stamphog/policy.yml @ dea402e · reviewed head 4aa686f

@trunk-io

trunk-io Bot commented Jul 13, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

@adamleithp
adamleithp enabled auto-merge (squash) July 14, 2026 11:01
@adamleithp
adamleithp merged commit 87aeb55 into master Jul 14, 2026
395 of 449 checks passed
@adamleithp
adamleithp deleted the posthog-code/quill-dialog-body-viewport-classname branch July 14, 2026 14:05
@deployment-status-posthog

deployment-status-posthog Bot commented Jul 14, 2026

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-07-14 14:32 UTC Run
prod-us ✅ Deployed 2026-07-14 14:45 UTC Run
prod-eu ✅ Deployed 2026-07-14 14:47 UTC Run

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.

2 participants