* hayro-syntax: port PdfCraft's syntax fixes (ledger 17, 19, 20, 23, 4-ext, #3565, base_dimensions floor) From PdfCraft a2ec27b47: - (17), (19): a CCITT image with /Rows 0, or with fewer /Rows than its /Height, decodes to the image height instead of zero or /Rows rows. - (20): spaces or tabs between the stream keyword and its line break are skipped, so the stream data starts after the line break. - (4) extension: an inline image's EI followed by a delimiter (EI%, EI[) ends the image; only a regular character makes it part of a longer token. - (23): bytes above 0x7F between two EI candidates don't reject the first; the operator look-ahead decides. - #3565: a doubled sign (--280, +-280) is read and skipped as one number. - Page::base_dimensions keeps a one-point floor after /UserUnit instead of one raw unit. Also a local bound: a CCITT /Columns past u32::MAX is refused instead of wrapping to a small width that passed ccitt_size_ok. Tests: content and number unit tests from PdfCraft, a stream unit test, a synthetic page test for the floor, a CCITT /Columns unit test, and the two CCITT raster tests in crates/pdf/tests/upstream_raster.rs. * hayro-interpret: port PdfCraft's text fixes (ledger 30, 44, P2, P6, P8, 26-ext) From PdfCraft a2ec27b47: - (30): WinAnsi 0xA0 and 0xAD and MacRoman 0xCA read as an ordinary space and hyphen (Annex D.2 gives them those glyph names) unless /Differences names nbspace or sfthyphen. - (44): a /ToUnicode /Identity-H or /Identity-V name reads two-byte codes as their Unicode values; controls and lone surrogates give no text. - P6: glyph names outside the Adobe Glyph List (f_i, hyphen.case, uniXXXXXXXX) read by the glyph list specification's full mapping; names that only number a glyph (C39, c251) give no text. - P8: a substitute font whose charmap lacks a spacing character (U+2002 and similar) draws its ordinary space instead of .notdef. - P2: a Type 3 glyph's /FontBBox is transformed to device space before it bounds the glyph's clip and shadings, so shaded glyphs draw at every position. - (26) extension: comma-below letters (s, t, k, l, n, r, G with comma) in the standard-font stand-ins are the base letter with the font's comma, scaled and placed under the baseline. Tests: crates/pdf/tests/upstream_text.rs for (30), (44) and P6; the Type 3 shading and comma-below raster tests in crates/pdf/tests/upstream_raster.rs. P8's PdfCraft test needs a Japanese substitute font and is not ported. * hayro-syntax: refresh SOURCE.json local hashes for Cargo.lock, ascii_85.rs and filter/mod.rs They changed in #241 and #253 without their local sha256 values.
Craft App Libraries
This repo contains libraries used by the various Craft Apps. It's a Rust monorepo workspace, and the libraries can be included by any Craft Apps that need them.
In the future this may grow to include non-Rust library code.
If any libraries grow beyond Craft App usage, eg. RAW format support, they may be promoted out and into their own libraries for the broader ecosystem to take advantage of.
Layout
A Cargo workspace (edition 2024, resolver 3). Each library is a crate under crates/<name>, named
craft-<name>, with version, edition, license and repository inherited from the workspace
(license.workspace = true, and so on) and [lints] workspace = true. Register each crate in
[workspace.dependencies] in the root Cargo.toml.
Apps depend on a crate by git:
craft-<name> = { git = "https://github.com/storytold/craft-libs", rev = "<commit>" }
Libraries
-
craft-platform: optional native dialog lifecycle, Linux/BSD desktop appearance observation and browser download ownership; application policy stays in the apps. -
craft-ai-core: the data model and contract for AI in the Craft Apps (connections, models, tools, requests, jobs, consent, history, route spec). Pure, no I/O, wasm-safe. Contract in docs/ai-shared-layer.md. -
craft-pdf: independently optional PDF parsing, interpretation, rasterization and guarded authoring. Apps retain layout, fonts, editing and export policy; writer-only consumers do not enable the shared reader. -
craft-atomic: Crash-safe atomic file writing and replacement with same-directory staging, directory fsync, AppleF_FULLFSYNCfallback, transient lock backoff, and fault injection for the Craft suite. -
craft-cms: pure-Rust ICC v2/v4 colour management: profile parsing and writing, transforms, rendering intents, black point compensation, soft proofing, gamut checks, 3D LUTs and built-in profiles (sRGB, Display P3, synthetic coated CMYK and others). -
craft-docpath: decides whether a path orfile:URL stored in a document may be opened. Paths stored in documents are followed only when they are local or on the document's own network share; other network paths, device paths and non-file URLs are refused. -
craft-fonts-build: embeds the optional craft-fonts faces from an app'sbuild.rs(CRAFT_FONTS_DIR,CRAFT_FONTS_REQUIRED, script filters) as a table ofEmbeddedFaces. No dependencies; the app picks the faces. -
craft-i18n: translations over the embedded craft-i18n catalogs: lookup with fallback (pt-br→pt→ English), plurals, language names, the system locale and a pseudo locale. The catalogs stay a fully optional build input; apps keeptl!and their language setting. -
craft-keymap: keyboard bindings: chords and their text forms, scopes, conflicts, user overrides stored through craft-settings and import of other applications' shortcut sets. Command catalogs, file readers and the shortcut editor UI stay in each app. -
craft-media: bit-level I/O (bitstream), clean-room MP4/MOV (isobmff) and Matroska/WebM (matroska) demuxers and muxers, from FilmCraft, and an ISO BMFF box reader. Containers only; codecs stay in each app. -
craft-print: PDF submission to CUPS and Windows, printer discovery, duplex/copies/colour and driver preferences. PDF generation stays in each app. -
craft-quit: native macOS quit, egui close handling and an optional app menu. Unsaved-document decisions and save prompts stay in each app. -
craft-settings:config.tomlsettings storage for every app: platform folders, portable mode and overrides, atomic saves while running, backup, damaged-file recovery and schema migrations. Policy in docs/settings-storage.md. -
craft-ui: SVG catalogs, icon buttons, tabs, pane controls, transactional docking, print settings and theme helpers for egui frontends; assets, themes, localization and command handling stay in each app. Requires Rust 1.95 or later. -
Shared UI component audit: source inventory, extraction priorities and compatibility boundaries across the Craft suite.
-
Theme infrastructure: eight-app comparison and the small shared widget-state styling boundary.
-
Panel docking: validated panel moves, floating groups, workspace adapters and an optional egui docking surface.
License and credits
craft-libs is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the craft-libs contributors. Required notices are in NOTICE.
Bundled fonts, icons, images and other assets keep their own open licenses; each one is listed with its author, source and license in ATTRIBUTION.md.