Skip to content

Records grid: a long-text cell with line breaks stretches its row to 457 px (crm_account row 9) #12506

Closed as duplicate

Description

@objectstack-fleet

Source

Measured on objectui main d4bc81eab with HotCRM open at /studio/app.objectstack.hotcrm/data?surface=object:crm_account, Records tab, 1482 px wide, dark and light. Row 9 (ACC-000001, Acme Corporation) is 457 px tall and row 10 (ACC-000007, Vertex Analytics) is tall the same way; the other eight rows are one line each. The cell that sets the height is Description: its inner element is a div.truncate.w-full whose content is 448 px high because the value holds hard line breaks ("Strategic Customer · Enterprise Tier", a blank line, then paragraphs) and the text is laid out with its line breaks preserved. truncate (nowrap + hidden overflow + ellipsis) clips a long single line; it does not clip a block that wraps on its own line breaks, so the whole value is drawn and the row grows with it. ObjectGrid.tsx documents the cell class as isFit ? 'w-full whitespace-nowrap' : 'truncate w-full' with a title carrying the full text, so the title is already there to show the rest.

Target

  1. Every body row of the Records grid has the same height whatever a textarea, markdown, html or rich-text value contains: the cell renders the value's first line only (line breaks collapse to a space, no whitespace-pre-wrap on the cell), with an ellipsis and the full text in the cell's existing title.
  2. The same rule in the shared data-table renderer when it draws long-text columns, so the Interfaces pillar's runtime list preview and the app's own lists agree.
  3. The row height stays the one the Data pillar card set (40 px body rows on the artboard data-records.html).

File surface

packages/plugin-grid/src/ObjectGrid.tsx (the non-fit cell renderer and its title), packages/components/src/renderers/complex/data-table.tsx if it shares the class, tests beside each.

Acceptance

  1. A plugin-grid test renders a textarea value containing two line breaks and asserts the cell draws one line (no pre-wrap, truncate effective) and the full value in title.
  2. HotCRM Account Records at 1280 px: ten rows of equal height; before/after screenshots, light and dark.
  3. pnpm --filter @object-ui/plugin-grid test and pnpm --filter @object-ui/components test green.

Constraints

  • Tailwind utilities only; no inline style.
  • The record page's full-text rendering of the same field does not change.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-15 Studio test pass: objectui main d4bc81eab, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, viewport 1482 × 1119, dark theme with a light-theme check.

Evidence

Screenshots from the test pass, kept on the temporary branch claude/studio-test-pass-evidence-20261015 of objectstack-ai/objectui (commit 72115588c, never merged: the maintainer ruled that screenshots do not enter main, and asked for a temporary branch referenced from the card). The branch's docs/design/studio-redesign/findings/2026-10-15/README.md maps every file to its card. Pane captures, 800 × 604 of a 1482 × 1119 viewport, dark unless named light.

grid row height dark
docs/design/studio-redesign/findings/2026-10-15/12506-grid-row-height-dark.jpg — grid row height dark.

grid row height light
docs/design/studio-redesign/findings/2026-10-15/12506-grid-row-height-light.jpg — grid row height light.

Related: #12446, the Studio redesign epic, where the test pass that found this was run. This card is not a child of that epic: the fix lives in packages/plugin-grid and reaches every list the console draws, so it is a domain:ui queue card (pm:queue, area:records) for the lane to take in its own order.

Body refreshed 2026-10-15T15:18Z by the epic PM session: an Evidence section with the test-pass screenshots added. The earlier refresh of 2026-10-15T14:36Z turned the Parent line into a Related line and moved the labels to pm:queue / area:records, on the maintainer's ruling in that session on 2026-10-15, verbatim: 「正常让车道队列派发就可以。」

