Commit Graph
1774 Commits
Author SHA1 Message Date
Denis GomesandClaude Opus 5.5 7f6a3a4e46 M7: font manager scan: drain Core Text's autoreleased objects; core-text 22
Review on #1309 pointed out that core-text 20.1's get_descriptors retains
the array it gets under the create rule a second time, so every scan kept
one array of font descriptors alive. Checking that turned up a larger leak:
Core Text autoreleases objects while it builds the collection, and the scan
runs where no autorelease pool is active (the app's background scan
thread, the CLI, the MCP server), so nothing ever drained them.

Measured with `figcraft-cli run` of N `text.rescanFonts` steps on macOS 15
(peak memory footprint):

| | 10 rescans | 200 rescans |
|---|---|---|
| main, without this PR | 221 MB | 220 MB |
| this PR before the fix | 228 MB | 796 MB |
| with the fix | 226 MB | 225 MB |

A standalone Swift loop over the same Core Text calls grows from 9 MB to
759 MB over 200 scans without a pool and stays at 20 MB inside one, so the
pool is what matters; the core-text bump removes the over-retain on top.

- The query runs inside objc2::rc::autoreleasepool. objc2 0.6 is already
  in the lockfile (winit's), and the function is safe, so the workspace's
  unsafe_code = "forbid" still holds.
- core-text goes to =22.0.0, the first release that takes ownership of the
  array correctly. It brings core-foundation 0.10, core-graphics 0.25 and
  core-graphics-types 0.2 beside the older versions other crates use. 22.0
  moved framework linking behind a `link` feature that is on by default,
  so with default features off it is named explicitly.

A rescan takes about 0.2 s instead of 0.08 s on that Mac (266 more font
files are indexed); it only runs when asked for.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:29:30 -04:00
Denis GomesandClaude Opus 5.5 5699e7abe6 M7: find fonts that macOS font managers activate outside the font folders
Font managers such as RightFont, FontBase and Typeface keep fonts in their
own library folders and activate them through Core Text, without copying
them into /Library/Fonts or ~/Library/Fonts. Every other Mac app lists
these fonts; FigCraft walks only the font folders, so it didn't, and a
file using one of them drew in a fallback font.

On macOS the scan now also asks Core Text for the file of every available
font and indexes the files that lie outside the walked folders. All three
scans (the first, the on-demand one and text.rescanFonts) share this, so a
font activated while the app runs is found by a rescan like a newly
installed one.

Core Text needs unsafe FFI, which the workspace forbids, so the query goes
through the safe wrappers of the core-text crate, pinned at =20.1.0. That
version builds on the core-foundation 0.9, core-graphics 0.23 and
foreign-types 0.5 the lockfile already has: core-text is the only new
package. The call sits inside catch_unwind, so anything unexpected from
Core Text leaves the scan with the font folders alone. Other platforms are
unchanged.

On a Mac with RightFont, 15 families from its library are now listed
(Geist, JetBrains Mono, Clash Display and others) that weren't before. A
full font listing went from 0.06 s to 0.20 s on that machine.

Tests: the filter that keeps files outside the font folders once, indexing
a font file found outside them, and (macOS only) that Core Text lists the
system's font files. cargo test --workspace, cargo clippy -p figcraft-text
--all-targets -D warnings and cargo fmt --check pass on macOS 15. CI
builds on Linux only, so the macOS path is checked locally.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:29:06 -04:00
Dylan M. Taylor d27061036f build: pin craft-update to craft-libs main (495e597) (#1348)
Picks up the startup prompt without the glyphs a font may lack (storytold/craft-libs#343, #344): the close mark is painted and the version pill is ASCII, so apps that panic on a missing glyph no longer take the prompt down.

Part of tracking issue storytold/craft-libs#319
2026-10-25 17:52:27 -04:00
Dylan M. TaylorandCodebuff 0fb1f143cc build: pin craft-update to craft-libs main (495e597) (#1347)
Picks up the update prompt fix that draws its close mark and version pill
without glyphs a font may lack, so the prompt no longer takes the app down
when a bundled face has no ✕ or →.

Part of tracking issue storytold/craft-libs#319

🤖 Generated with Codebuff

Co-authored-by: Codebuff <noreply@codebuff.com>
2026-10-25 17:37:10 -04:00
Dylan M. Taylor 106ef69351 feat: startup update prompt modal and direct self-updating (#1328)
* feat: startup update prompt modal and direct self-updating

The update flow (check at start or on request, the startup prompt, the self-update worker) is craft-update's Updater; the app only supplies the suite, its close path and its status window. The check at start is opt-in for the desktop app, an install holds back while documents are unsaved, and the Windows update helper runs before argument parsing.

Ref: storytold/craft-libs#319

* fix(updates): re-add the update hooks to the 0.37 frame loop

* fix(updates): address review feedback

Wake the UI when a manual check is queued from a menu callback; the update prompt owns the keyboard while it is open (LightCraft); Download opens through the desktop URL hook (FilmCraft); the Help menu dispatches through menus::invoke (FigCraft); print jobs and comment drafts hold an install back (WordCraft); Check for Updates is a registered command (GridCraft); an install holds back while documents are unsaved.

* fix(updates): show the prompt on Home and presenter frames and close the application, not one window

* fix(updates): add the update strings to the English catalog
2026-10-25 16:23:00 -04:00
236f3185d6 Migrate FigCraft to egui 0.37 (#1312)
* E21: require release font coverage and stabilize capture deadline tests

* E21: separate capture, IME and field-save regression phases

* M0: correct the migration qualification reference

* M-egui037: document input lifecycle and UI regression contracts

* M0: correct egui 0.37 status docs and stabilize join-code regression

---------

Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
Co-authored-by: Codebuff <noreply@codebuff.com>
2026-10-25 15:04:39 -04:00
Brandon Thomas 3fc005c7fe Merge pull request #1295 from Silvertree2010/fix/h2091-inserting-text-at-the-boundary-o
Keep style runs disjoint when inserting text at a run boundary
2026-10-25 12:11:24 -04:00
Brandon Thomas e1d23d8480 Merge pull request #944 from Silvertree2010/fix/h884-color-from-hex-accepts-several-l
Reject multiple leading '#' in Color::from_hex
2026-10-25 12:11:18 -04:00
Brandon Thomas f53001cd93 Merge pull request #931 from lukasz-sklad/community/polish-native-review
i18n(pl): native review, catch-up and terminology fixes
2026-10-25 12:11:13 -04:00
Brandon Thomas f215fc4f95 Merge pull request #954 from MMexicann/fix/cli-option-terminator
M0.9: allow literal dash-prefixed CLI filenames
2026-10-25 12:11:08 -04:00
Brandon Thomas 8436737129 Merge pull request #1310 from dotCooCoo/fix/collab-net-loopback-tests
M9: the hello deadline refuses a connection even when a read times out early
2026-10-25 12:11:03 -04:00
Brandon Thomas 0761a0e07a Merge pull request #1303 from marcoarnulfo/fix/dialog-last-folder
Dialogs start in the folder of the last file picked
2026-10-25 12:10:58 -04:00
Brandon Thomas 31b857433d Merge pull request #1242 from SusieeTheLinuxUser/fix/1220-thai-backspace
Text: Backspace removes Thai and other marks one at a time (#1220)
2026-10-25 12:10:52 -04:00
Brandon Thomas 610fe374c7 Merge pull request #1218 from Salah1St/fix/justify-zwsp
M4: justified text doesn't widen U+200B
2026-10-25 12:10:47 -04:00
Brandon Thomas 15aeff572b Merge pull request #1291 from watchakorn-18k/context-menu-copy-link
M8: Copy link to selection in the layer context menu
2026-10-25 12:10:42 -04:00
Brandon Thomas dfbba05318 Merge pull request #1144 from Silvertree2010/fix/1139-bug-report-figcraft-macos-contex
Keep context menu open after a same-frame trackpad tap
2026-10-25 12:10:37 -04:00
Brandon Thomas 97191e20c7 Merge pull request #1251 from storytold/fix/hover-lines-leave
Canvas: hover distances go when the pointer leaves the canvas
2026-10-25 12:10:32 -04:00
Brandon Thomas 3ec1197a8e Merge pull request #1276 from Ridzzz0Alam/fix/1150-section-labels
fix: Issue #1150 a section's title draws above the labels of frames inside it (#1150)
2026-10-25 12:10:27 -04:00
Brandon Thomas 01c17983fb Merge pull request #1326 from Silvertree2010/fix/h2485-number-field-rejects-a-unit-type
Accept a unit typed after a space in number fields
2026-10-25 12:10:21 -04:00
Brandon Thomas ff056176f8 Merge pull request #1323 from Silvertree2010/fix/h2483-component-code-uses-js-strict-mo
Rename component parameters that are strict-mode reserved words
2026-10-25 12:10:15 -04:00
Brandon Thomas 4b27ae4c77 Merge pull request #1317 from Silvertree2010/fix/h2376-svg-export-rounds-the-scale-of-a
Keep significant digits in SVG matrix scale coefficients
2026-10-25 12:10:09 -04:00
Brandon Thomas 132fdba12f Merge pull request #1296 from Silvertree2010/fix/h2093-code-export-prints-any-whole-num
Fix code export printing whole numbers of 2^63 or more as i64::MAX
2026-10-25 12:10:05 -04:00
Brandon Thomas 7df4ba4900 Merge pull request #1282 from Silvertree2010/fix/h1985-distribute-spacing-measures-the
Measure distribute span to the group's outermost edge
2026-10-25 12:10:00 -04:00
Brandon Thomas 1b8e65fb01 Merge pull request #1274 from Silvertree2010/fix/h1924-non-finite-percent-strings-accep
Reject non-finite percent strings for lineHeight and letterSpacing
2026-10-25 12:09:54 -04:00
Brandon Thomas 8cbdff697f Merge remote-tracking branch 'origin/main' into fix-1295
# Conflicts:
#	crates/doc/src/tests.rs
2026-10-25 11:56:28 -04:00
Brandon Thomas 44a2091b42 Merge remote-tracking branch 'origin/main' into fix-944
# Conflicts:
#	crates/color/src/tests.rs
2026-10-25 11:56:28 -04:00
Brandon ThomasandClaude Opus 5.5 d4a303d470 Release 0.11.2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.11.2
2026-10-25 09:44:44 -04:00
Brandon ThomasandClaude Opus 5.5 149f59cd14 Web: build the browser wasm with opt-level z to stay under the 24 MiB gate
The 0.11.1 release's Web job failed: the wasm was 25,248,590 bytes, over packaging/web/package.sh's 25,165,824-byte limit. opt-level z brings it to 23,306,645 bytes (measured locally with the release's craft-fonts ref, wasm-bindgen 0.2.129 and wasm-opt -Oz).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:44:13 -04:00
Brandon ThomasandClaude Opus 5.5 22c15e3206 Release 0.11.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:14:22 -04:00
Brandon ThomasandClaude Opus 5.5 4b76c407d5 macOS signing: keep the temporary keychain until the build has signed with it
import-cert.sh deleted its whole private temp directory on exit, and the keychain lives there, so codesign failed with "The specified item could not be found in the keychain" in the release build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:14:05 -04:00
Brandon ThomasandClaude Opus 5.5 32b836fbc5 Release 0.11.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 09:04:17 -04:00
NetterSilverandClaude Haiku 5.5 8e8314e273 Accept a unit typed after a space in number fields
Found while testing crates/ui-egui/src/field_math.rs:105 (Parser::factor, unit loop; end() at :109)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 11:35:08 +00:00
NetterSilverandClaude Haiku 5.5 142676191e Rename component parameters that are strict-mode reserved words
Found while testing crates/engine/src/component_codegen.rs:~226 (RESERVED list used by ident at :346)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 12:08:47 +01:00
NetterSilverandClaude Haiku 5.5 283c6de2b1 Keep significant digits in SVG matrix scale coefficients
Found while testing crates/svg/src/lib.rs:97 (num, used by matrix at :129 for the image pattern's patternTransform at :243-254)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 06:07:08 +00:00
aiongg 92682728e9 Follow-ups from the #1311 review: link notice clicks, variable scopes, corner tooltip (#1316)
* Prototype player: no clicks reach the prototype behind the link notice

* Selection colors: scopes filter the variable menu; the command binds as variable.bind does

* Style picker: color variables scoped to every selected layer's fill or stroke

* Corner button: named Corner smoothing on polygons and stars

* docs/gaps.md: known gaps from the #1311 review

* cargo fmt

* Style picker: clippy
2026-10-25 01:09:29 -04:00
aiongg 2a3b7d4fa7 Merge pull request #1311 from aiongg/dotcoocoo-batch
Merge 13 open PRs (tested batch)
2026-10-24 23:34:17 -04:00
aiongg e44ef587e5 docs/mcp.md: a slice in a frame or group with contentsOnly (#1305) 2026-10-25 02:40:12 +00:00
aiongg d135620b9f Dev Mode: the Assets panel's Publish refuses too (#1277) 2026-10-25 02:40:12 +00:00
aiongg 32199cc8e8 Text on a path tool: carry fill and effect bindings as text.onPath does (#1298, #1301) 2026-10-25 02:40:12 +00:00
aiongg b5ed2913d7 Merge #1307 2026-10-25 02:21:44 +00:00
aiongg 86bcfaddb9 Merge #1305
# Conflicts:
#	docs/file-format-parity.md
2026-10-25 02:21:44 +00:00
aiongg b95a04dc43 Merge #1304
# Conflicts:
#	docs/prototyping-parity.md
2026-10-25 02:21:29 +00:00
aiongg ad40507450 Merge #1277 2026-10-25 02:21:19 +00:00
aiongg 7aab188389 Merge #1301 2026-10-25 02:21:19 +00:00
aiongg d31a43419d Merge #1298
# Conflicts:
#	docs/ui-parity.md
2026-10-25 02:21:19 +00:00
aiongg 855631759f Merge #1288 2026-10-25 02:21:08 +00:00
aiongg c104757f59 Merge #1286 2026-10-25 02:21:08 +00:00
aiongg cdf37f9fc9 Merge #1284 2026-10-25 02:21:08 +00:00
aiongg 90bbd6a6d4 Merge #1281 2026-10-25 02:21:07 +00:00
aiongg e9edc298aa Merge #1283 2026-10-25 02:21:07 +00:00