Floating windows: - A title bar (TITLE 14) drags the whole window live; Escape and focus loss put it back. A release over a tab strip, a floating stack's band or seam, or the outer edge emits MoveWindow; elsewhere the window stays and hosts get group_drop. Double-click minimizes or expands every group; the close button closes every panel (CloseWindow). - Stacked groups with a 3 pt bar between them and dividers that resize both neighbours (ResizeGroup). The top and bottom quarter of a group and the seam between two groups insert a new group there, with a line preview (P3, P4). The title bar occludes what lies behind it. - The only group of a window carries the window rect when dragged by its bar, so floating it again keeps the window's size. Frame profile (DockStyle::profile): - Ctrl/Cmd held at the start of a tab drag undocks the panel (S9). - The outer edge band splits at the root: top and bottom in both profiles, left and right in the frame profile (P8). - Menu tail: Undock Panel, Close Panel Group, Undock Panel Group, Close Other Panels in Group and Maximize Frame (DockEvent::ToggleMaximize). DockArea::maximized draws only the docked frame holding the panel; other frames and floating windows do not render or take input. DockArea::hide_panels leaves out every panel, or every panel except a host-chosen set; protected panels stay and the layout is unchanged. Feature native-windows: a floating window with a native rect gets its own OS window through show_viewport_immediate when the backend does not embed viewports, and stays in-window otherwise. Closing it emits SetNative None, so the group returns to its in-window rect; moves and resizes are read back as SetNative with bounded sizes and positions. Tabs and groups do not drag between OS windows. Move Panel to New Window is in the menu tail where native windows are available. A floating panel whose window closed as a whole restores at its last rect. Behaviour follows vectorcraft floating.rs (show_set, draw_groups, track), effectcraft dock_ui.rs (panel_window, set_panel_window, toggle_maximize) and dock.rs (PanelWindow::sanitized), filmcraft dock_ui.rs (workspace_edge, EDGE_BAND, maximized) and storytold/filmcraft#2118 (saved_native_rect, bounded_inner_size).
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-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-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-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.