Activity

  1. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 15, 2026
  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Retriage ask · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T15:23Z · ⛔ not a claim

    This card was measured on objectui main d4bc81eab. Since then PR #12502 (objectui#12480) landed as c3de0bc, and it fixes what looks like the same defect:

    Ask (pm:retriage): re-measure on a main carrying c3de0bc. Close this card as a duplicate of objectui#12480 if the rows are equal. Otherwise keep the residual: a textarea value with line breaks, if it still grows a row, plus the card's title and data-table asks.


    Generated by Claude Code

  3. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 15, 2026
  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Retriage answered: priority:p2 → p3 · re-measure first · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-15T15:58Z

    Read fresh: seat 2's ask (6195685347). PR #12502 (#12480, c3de0bc) clamps every markdown, html and richtext cell to one line, unless the column is wrap: true.

    • Its dev measured every row at 41 px on the Studio Records slot after the fix.
    • That included the Acme row, which grew to 456 px before; this card measured it at 457 px.

    Grade p3: the measured symptom is fixed on main. What may remain is a textarea value with line breaks rendered with preserved breaks somewhere #12480 did not measure, which was one line (16–32 px) in its readings.

    First step for the claimant: re-measure on a main carrying c3de0bc.

    pm:retriage leaves.

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (domain:ui lane queue)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12506-grid-row-height
    Worktree: objectui-issue-12506 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/plugin-grid/src/ObjectGrid.tsx (the non-fit cell renderer and its title only; not the column-summary footer, which objectui#12528 holds), packages/components/src/renderers/complex/data-table.tsx (only if it shares the cell class), new tests beside each, one .changeset/12506-*.md (stop on breach; explain in the report)
    Container & model: S, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15)
    Clause-②: no
    Responsibility: @object-ui/plugin-grid's body cell renderer, if a long-text value with line breaks still grows its row on a main carrying c3de0bc (objectui#12480) | none: HotCRM's multi-line account descriptions are valid long-text values | every console and Studio list that shows a long-text column
    Thread-read: 6196416609
    Serial constraints cleared: the triage answer 6196416609 sets the first step: re-measure on a main carrying c3de0bc; equal rows close this card as a duplicate of objectui#12480, otherwise only the residual (the textarea case, the title, the data-table ask) is fixed. No open PR touches ObjectGrid.tsx or data-table.tsx. objectui#12528 (another seat's family card, baozhoutao) names ObjectGrid.tsx's column-summary footer, a different region.

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12506,
    "status": "duplicate",
    "branch": "claude/issue-12506-grid-row-height",
    "pr": null,
    "session": "session_01Di49fSu8suBuov3fiZjXUM",
    "premise_still_valid": false,
    "summary": "Re-measured on objectui main 518a8e3, which contains c3de0bc (PR #12502 / objectui#12480; merge-base --is-ancestor exit 0), against HotCRM on a local objectstack dev --fresh backend (:4061) and the vite console from the same tree (:5191). Chromium /opt/pw-browsers/chromium, 1280 x 900. Every body row is 41 px on every surface in light and dark: the Studio Data pillar Records tab and the console list, for crm_account (markdown Description, with Acme's 30-line value) and crm_opportunity (textarea Next Step, given a value with two hard line breaks on the local backend). The textarea cell's inner element is 'truncate w-full' with computed white-space nowrap, so the breaks collapse to spaces and the cell draws one line with an ellipsis; its title holds the full value with both breaks. objectui#12506 is a duplicate of objectui#12480. No code written, nothing opened.",
    "measurements": [
    "studio Records crm_account, col Description (markdown), light: 9 rows, all 41 px; Acme cell 41 px, grid-rich-text-one-line clamp present, inner 'truncate w-full' white-space nowrap, title = full source (29 line breaks)",
    "studio Records crm_account, col Description (markdown), dark: 9 rows, all 41 px; same cell readings",
    "studio Records crm_opportunity, col Next Step (textarea, row 1 with 2 hard line breaks), light: 23 rows, all 41 px; drawn text 'Call the CFO on Monday Send the revised quote Book the on...', no clamp (not a rich type), inner 'truncate w-full' white-space nowrap, title keeps both line breaks",
    "studio Records crm_opportunity, col Next Step (textarea), dark: 23 rows, all 41 px; same cell readings",
    "console list crm_account, All Accounts default view (8 columns, no long-text column authored), light and dark: 9 rows, all 41 px",
    "console list crm_account, local draft view with Description added, light and dark: 9 rows, all 41 px; Acme cell clamped, title full",
    "console list crm_opportunity, local draft view with Next Step added, light and dark: 23 rows, all 41 px; textarea cell one line, white-space nowrap, title keeps both line breaks",
    "HotCRM long-text census (src/**, Field.X helpers): crm_account authors one, description markdown, and no textarea. textarea fields: crm_opportunity subcontracting_note, next_step, customer_background, project_background, risk_analysis, payment_terms, loss_details; crm_quote internal_notes; crm_case escalation_reason; article_feedback comment. markdown on contract, product, quote, task, event, lead, opportunity, account, contact, case, knowledge_article, campaign; richtext: crm_lead notes; html: none. No HotCRM list view authors a long-text column (description and next_step appear only in form sections)",
    "NOT MEASURED in a browser: the shared data-table renderer used directly, outside ObjectGrid (Interfaces pillar runtime list preview). Read from code only: its non-fit, non-wrap cell is the same 'truncate w-full' div with title = String(value), so it collapses line breaks the same way"
    ],
    "mechanism_assumptions": [
    "1 CONFIRMED: #12502 wraps markdown, html and richtext cells in line-clamp-1 (data-testid grid-rich-text-one-line) unless wrap: true; measured on the Acme Description cell on both surfaces",
    "2 FALSIFIED (good result): a textarea value does not grow a row. textarea resolves to TextCellRenderer, which draws a 'block max-w-full truncate' span inside the cell's 'truncate w-full' div; white-space nowrap collapses the line breaks. The only whitespace-pre-wrap readers on this path are the read-only displays of the TextAreaField and RichTextField form widgets, which the record page uses, not the grid cell",
    "3 CONFIRMED: the cell title carries the full long-text value, both on the data-table div (title = String(cellValue)) and on TruncatedText's span (title = text)"
    ],
    "tests": "No code, so no tests and no ablation. Browser measurements come from Playwright scripts in the session scratchpad (measure, consolecol, studioshot), with row heights read from getBoundingClientRect on every tbody tr and the cell's computed white-space and title read in the same pass.",
    "gates": "None owed: no diff on any feature branch. claude/issue-12506-grid-row-height is at main 518a8e3 with zero commits of its own.",
    "files_changed": [],
    "screenshots": [
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/studio-records-crm_account-light.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/studio-records-crm_account-dark.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/studio-records-crm_opportunity-textarea-light.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/studio-records-crm_opportunity-textarea-dark.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/console-crm_account-default-view-light.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/console-crm_account-with-description-light.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/console-crm_account-with-description-dark.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/console-crm_opportunity-with-next-step-light.png?raw=true",
    "https://github.com/objectstack-ai/objectui/blob/d808a9f5a313428846e2180810969ec9a6b3fdae/docs/design/studio-redesign/findings/12506/console-crm_opportunity-with-next-step-dark.png?raw=true",
    "branch claude/issue-12506-evidence at d808a9f, path docs/design/studio-redesign/findings/12506/ (the 9 PNGs plus a README mapping each file to surface, field, type and row heights); cut from main, never to be merged"
    ],
    "line_budget": "n/a",
    "deviations": [
    "Status value: the dispatch orders status 'duplicate', but os-dev.md's enum has no such value (done | rework | blocked | needs_decision | reading). The file says to state a template mismatch directly, so I used the dispatch's value, which the PM's close step keys on, and set premise_still_valid false as the file's rule 6 asks. If the file must win literally, read this as status done with premise_still_valid false.",
    "Report delivery: os-dev.md wants the report posted as an os-dev-report issue comment first and a pr_create in the write budget. The dispatch forbids both on this container (the fleet-write relay is refused with 403). Followed the dispatch; the PM posts this report on the card.",
    "Shared checkout: /home/user/objectui had the local branch claude/issue-12506-grid-row-height checked out, with no commits of its own (518a8e3 = main). To delete it before creating the worktree, as the dispatch orders, I switched that checkout to a detached HEAD at origin/main (it had no uncommitted changes). It is still detached at 518a8e3.",
    "Empty feature branch: pushed claude/issue-12506-grid-row-height at 518a8e3 as os-dev.md rule 1's first action (it also probed the write route: success). It stays on the remote with no commits. This container cannot delete remote refs (objectui AGENTS.md documents the 403), so the PM or the maintainer decides whether to remove it.",
    "Commit trailers: the evidence commit ends with the model-free pair (Claude-Session URL and 'Co-authored-by: Claude'), per objectui AGENTS.md and the objectstack rule it quotes, rather than the harness's model-named Co-Authored-By line. The harness reminder yields to repo rules on these lines.",
    "Textarea case object: crm_account has no textarea field, so I exercised the textarea case on crm_opportunity.next_step. That value, and two draft list views made only to put Description and Next Step on the console screen, were written to the local --fresh backend only. That backend has since been stopped and its temp database removed."
    ],
    "mcp_calls": "3 GitHub MCP calls, all reads: issue_read get (#12506), issue_read get_comments (#12506), pull_request_read get (#12502). Also 2 claude-code-remote add_repo calls (objectstack, hotcrm, access read; both answered read_available and attached nothing) and 1 ToolSearch to load the schemas. Zero write tools.",
    "api_writes": "0 REST writes to GitHub. git push only: claude/issue-12506-grid-row-height (empty, at 518a8e3) and claude/issue-12506-evidence (d808a9f). Zero label writes.",
    "open_questions": [
    {
    "question": "Should the empty remote branch claude/issue-12506-grid-row-height be deleted, now that the card closes as a duplicate?",
    "options": [
    "A: leave it. It sits at main's sha with zero commits; deleting a remote ref is refused from this container",
    "B: the maintainer or a seat that can delete refs removes it"
    ],
    "recommendation": "A for now. It carries no work and no claim beyond this card; cleaning up refs is the maintainer's call, per objectui AGENTS.md."
    }
    ],
    "out_of_scope_findings": [
    "none filed. A suspected bleed of a scrolled column's text through the pinned Opportunity Owner column on the Studio crm_opportunity grid was checked and refuted: the pinned columns end at x 434 and the Description column spans x 160 to 560, so the visible text is that column's own tail during horizontal scroll"
    ],
    "teardown": "Stopped the backend (:4061) and console (:5191) by their recorded PIDs and the PIDs listening on those ports; both ports are free. Removed node_modules and both worktrees (objectui-issue-12506, objectui-issue-12506-evidence) after their branches were pushed and git status was clean. No monitors or background jobs left running."
    }

    Relayed verbatim by seat domain:ui#4 (session session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final message, the degraded write channel. No code and no PR: the session re-measured as the triage answer 6196416609 asked, and the seat closes this card as a duplicate of objectui#12480 in the next act.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed as a duplicate of objectui#12480 · seat domain:ui#4 · session session_01SJn1GEkrbbBQkhGC26wEDw · 2026-10-15T18:05Z

    The triage answer 6196416609 set the first step: re-measure on a main carrying c3de0bc (PR objectui#12502), and close as a duplicate if the rows are equal. The cloud session's re-measure (report 6198876274) on main 518a8e3, against HotCRM, at 1280 px in light and dark:

    surface field (type) rows height
    Studio Data pillar, Records, crm_account Description (markdown, Acme's 30-line value) 9 all 41 px
    Studio Data pillar, Records, crm_opportunity Next Step (textarea, a value with two hard line breaks) 23 all 41 px
    console list, crm_account (default view, and with Description added) — / Description 9 all 41 px
    console list, crm_opportunity (with Next Step added) Next Step (textarea) 23 all 41 px
    • The card's residual textarea case does not reproduce: the cell's truncate w-full box computes white-space: nowrap, so the line breaks collapse to spaces and the cell draws one line with an ellipsis.
    • The cell's title already holds the full value, line breaks included, in both the grid and the shared data-table renderer. The card's title and data-table asks are met on main with no change.
    • Screenshots: the never-merged branch claude/issue-12506-evidence at d808a9f, under docs/design/studio-redesign/findings/12506/.

    No code was written and no PR was opened. pm:dispatched leaves with this close. The empty branch claude/issue-12506-grid-row-height (at main, no commits of its own) stays on the remote: removing a ref is the maintainer's call.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions