Project: workspace-doctolib · Branch: HEAD · Mode: · Model: claude-opus-4-7 Stats: 1 user messages, 28 tool calls, tools used: Bash, Read. Conversation Turn 1 — User Review PR #3086 in the doctolib/treatment-plan GitHub repo. Branch: fhir-2223_fix-column-widths-truncation. The PR adds proportional column widths and text truncation to NhrDocumentListTable. Here are the changed files (run gh pr diff 3086 --repo doctolib/treatment-plan to get the actual diff): Key files changed: - packages/tpf-national-health-records-ui/src/types.ts — added width?: string to ColumnConfig - packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.tsx — added fixedLayout={true} to - packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableHead/NhrDocumentListTableHead.tsx — added initialWidth={col.width} to - packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.tsx — wrapped cell content in
- packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.helpers.ts — NEW: getTextContent(node: ReactNode): string helper - Corresponding test files Check for adherence to project guidelines in CLAUDE.md, AGENTS.md, and the UpFront architecture rules. Report any issues that need to be addressed. Turn 1 — Assistant I'll review PR #3086 in the doctolib/treatment-plan repo. Let me start by gathering the actual diff and project guidelines. Tools used: - Bash: pwd && ls Tool results: → result (ok): /Users/USER/workspace/doctolib/worktrees/doctolib/fhir-2223_fix-column-widths-dmp AGENTS.md app babel.config.js backend.dependencies.codeowners.yml bin catalog-info.yaml ci CLAUDE.md ⇒ AGENTS.md CODEOWNERS CODEOWNERS.local component_backlog.yml config config.ru CONTRIBUTING.md db dev-env-setup-wsl dev-tools doc docker docker-compose.linux.yml docker-compose.specmatic.yml docker-compose.yml docs engine_metrics.yml engines fixtures frontend-metrics.config.ts frontend.dependencies.codeowners.yml Ge …(truncated, 674 more chars) I'm in the wrong worktree (this is the doctolib monolith, not treatment-plan). Let me find the correct worktree and gather the PR details. Tools used: - Bash: ls /Users/USER/workspace/doctolib/treatment-plan 2>/dev/null && echo "---" && ls /Users/USER/workspace/doctolib/worktrees/treatment-plan/ 2>/dev/null Tool results: → result (ok): AGENTS.md backend bin build catalog-info.yaml CLAUDE.md CODEOWNERS deployment dist doc docker docker-compose.yml Dockerfile eslint.config.js mise.toml mkdocs.yml module-federation.json mvnw mvnw.cmd node_modules nx.json openspec package-lock.json package.json packages pom.xml postcss.config.js prettier.config.js README.md release-please-config.json renovate.json5 service.datadog.yaml sonar-project.properties src tailwind.config.js target tests tpf.code-workspace tsconfig-base.json tsconfig-desig …(truncated, 392 more chars) Tools used: - Bash: gh pr view 3086 --repo doctolib/treatment-plan --json title,body,headRefName,baseRefName,additions,deletions,files Tool results: → result (ok): {"additions":97,"baseRefName":"main","body":"## Summary\n\n- Adds width?: string to ColumnConfig type so consumers can set proportional column widths\n- Sets fixedLayout={true} on Table to apply table-layout: fixed, preventing auto-resizing based on content\n- Passes initialWidth={col.width} to TableHeadCell so column headers respect the declared widths\n- Wraps each data cell content in
for text truncation with a native tooltip\n- A …(truncated, 2864 more chars) Tools used: - Bash: cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation && git status && echo "---branch---" && git branch --show-current Tools used: - Bash: gh pr diff 3086 --repo doctolib/treatment-plan Tool results: → result (ok): On branch fhir-2223_fix-column-widths-truncation Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: packages/tpf-cda/.storybook/public/mockServiceWorker.js modified: packages/tpf-commons/.storybook/public/mockServiceWorker.js modified: packages/tpf-document-filler-ui …(truncated, 239 more chars) Tool results: → result (ok): diff --git a/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.test.tsx b/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.test.tsx index 4e7eb52c1d..8cfd9e4228 100644 --- a/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.test.tsx +++ b/packages/tpf-national-health-records-ui/src/components/N …(truncated, 10881 more chars) Now let me read the project guidelines and key surrounding files for full context. Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/CLAUDE.md Tool results: → result (ok): 1 # CLAUDE.md 2 3 This is a full-stack healthcare treatment plan application (Kotlin/Spring Boot backend + React/TypeScript frontend) built as a modular monolith using the "hive" pattern with hexagonal architecture. It handles prescription creation, document management, and clinical workflows for the French and German markets. 4 5 Refer to @AGENTS.md for complete project overview, architecture, tech stack, and development guidelines. 6 7 ## Language Rule 8 9 All Claude stack files (C …(truncated, 664 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/AGENTS.md Tool results: → result (ok): 1 # Treatment Plan - Agent & Rules Reference 2 3 ## Workflow 4 5 Mandatory for any prompt that changes code in this repo. The dev workflow runs in three phases — PLAN, IMPLEMENT, REVIEW. Each phase triggers a set of agents working in parallel or sequence; Sage, Forge, and Scout are part of the workflow alongside architects, implementing agents, and reviewers — not a separate quality pipeline. 6 7 - PLAN — qa-planner (Sage) + backend-architect (when backend contract change) 8 - IMP …(truncated, 17033 more chars) Now let me read the changed files in detail and check the upfront-architecture rules and Oxygen design system rules. Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/types.ts Tool results: → result (ok): 1 import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 2 import type { NhrDocument, NhrResultStatus } from '@doctolib/tpf-national-health-records' 3 import type { ReactNode } from 'react' 4 5 export type NhrPatientInfo = { 6 fullName: string 7 gender: 'male' | 'female' | 'other' 8 birthDate: string 9 age: number 10 } 11 12 export type ColumnConfig = { 13 key: string 14 header: string 15 sortable: boolean 16 / Only required when sortable: true. Return …(truncated, 3831 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.tsx Tool results: → result (ok): 1 import { TableBody } from '@doctolib/design-system/TableBody' 2 import { TableCell } from '@doctolib/design-system/TableCell' 3 import { TableRow } from '@doctolib/design-system/TableRow' 4 import { TableSelectCell } from '@doctolib/design-system/TableSelectCell' 5 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 6 7 import type { ActionConfig, ColumnConfig } from '../../../../types' 8 import { ActionButton } from './ActionButton' 9 import { getTextContent } from './Nh …(truncated, 1320 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.helpers.ts Tool results: → result (ok): 1 import { isValidElement } from 'react' 2 import type { ReactNode } from 'react' 3 4 export function getTextContent(node: ReactNode): string { 5 if (typeof node === 'string' || typeof node === 'number') return String(node) 6 if (Array.isArray(node)) return node.map(getTextContent).join('') 7 if (isValidElement(node)) return getTextContent((node.props as { children?: ReactNode }).children) 8 return '' 9 } 10 Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.helpers.test.ts Tool results: → result (ok): 1 import { createElement } from 'react' 2 import { describe, expect, it } from 'vitest' 3 4 import { getTextContent } from './NhrDocumentListTableBody.helpers' 5 6 describe('getTextContent', () => { 7 it('should return a string value unchanged', () => { 8 expect(getTextContent('hello')).toBe('hello') 9 }) 10 11 it('should convert a number to string', () => { 12 expect(getTextContent(42)).toBe('42') 13 }) 14 15 it('should extract text from a React element with a string child …(truncated, 884 more chars) I have a comprehensive picture. Let me look at the remaining changed files and verify a few more things. Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableHead/NhrDocumentListTableHead.tsx Tool results: → result (ok): 1 import { TableHead } from '@doctolib/design-system/TableHead' 2 import { TableHeadCell } from '@doctolib/design-system/TableHeadCell' 3 import { TableHeadSelectAllCell } from '@doctolib/design-system/TableHeadSelectAllCell' 4 import { TableRow } from '@doctolib/design-system/TableRow' 5 6 import type { ColumnConfig } from '../../../../types' 7 8 export type NhrDocumentListTableHeadProps = { 9 columns: ColumnConfig[] 10 } 11 12 export const NhrDocumentListTableHead = ({ columns }: NhrDocum …(truncated, 372 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableHead/NhrDocumentListTableHead.test.tsx Tool results: → result (ok): 1 import { setup } from '@doctolib/test-helpers' 2 import { screen } from '@testing-library/react' 3 import { describe, expect, it } from 'vitest' 4 5 import { mockColumns } from '../../../../test-helpers' 6 import type { ColumnConfig } from '../../../../types' 7 import { NhrDocumentListTableHead } from './NhrDocumentListTableHead' 8 9 describe('NhrDocumentListTableHead', () => { 10 it('should render all column header labels from the column config', () => { 11 setup( 12
13 …(truncated, 1544 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.test.tsx Tool results: → result (ok): 1 import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 2 import { setup } from '@doctolib/test-helpers' 3 import { screen, waitFor } from '@testing-library/react' 4 import { describe, expect, it, vi } from 'vitest' 5 6 import { createMoreActionsAction } from '../../../../business/factories/actions/createMoreActionsAction' 7 import { mockColumns, mockRows } from '../../../../test-helpers' 8 import { nhrDocumentFixtureBuilder } from '../../../../test-helpers/fixtures/nhr …(truncated, 6312 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.tsx Tool results: → result (ok): 1 import { PAGE_SIZE } from '#utils/nhrPaginationHelpers' 2 import { Pagination } from '@doctolib/design-system/Pagination' 3 import { Table } from '@doctolib/design-system/Table' 4 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 5 6 import type { ActionConfig, ColumnConfig } from '../../../types' 7 import { NhrDocumentListTableBody } from './NhrDocumentListTableBody/NhrDocumentListTableBody' 8 import { NhrDocumentListTableHead } from './NhrDocumentListTableHead/NhrDocu …(truncated, 993 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.test.tsx Tool results: → result (ok): 1 import { setup } from '@doctolib/test-helpers' 2 import { screen } from '@testing-library/react' 3 import { describe, expect, it } from 'vitest' 4 5 import { mockColumns, mockRows } from '../../../test-helpers' 6 import { NhrDocumentListTable } from './NhrDocumentListTable' 7 8 const defaultPaginationProps = { 9 currentPage: 1, 10 total: 0, 11 onPageChange: () => {}, 12 } 13 14 describe('NhrDocumentListTable', () => { 15 it('should render a table', () => { 16 setup(/dev/null | head -10 && echo "---" & …(truncated, 258 more chars) Tool results: → result (ok): /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/node_modules/@doctolib/design-system/dist/table/TableRow.d.ts /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/node_modules/@doctolib/design-system/dist/table/TableHeadSelectAllCell.d.ts /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/node_modules/@doctolib/design-system/dist/table/TableBody.d.ts /Users/USER/wo …(truncated, 1269 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/node_modules/@doctolib/design-system/dist/table/Table.d.ts Tool results: → result (ok): 1 import './Table.scss'; 2 import type { ComponentPropsWithoutRef, ReactNode } from 'react'; 3 import type { SkeletonLoaderProps } from './TableSkeletonLoader.js'; 4 type Props = { 5 fixedLayout?: boolean | undefined; 6 className?: string | undefined; 7 children?: ReactNode; 8 loading?: boolean | undefined; 9 skeletonLoaderProps?: SkeletonLoaderProps | undefined; 10 size?: 'xsmall' | 'small' | 'medium' | undefined; 11 } & ComponentPropsWithoutRef<'table'>; 12 / 13 Ta …(truncated, 311 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/node_modules/@doctolib/design-system/dist/table/TableHeadCell.d.ts Tool results: → result (ok): 1 import './Table.scss'; 2 import type { ComponentPropsWithoutRef, ReactNode } from 'react'; 3 export type Direction = 'asc' | 'desc'; 4 type OnResize = (resizedFieldId: string, newWidth: number) => void; 5 export type TableHeadCellProps = { 6 sortable?: boolean; 7 sortDirection?: Direction; 8 bordered?: 'right' | 'left'; 9 align?: 'right' | 'left' | 'center'; 10 colSpan?: number; 11 onSort?: (direction: Direction) => void; 12 className?: string; 13 children?: Rea …(truncated, 884 more chars) Both fixedLayout (Table) and initialWidth (TableHeadCell) are valid Oxygen API props. Let me run the tests and lint to verify. Tools used: - Bash: cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui && npx vitest run src/components/NhrDocumentListModal/Nhr …(truncated, 33 more chars) Tool results: → result (ok): zsh: command not found: npx Tools used: - Bash: source ~/.zshrc 2>/dev/null; source ~/.doctolib/profile 2>/dev/null; cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health …(truncated, 132 more chars) Tool results: → result (ok): /Users/USER/.local/share/mise/installs/node/24.14.1/bin/node /Users/USER/.local/share/mise/installs/npm/11.11.0/bin/npm > @doctolib/ test > npm run test:unit --run src/components/NhrDocumentListModal/NhrDocumentListTable npm warn "src/components/NhrDocumentListModal/NhrDocumentListTable" is being parsed as a normal command line argument. npm warn Unknown cli config "--run". This will stop working in the next major version of npm. > @doctolib/ test:unit > vitest src/compone …(truncated, 10775 more chars) All 43 tests pass. Let me also confirm typecheck and lint. Tools used: - Bash: cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui && (npm run type-check 2>&1 | tail -20) Tools used: - Bash: cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui && (npm run lint 2>&1 | tail -20) Tool results: → result (ok): zsh: command not found: npm Tool results: → result (ok): zsh: command not found: npm Tools used: - Bash: source ~/.zshrc 2>/dev/null; eval "$(/Users/USER/.local/bin/mise activate zsh 2>/dev/null)"; cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation …(truncated, 138 more chars) Tool results: → result (ok): > @doctolib/ type-check > tsc --noEmit Tools used: - Bash: cd /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui && /Users/USER/.local/share/mise/installs/npm/11.11. …(truncated, 34 more chars) Tool results: → result (ok): env: node: No such file or directory Tools used: - Bash: export PATH="/Users/USER/.local/share/mise/installs/node/24.14.1/bin:/Users/USER/.local/share/mise/installs/npm/11.11.0/bin:$PATH" && cd /Users/USER/workspace/doctolib/worktrees/treatme …(truncated, 178 more chars) Tool results: → result (ok): > @doctolib/ lint > eslint . --no-warn-ignored Lint, type-check, and tests all pass cleanly. Now I have everything I need to deliver the review. --- PR #3086 Review — fix(FHIR-2223): fix proportional column widths with text truncation in NhrDocumentListTable Repo: doctolib/treatment-plan  |  Branch: fhir-2223_fix-column-widths-truncation  |  Base: main Files reviewed - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/types.ts - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.tsx - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.test.tsx - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableHead/NhrDocumentListTableHead.tsx - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableHead/NhrDocumentListTableHead.test.tsx - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.tsx - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.helpers.ts - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTableBody/NhrDocumentListTableBody.helpers.test.ts (new) - /Users/USER/workspace/doctolib/worktrees/treatment-plan/fhir-2223_fix-column-widths-truncation/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.test.tsx Verifications run locally - npm run lint — clean, no warnings or errors - npm run type-check — clean, no TS errors - vitest run on the table tree — all 43 tests pass (4.05s) - Confirmed Oxygen Table.fixedLayout and TableHeadCell.initialWidth exist in @doctolib/design-system typings (Table.d.ts, TableHeadCell.d.ts) --- Findings Critical (90-100) None. Important (80-89) 1. getTextContent mishandles Fragment/no-children props (confidence 82) - File: packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.helpers.ts:7 - Issue: The helper assumes every valid React element exposes props.children. Two real cases break the tooltip silently: - Components without textual children prop (e.g. an icon component, or a Status chip whose label comes from a label/text prop, or a Tooltip/Trans component using defaultMessage). For those, node.props.children is undefined and the tooltip becomes empty even though the cell has visible text. - React.Fragment: isValidElement(<>...) is true and props.children works — that case is fine. But arrays-of-fragments and lazy/portals do not. Rendering paths like col.render returning (very plausible for the Status / Visibility columns described in the PR) would produce title="" and defeat the whole purpose of the change. - The helper is also typed loosely with (node.props as { children?: ReactNode }) — a structural cast that hides the missing-children reality at compile time. - Suggested fix: handle the common Doctolib status/badge/icon shapes explicitly (e.g. accept a title/label/tooltip prop pattern), or — simpler and more robust — derive the tooltip text from a DOM textContent read after render, or accept a per-column tooltipAccessor?: (doc) => string on ColumnConfig and fall back to getTextContent only when not provided. The current implementation will produce empty title="" attributes for any non-trivial cell renderer, which the existing tests don't catch (the test only covers mockColumns rows that resolve to plain strings — see NhrDocumentListTableBody.test.tsx:109 which only asserts the string-based "SOPK test results" case). 2. Truncation wrapper is added unconditionally, breaking action/badge cells visually (confidence 80) - File: packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.tsx:33-35 - Issue: Every column cell is now wrapped in
. truncate from Tailwind expands to overflow:hidden; text-overflow:ellipsis; white-space:nowrap;. For columns whose render returns a flex/inline composite (e.g. a Status badge + icon, or a Visibility chip with two states), white-space:nowrap and overflow:hidden will clip badges and produce an unintended title="" (see finding #1) on visually rich cells. The title attribute on a
is also weaker a11y-wise than CSS text-overflow with a tooltip on the cell text, and risks double tooltips when an inner Oxygen component already provides one. - Suggested fix: only wrap when col.width is defined (the only case fixed-layout truncation is meaningful), or expose an opt-in truncate?: boolean flag on ColumnConfig. This avoids forcing nowrap on columns that contain composite UI (Status/Visibility) and pairs nicely with the new width field. --- Notes / Lower-confidence observations (below 80, not blocking) - The width: '25%' lives on the public ColumnConfig type but no column factory in this PR sets it; this is intentional per the PR description (the consumer monolith PR provides values). Worth confirming the consumer PR before merge so this addition isn't a no-op in production. - NhrDocumentListTable.test.tsx:65 asserts document.querySelector('.dl-table-layout-fixed'). The CSS-selector policy in .claude/rules/frontend/react/test/testing-patterns.md flags this as needing a justification, and the comment "Testing that Oxygen's fixedLayout prop applies the CSS class" is present — fine, just calling it out as the same pattern is used in the pre-existing dl-table-body-skeleton-loader assertion. - TypeScript style of the helper file (function declaration vs. arrow) is consistent with surrounding code; replace_all is fine. --- Conclusion Two important issues should be addressed before merge — both center on the getTextContent + unconditional truncate wrapper combination producing empty/missing tooltips and clipping rich content for non-string columns (Status, Visibility, action chips). The simplest safe path is to make truncation opt-in via either col.width presence or an explicit flag, and to provide a tooltipAccessor escape hatch on ColumnConfig. The rest of the change (Oxygen fixedLayout, initialWidth, width in ColumnConfig) is well-scoped, test-covered, and consistent with the package's UpFront/Oxygen rules. Lint, type-check, and 43 tests all pass.