When text attachments (such as tables or wide images) exceeded container width,
`CPTypesetter` correctly forced a line break following the attachment but
erroneously reverted the line's height and baseline to pre-attachment metrics.
Consequently, oversized attachments rendered on the baseline of preceding text,
causing them to overlap and obscure content above them in narrowed viewports.
* AppKit/CPTextView/CPTypesetter.j:
- Update line layout logic to incorporate attachment dimensions into line height
and baseline calculations when line breaks encompass overflowing attachments.
* Tests/Manual/TextEditor/WORKLIST.md:
- Mark wide/overflowing table layout tests as completed.
Attachments and tables wider than the text container now correctly occupy their own distinct lines without overlapping preceding content.
CPTypesetter lacked handling for CPJustifiedTextAlignment, causing justified paragraphs to fall back to left alignment. Additionally, centred and right-aligned text improperly spanned the full container width by ignoring paragraph indents, and trailing spaces on wrapped lines incorrectly shifted line positioning.
* AppKit/CPTextView/CPTypesetter.j:
- Implement CPJustifiedTextAlignment layout by distributing spare width evenly across line spaces.
- Preserve left alignment for paragraph final lines and segments preceding a tab, matching Cocoa behavior.
- Constrain centred, right-aligned, and justified lines between head and tail indents.
- Exclude trailing spaces from visible line width to allow proper hanging alignment.
* AppKit/CPTextView/CPLayoutManager.j:
- Update _CPLineFragment to record extra space widths and render spans with matching CSS word-spacing.
- Ensure fragment equality checks account for word-spacing variations.
* Tests/Manual/TextEditor/WORKLIST.md:
- Mark justified and centred text layout tests as completed.
Centred and justified paragraphs now conform to standard Cocoa layout behavior.
The typesetter laid a decimal tab stop out like a left tab, so a column of numbers started at the stop instead of aligning on its decimal separators. It now follows Cocoa: the first decimal separator of the user's locale starts at the stop, and a segment without one ends at the stop.
* CPTextView/CPTypesetter.j: Position text after a decimal tab stop by the width before its first decimal separator, taken from the browser's locale.
* Tests/Manual/TextEditor/WORKLIST.md: Record the Tab key and the four tab stop types as tested, and the tab stop menu as working.
CPTextContainer's line fragment padding was 0 and the typesetter never applied it, so text started 2 points from the text view's edge and ruler markers at 0 were cut off. It now follows Cocoa, with a default padding of 5 points at each end of every line fragment.
* CPTextView/CPTextContainer.j: Default the line fragment padding to 5 points, and archive it.
* CPTextView/CPTypesetter.j: Lay lines out inside the padding: offset line fragment origins by it, compute the right margin, right indent, centred and right alignment within the width inside it, and subtract it when layout resumes from a stored line fragment.
* CPTextView/CPTextView.j: Start the caret in empty text inside the padding.