Commit Graph
1605 Commits
Author SHA1 Message Date
Karim Jerbi b66f890546 fix(statusbar): scale pill number, label and badge follow one viewport
The pill number used the first-content fallback while the label and sync badge used explicit-only resolution, showing e.g. a 1:50 number beside a 1:1 label with no badge. Label and badge now resolve through target_viewport_handle like the number; render-path handle fn, set-paths and Model branches untouched. Tests: scale_pill_sources_agree_without_targeted_viewport (RED: live probe Some(0.02)/1:1/None) plus Model-unchanged pin. Full suite: 2027 passed / 0 failed / 25 ignored.
2026-10-10 16:14:22 +01:00
Karim Jerbi 237d3afd2f fix(scene): normalize inverted AABBs in spatial index and add warm cache timers 2026-10-09 14:20:13 +01:00
gianlucafiore 4161262e51 fix: preserve linetypes on circles and arcs 2026-10-08 11:43:13 -03:00
Hakan SevenandClaude Opus 5.5 ff6e2a6613 review(#1660, #1663): associative sweep scan, arc angles, viewport off bit
- refresh_associative_sweeps runs on every edit and scanned the xdata of
  every entity; it now returns at once when no associative swept surface
  exists (its application is not registered) and looks at surfaces only.
- An arc's end angle was raised by TAU in a loop, which never ends on a
  huge angle from a damaged file; the sweep is taken with rem_euclid.
- The sweep DELOBJ test expected surface sweeps to delete their sources,
  which #1663 changed on purpose: an associative surface keeps them.
- codec c9ffcac (opencadcodec #103) adds an explicit viewport-off bit: the
  viewport on state is read with is_on() and set with turn_on()/turn_off()
  everywhere, so a viewport the file marks off shows off and can be turned
  back on from Properties.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:56:30 +03:00
Hakan Seven 9519614e91 Merge pull request #1663 from ramox81/codex/sweep-surface-associativity
Associative swept surfaces in the drawing's network
2026-10-08 14:44:25 +03:00
Hakan Seven 435038d364 Merge pull request #1660 from ramox81/codex/sweep-solid-validity
SWEEP: base point from the path; kernel sweep validity fixes

The fork pin the PR carried ([patch] to ramox81/cadkernel 30b3810) is
resolved to upstream instead: kernel 99b6b48 (opencadkernel #78-#83),
codec c9ffcac (opencadcodec #102, #103), graph 7f6aae7, in every manifest.
2026-10-08 14:44:23 +03:00
ramox81andClaude Opus 5.5 48c3c433a5 feat(sweep): associative swept surfaces in the drawing's network
Swept surfaces made with SURFACEASSOCIATIVITY on keep their profile and
path and are written as a swept-surface action of the drawing's
associative network, reading the profile and path and their scale and
twist expressions. They follow edits of their sources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:29:55 +03:00
Karim Jerbi 7d008c4914 bench(navigation): add viewport navigation and spatial candidate benchmarks
- Add Section 19 benchmarks covering camera pan viewport uniform updates,
  spatial hover candidate search, and viewport data assembly scaling
- Add navigation telemetry probes in src/perf.rs (active only when
  PERF=1) to track frame interval, batched input moves, and layout-draw gap
2026-10-08 10:24:06 +01:00
Karim Jerbi af41825a33 fix(scene): avoid idle redraw loop when document lacks underlay entities
underlay_resolution_stale() was requesting continuous redraw frames at
display refresh rate even when no raster underlays were present in the
drawing. Cache has_underlays conservatively on Scene and early-return
false when no underlays exist, eliminating the idle tick leak.
2026-10-08 10:24:06 +01:00
ramox81andClaude Opus 5.5 6aced3ac7e SWEEP: base point from the path; kernel sweep validity and placement fixes
A single profile's base point comes from the path it is swept along: a
path leaving the profile's plane from inside the profile sweeps it where
it stands. Kernel 30b3810: pcurves in the edge's parameterisation (valid
spline-faced sweeps), corner crossings fitted to the modeller's
resolution, run faces through stations evenly spaced along the run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:17:00 +03:00
Hakan SevenandClaude Opus 5.5 1882773418 review(#1657): Lao is selectable and renders on the web
- Language gains lo-LA, labelled ລາວ in every catalog, so the new
  translation can be chosen.
- Two Lao keys under stale names now use the catalog's names, and the
  touchpad option added since gets its Lao label.
- The web build gets a Lao font (Noto Sans Lao, generated like Thai) and
  routes Lao and Thai drawing text to their fonts; Thai had a font but
  was never routed to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:19:59 +03:00
Hakan SevenandClaude Opus 5.5 9adb6f59c8 fix(copy): a copy reacts only to what was copied with it
COPY and PASTE kept the source's reactors on each copy, so a copied
dimension still pointed at the source's dimension association (and
boundary or group members at the source hatch or group). Another
application reports such a drawing as damaged and, after recovery,
moves the dimensions. A copy's reactors now follow only targets copied
with it; group copies give their members the new group's reactor; and a
drawing opened with such stray dimension reactors has them dropped.

Fixes #1645
Fixes #1649

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:34:49 +03:00
gianlucafiore 3ecf1951c0 fix: render command previews above wipeouts 2026-10-07 20:14:08 -03:00
gianlucafiore 7b7aa0d429 fix: prevent interaction with hidden layers 2026-10-07 19:22:44 -03:00
Hakan SevenandClaude Opus 5.5 ac086def56 review(#1653): upstream pins, registered expression xdata, table apply refreshes sweeps
- Cargo: drop the fork patches; codec 8e93175, kernel 0665fc9, graph
  3b91e67 in every manifest and lock.
- A swept surface's expression link is written through set_entity_xdata,
  so OCS_SWEEP_EXPRESSION has its APPID record and the record its handle.
- Applying the whole named-parameter table also rebuilds the swept
  surfaces linked to expressions, not only a single-row edit.
- swept_surface_entity keeps its doc comment.
- The native-constraint tests find a scope's network through its own
  dictionary, where it is now stored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 21:38:17 +03:00
ramox81andClaude Opus 5.5 07499968d8 Sweep spatial profiles as surfaces, keep swept surfaces linked to expressions
A closed 3D polyline profile that does not lie in one plane sweeps a
surface with the reference's refusals. Swept surfaces made with an
Expression scale or twist follow the named parameters, and reference
surfaces linked through their associative action are picked up on open.
Saving keeps the associative actions the constraint graph does not
rebuild and stores each scope network through its own dictionary.
Kernel 23138fc, codec 64fe2a6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 16:47:30 +03:00
ramox81andClaude Opus 5.5 0c3ca96822 SWEEP: sweep from the picked path end; kernel run faces and placed ends
- An open path is swept from its end nearest the pick point (in plan), as
  the reference does; the record keeps the original path and the placed
  frame marks the start.
- Kernel from ramox81/cadkernel 1df75f5: one face per path run for
  twisted, scaled and spline sweeps, placed records swept from the placed
  end, end caps without pcurves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 16:34:34 +03:00
Hakan Seven 737981791b Merge pull request #1642 from ramox81/codex/sweep-corner-followups 2026-10-07 12:55:08 +03:00
Hakan Seven 534b432b8c Merge pull request #1643 from ramox81/codex/updatefield-count 2026-10-07 12:55:08 +03:00
Hakan SevenandClaude Opus 5.5 33640e050d feat(solid history): Ctrl+click picks a composite's solid; show history draws them
Ctrl+click on a composite selects it with the solid under the cursor as
the one its palette and grips edit: the solid whose own surface passes
through the picked point. With its history shown, a composite draws the
edges of the solids its booleans joined, each where it sits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 12:51:32 +03:00
Hakan SevenandClaude Opus 5.5 d3033caf24 feat(solid history): booleans keep the solids they joined editable
With SOLIDHIST on, UNION, SUBTRACT and INTERSECT no longer reduce the
result's history to a frozen body: each solid's history joins the
result's under a boolean step, in the order the result applied them.
The Properties palette lists a composite's solids under Operand; the one
chosen shows its own geometry rows and grips, placed where it sits in
the composite, and editing it replays the whole tree. A composite read
from a file keeps its saved body; the tree is replayed only on edits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 11:14:13 +03:00
ramox81andClaude Opus 5.5 6da3fea563 UPDATEFIELD: count fields as the reference does
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 10:24:35 +03:00
ramox81andClaude Opus 5.5 56f3f68de9 SWEEP: Expression option, reference prompts and localized messages
- Scale and Twist take an Expression evaluated with the drawing's
  parameters; invalid input prints the reference message and asks again.
- The scale and twist prompts use the reference wording and defaults.
- The SWEEP prompts and refusal messages are in the locale catalog with
  translations in every locale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 10:15:32 +03:00
ramox81andClaude Opus 5.5 1a18fdd0cf SWEEP: reference messages, 3D polyline profiles and Scale Reference
- 3D polyline profiles are recorded as wire bodies, like 3D polyline paths.
- Refused sweeps print the modeling error code and "Unable to sweep N
  selected objects."; a scaled sweep rejects closed and cornered spatial
  paths with the reference messages and asks for the path again.
- Scale > Reference asks for start and end reference lengths (start / end).
- Bank stays on for later sweeps until a twist angle is entered.
- Refused twist/scale edits in Properties print the modeling error code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 09:26:29 +03:00
Hakan SevenandClaude Opus 5.5 e854481f72 fix(mirror): a mirrored dimension keeps its text readable
The dimension's own block parts were mirrored with their text, so the
measurement read backwards. Text orientation is kept under reflection,
the same as TEXT and MTEXT with MIRRTEXT off.

Fixes #1639

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 08:50:06 +03:00
Hakan SevenandClaude Opus 5.5 fae64886ee fix(snap): arc segments of a polyline offer their centre and quadrants
Center and Quadrant found nothing on a polyline's bulge segments: the
lightweight and heavy polylines carried no snap points for them, and a
polyline split into several wires kept its points on one piece whose box
the others' never reached. Each arc segment now carries its centre and
quadrants, hovering the segment offers its centre, and a wire's box
covers its snap points.

Fixes #1640

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 08:50:05 +03:00
Karim Jerbi 29392de267 fix(dimstyle): preview respects per-end arrowheads
DimensionPreview drew identical generic triangles regardless of dimblk/dimblk1/dimblk2. It now resolves each end through the shared arrow_from_block_name mapping (widened to pub(crate)) and draws per-end glyphs, keeping DIMTSZ tick precedence. Tests: arrow_name_mapping_covers_preview_kinds pins the shared contract; 2 preview_arrow_tests pin per-end resolution (RED first). Full suite: 1989 passed / 0 failed / 25 ignored.
2026-10-06 22:47:34 +01:00
Karim Jerbi 7aafd9c710 refactor(selection): split 31-field SelectionState into five sub-structs
SelectionState now holds view, gesture, input, menu and orbit sub-structs; all 450 access sites updated mechanically with no behavior change. Deletes three write-only dead fields (box_last, box_last_crossing, poly_last_crossing). Hand-rolled clears in commands and dim_viewport route through the new clear methods; bench fixture updated. Full suite: 1976 passed / 0 failed / 25 ignored.
2026-10-06 20:22:04 +01:00
Karim Jerbi 8c2cfa2c8f fix(viewcube): cache UCS picker names behind an epoch
The two per-frame ViewCube blocks rebuilt the named-UCS name list (N String clones plus a Vec) every frame; now Scene::cached_ucs_names memoises it behind ucs_epoch and the picker takes the Arc, so frames cost a refcount bump. Bumped on UCS SAVE, UCS DELETE, RENAME UCS, record-API ucss patch, file-open, and undo Full-swap. Tests: cached_ucs_names_returns_same_arc_until_bump pins the hit path; cached_ucs_names_invalidated_by_bump pins rebuild with new content. Full suite: 1976 passed / 0 failed / 25 ignored.
2026-10-06 20:10:23 +01:00
Hakan Seven 0149a276ef Merge pull request #1632 from ramox81/codex/sweep-miter-history
Sweep history records in the reference layout.

Pins resolved to upstream: codec bff95f5 (#93, #94, #95, #96, #97 and
review fixes), kernel 6146d31 (#75 and review fixes), graph 9635ba7.
2026-10-06 21:09:40 +03:00
Hakan SevenandClaude Opus 5.5 62d72b3a8d review(#1630): one table rebuild loop that also refreshes formulas; one cell layout
- main already rebuilt an edited table's block; the PR added a second
  loop after it that could never fire. Formula refresh and the block
  cache bump now live in the one loop.
- Formula refresh copies the drawing only for a table that has a field.
- A field cell lays its text out once and boxes it from those cells.
- A zero text height at one level falls through to the next instead of
  ending the lookup.
- Field box constants and BACKGROUND keep their own doc comments.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:54:26 +03:00
Hakan Seven 95d5eb73d9 Merge pull request #1630 from ramox81/codex/table-edit-overrides
Tables: cell overrides and field backgrounds when drawn from table data.

# Conflicts:
#	Cargo.lock
#	Cargo.toml
2026-10-06 20:50:39 +03:00
Hakan SevenandClaude Opus 5.5 864c644222 review(#1629): one direction mark, no dead RTL paragraph path, tests follow the new layout
- One visible-named LRM constant (ttf_glyph) instead of two invisible
  literals. Stroke and SDF text skip it, so a right-to-left script the
  shaper does not handle no longer gets a 6-unit gap per mark; vertical
  MTEXT does not insert it at all.
- Shaped cells keep a cluster the shaper merged into the leading mark.
- The always-false RTL paragraph flag, its indent/anchor branches and the
  unused reorder_line_atoms are gone; its test now covers reorder_rtl_runs.
- Underline, overline and strike follow each drawn run of a mixed word.
- Justify/distribute count only the gaps the measured width holds.
- The two RTL alignment tests assert the new left-to-right behaviour;
  glyph_boxes keeps its own doc comment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:49:01 +03:00
Hakan Seven 36871044a6 Merge pull request #1629 from ramox81/codex/mtext-rtl-layout
Text layout: right-to-left runs, TEXT direction and leading spaces.
2026-10-06 20:42:14 +03:00
Hakan SevenandClaude Opus 5.5 af75cf42a8 review(#1627): one UPDATEFIELD, honest counts, safe field boxes, one-pass host redraw
- UPDATEFIELD stays the command main already had (Select objects, undo,
  locale strings); it now takes the PR's reach — a block reference's
  attributes and block definition, a table's cell texts — and reports
  the fields that really changed. The PR's second implementation and its
  duplicate registration are gone.
- FIELDEVAL's range error goes through the locale catalog.
- Field boxes: no slicing inside a character, one layout per multi-line
  attribute, and TEXT boxes scale about the annotative reference point
  like the glyphs do. Comment and indentation put back where they belong.
- bump_text_hosts classifies every host in one pass over the drawing
  instead of scanning all layouts and blocks per host.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:42:07 +03:00
Hakan Seven 711799371a Merge pull request #1627 from ramox81/codex/plotdate-refresh
Fields: evaluation events, UPDATEFIELD, FIELDEVAL, per-field shading and PlotDate redraw.

# Conflicts:
#	Cargo.lock
#	src/entities/field.rs
2026-10-06 20:42:01 +03:00
Hakan SevenandClaude Opus 5.5 3769bb59e3 review(#1631): drop the repeated ROMANS table; tests follow the new advances
- The ROMANS advance list was pasted twice; once is enough.
- The stroke-font golden checksum follows TXT's new advances (segment and
  vertex counts unchanged).
- The tolerance compartment test checks ink against pen only for symbol
  cells: text fonts now advance by the reference's pen, not their ink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:36:07 +03:00
Hakan Seven c47f6d540b Merge pull request #1631 from ramox81/codex/stroke-font-space
Stroke fonts keep the space and character advances of the fonts they stand in for.
2026-10-06 20:36:07 +03:00
Hakan SevenandClaude Opus 5.5 1eae36e726 Cargo: codec 76d2a1c, kernel e652b4d, graph 0545fa9; text styles, templates, solid edges
- Text styles keep their TrueType typeface through save and reopen (codec
  reads and writes the STYLE record's ACAD extended data) (#1633)
- Unnamed shape-file entries no longer show in text style lists (#1634)
- Save As offers DWT 2018; NEW asks for the template to start from, while
  Ctrl+N and the quick-access New run QNEW with the default template (#1635)
- An edge next to an earlier fillet of the same radius rounds together with
  it (kernel); the solid stays drawn and pickable while edges are chosen
  (#1625, #1107)
- A full cache rebuild drops the B-rep cache too, so an undone fillet does
  not come back with the next edge operation (#1107)
- Selected solids in shaded styles highlight only their visible edges (#1031)
- VIEW ISO / SWISO / SEISO / NEISO / NWISO snap to the isometric corners

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 18:32:43 +03:00
ramox81andClaude Opus 5.5 8f3e99b03e Recompute table formulas after an edit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 16:34:00 +03:00
ramox81andClaude Opus 5.5 470d6a6b7f Rebuild a table's block after an edit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 16:06:21 +03:00
Hakan SevenandClaude Opus 5.5 178c7dff41 fix: open-issue sweep — drawing, plot, snap, layout and UI fixes
Fixes:
- Font prompt no longer lists bundled ltypeshp/qcadshp shape files (#1626)
- Wide polylines step at a discontinuous segment width; PEDIT marks the
  current vertex; keyword steps refresh the command preview (#1628)
- Radius-0 fillet drops the zero-length segment it left, so the corner
  fillets again (#1422)
- FILLET Trim / No trim option (#1558)
- True-colour wires plot in their own colour; colour picker stores the
  value it shows (#1621)
- Model tab keeps its page setup; "Save changes to layout" in Model (#1620)
- QNEW default template in Options > Files; .dwt in the open dialog
  (#1134, #1113)
- GRIDUNIT / GRIDMODE / PERSPECTIVE variables (#1618, #1524)
- PTYPE (#1433)
- ZOOM nX / nXP (#1465)
- CHSPACE between model and paper space through a viewport (#1428)
- Moving a dimension keeps its automatic text placement
- Shell icon; "&&" button labels (#1554)
- LINETYPE Load from a .lin file (#1588)
- XLINE / RAY hide the crosshair arms (#1437)
- Dynamic-input boxes keep clear of the crosshair and each other (#1546)
- Snap marker colour setting, dark default on light canvases
  (#1497, #1229, #1128)
- Dimension style precision as a 0.00 pattern dropdown (#1426)
- Node graph nodes left of the origin no longer clip away (#1592)
- Collapse button in the command history header (#1094)
- Freeze-in-current-viewport toggle in the ribbon layer list (#1466)
- Geometric Center object snap for closed polylines (#1369)

New strings translated in all 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 15:59:30 +03:00
ramox81andClaude Opus 5.5 632540efff Sweep history records in the reference layout; kernel and codec revs
New sweep records store the source and placed profile frames, the
default mitred joint, groups 292-294 and a 3D polyline path as a wire
body, so the reference re-evaluates them. Builds against the sweep
history codec and kernel revisions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 15:33:47 +03:00
ramox81andClaude Opus 5.5 c83d37b24d Text: stroke font character advances of the reference
txt, simplex and romans keep the reference fonts' printable ASCII pen
advances, so lines measure, wrap and align like the reference.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 15:17:39 +03:00
ramox81andClaude Opus 5.5 2c1df150b3 Tables: field backgrounds on cells drawn from table data; codec table overrides
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 14:50:57 +03:00
ramox81andClaude Opus 5.5 de65cd7e50 Text: stroke font space widths of the reference
The SHX names the embedded LFF fonts stand in for (txt, monotxt,
simplex, romans, romand, romanc, complex, italic, gdt, isocp) use the
space advance of the reference's fonts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 14:33:59 +03:00
ramox81andClaude Opus 5.5 acafb3be29 Text layout: right-to-left runs and leading spaces like the reference
MTEXT paragraphs keep left-to-right order and their attachment's
alignment even when they start with Hebrew or Arabic: a run of
right-to-left words (with the spaces between and after them) reads
backwards in place, and inside a word each right-to-left letter run is
reversed on its own while digits, punctuation and Latin keep their
order. Shaped text gets a left-to-right paragraph direction, so TEXT
follows the bidirectional rules with a left-to-right base, and a TEXT
line that starts with Hebrew or Arabic is no longer right-aligned. A
paragraph's leading spaces keep their width and trailing spaces are left
out of the width used for centring and right alignment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 14:10:45 +03:00
Hakan SevenandClaude Opus 5.5 81bb8d48cf Cargo: codec aad7053, kernel 1a52eaf, graph 263de59; honour viewport clipping
Brings codec PRs #84 (cross-version visual styles, table styles,
subentity managers), #88 (viewport clipping flag, DXF boundary handle),
#89 (DXF viewport snap/twist in degrees) and #92 (field format codes,
event updates).

With #88 a viewport keeps a stored boundary whether or not clipping is
on, so a linked boundary alone no longer means "clipped": rendering,
paper picking, VPCLIP and the Clipped property check the clipping flag
too, and VPCLIP / MVIEW Object and Polygon set it. Before, OCS never set
the flag, so its clipped viewports opened rectangular elsewhere.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 13:57:55 +03:00
ramox81andClaude Opus 5.5 3830a69ca7 Fields: exact field boxes for rotated, multi-line and shaped text
Layout glyph cells carry their unrotated cell, so a field box in rotated
MTEXT is placed exactly; multi-line attributes box each line of a field
from their own layout cells and single-line attributes split on \P per
line; shaped words (TrueType fonts, right-to-left and complex scripts)
take the shaper's glyph cells for their characters instead of evenly
divided slots. The field background is also drawn for text rendered as
shaped strokes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 13:24:52 +03:00
ramox81andClaude Opus 5.5 383eba14e5 Fields: table cells keep stored values, UPDATEFIELD reaches blocks and tables, measured shading box
Table cell fields show their stored value; only formula cells evaluate
live. UPDATEFIELD on a block reference also updates the fields of its
block definition, and on a table the fields of its cells; a changed
table cell text redraws the table. The FIELDDISPLAY box is placed from
the text layout (MTEXT layout cells, TEXT / attribute pen advances) and
spans 0.345 text heights below the baseline to 1.19 above it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 12:25:24 +03:00