* Issue a revision: drawing.revise (#3874 R1) drawing.revise appends a copy of a row to the issued history: an existing row as it reads, or a new revision with the texts given, in one undo step. A row is issued once. The copy keeps what it read through an edit, a hide or a delete, and nothing is filled in: no date, checker or approval. Issuing used to make a drawing unreadable, as a copy has its row's id and the drawing's check refused any id seen twice. Each id now counts once, and issued ids are unique among themselves. model_version becomes {path, change}, on issued copies only. One function on the session answers it, and answers nothing until version control exists. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Drawing revisions: numbered 1, 2, 3 (#3874) A drawing's new revisions are numbered 1, 2, 3, never lettered (@CamWight, 3 Nov). drawing.set's revision_numbering is {start: 0 or 1}, the first number. A revision typed by hand is kept as typed; the next one follows the highest number, and drawing.inspect says where numbering starts. A record in letters is refused (drawings haven't shipped). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Revision tags on a sheet: add, edit and delete (#3874 R3) A tag gains the sheet it sits on and its place there. drawing.revision.tag.add, .edit and .delete keep them, inspect and every revision reply list them with what each shows, and a sheet's delete counts and takes the tags on it. A deleted row still leaves its tags showing the revision they had. Tags draw on paper once scene text lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Saved tables on a sheet: drawing.table.add, .edit and .delete (#3874) A drawing saves its parts lists and revision tables, each on a sheet with its definition and place. Rows are never saved. A parts list starts at the top right listing what its sheet documents, else the design; a revision table at the bottom left; headings on top, QTY, rows of 7 mm. Placing a list saves the numbers its view shows, once per view, so what is printed doesn't move. Numbers are the design's: undoing the placing puts back only the drawing, as every drawing step does, and the numbers stay. That one command changes both, and the proof that nothing needs evaluating now allows it. The tables are a ById list, as the balloons and images are, and keep its rules: at most 1000, listed by id. Revision tags take their own id type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * A balloon reads its row in a parts list (#3874 L1) A balloon can name the parts list it reads; else it reads its sheet's only list, else the drawing's only one, else none, with the choices listed. Its row's item is worked out on each read and never saved: drawing.balloon.inspect gives item and row_status (ok, no_list, reference, no_row or not_found). A lost row never removes the balloon. A list's delete reports the balloons that named it and clears their links. Bom::item_of cuts a path from the top of the design to start below the assembly listed, and row_of is no longer test-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Notes on a drawing: the record and commands (W19e, #4896) A note sits on a sheet, a view, or an edge or corner of a view's model, saved by name as a dimension's is, with the title block's text and fields, its place and its text height. drawing.note.add, .edit and .inspect, one undo step each, no model evaluated. Its one leader is worked out, never saved: a lost reference keeps the note and its text, with no leader. Anchor is one type so other symbols placed on a sheet can use it. A view's notes go with its copy and delete; a sheet's with the sheet. The plan left delete for later, but selection.delete now handles a drawing's objects, so notes join it. Balloons and notes share Lookup::middle. Drawing them waits for text in the paper scene (slice 12). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Application resources
assets/ is the design resource home for SolidCraft.
ATTRIBUTION.md is the file inventory and provenance record.
Keep one editable master per resource and place shipped derivatives in exports/.
assets/
icons/
app/
shared/source/ # original Rust mark and executable ICO encoder
macos/source/SolidCraft.icon/ # approved Composer project and linked SVGs
macos/exports/ # paired Assets.car and icon.icns
windows/exports/ # executable DIB ICO and installer PNG ICO
linux/exports/hicolor/ # Linux/FreeBSD package images, 16–512 px
ui/design/svg/ # authoritative original UI icon masters
ui/design/tools/ # authoring bases, checks and included review app
ui/source/ # Rust viewport glyphs, markers and navigation
branding/web/source/og.png # shared social preview card
styles/ui/palettes.rs # light/dark defaults
styles/web/loading.css # web loading/canvas styles
appearances/library.rs # built-in visual presets
materials/library.rs # physical defaults and colours
shaders/viewport.wgsl # original viewport shader
fonts/{liberation-sans,biz-udp-gothic}/ # unmodified fonts and OFL licences
locales/{en,de,ja,ko}.json # shared offline catalogs
platforms/{macos,linux,windows}/ # bundle, freedesktop and WiX templates
platforms/macos/dmg/ # disk image window: layout, dmgbuild settings, background art
archive/icons/macos-v1/
source/icon.vectorcraft # earlier editable work, retained
# redundant historical exports are retired
Editing and regeneration
UI artwork identifies the drawing masters and their consumers. Read the mandatory UI style guide before editing an icon. Edit SVG geometry and its command/UI assignments together; inspect both themes and small sizes. Temporary media and generated reports belong in ignored target/. Palettes and model presets are also editable Rust data.
The current macOS master is icons/app/macos/source/SolidCraft.icon/, including
its linked SVG layers and appearance settings. The earlier VectorCraft document
is preserved in the archive. No other native design projects were available for
the current UI set or preview card. Keep any future .vectorcraft, .ai or other
native work and linked inputs under that resource's source/work/, with an
attribution row; retain the editable document alongside its exports.
Regenerate all exports of the shared Windows/Linux/FreeBSD mark together:
cargo xtask app-icons
For macOS, use Xcode with Icon Composer support:
mkdir -p target/resources/macos-icon
xcrun actool assets/icons/app/macos/source/SolidCraft.icon \
--compile target/resources/macos-icon --platform macosx \
--minimum-deployment-target 11.0 --app-icon SolidCraft \
--output-partial-info-plist target/resources/macos-icon/icon-info.plist \
--output-format human-readable-text
cp target/resources/macos-icon/Assets.car assets/icons/app/macos/exports/Assets.car
cp target/resources/macos-icon/SolidCraft.icns assets/icons/app/macos/exports/icon.icns
Review and commit source changes and required exports together. Temporary renders,
tool caches and package staging belong under ignored target/ or dist/.
Normal builds use the committed exports and require no design applications.
The CLI still supports arbitrary PNG/ICO exports with solidcraft-cli icon.
Platform bindings
| Platform | Resources and output paths |
|---|---|
| macOS | Composer master and paired exports; bundle installs Assets.car and SolidCraft.icns |
| Windows executable | solidcraft-executable.ico: original DIB/mask representations at 16/24/32/48/64/128/256 px |
| Windows installer | solidcraft.ico: PNG representations at 16/20/24/32/40/48/64/128/256 px; SOLIDCRAFT_ICONS override retained |
| Linux, Nix, deb/rpm, tar, Flatpak, Snap | Copy canonical hicolor images; icon name stays io.tangencylabs.solidcraft |
| AppImage | Uses the Linux 256 px image and .DirIcon alias |
| FreeBSD | Shares Linux hicolor images and freedesktop metadata |
| Web | HTML/Trunk and manifest.webmanifest stay in apps/solidcraft-web/; copies Japanese font/licence to fonts/, uses the collected CSS, and copies the Linux 32/256/512 px images to icons/ for the favicon and installed app |
| Docs and link previews | xtask book copies the shared card to the existing /solidcraft/og.png public path |
Code and provenance
Resources remain compiled by their owning layer through existing APIs:
ui-egui::icons::paint_icon and Tokens at L5, model presets in L2 doc, and sketch
fonts at L1. State, projection, interaction, commands and GPU bindings stay in
their current modules. Embedded data uses CARGO_MANIFEST_DIR; application code
needs no runtime resource registry or repository lookup.
cargo xtask assets requires an exact attribution row for every collected file
except Markdown documentation, and continues checking file assets elsewhere in
the repository. This includes native work, Rust masters, catalogs, shaders and
platform templates. Packaging selects explicit current files and fails when
required inputs are absent. Archived artwork has no production consumers.
Dependency-owned egui fonts and vendored renderer shaders stay with their
libraries; their licences remain in THIRD-PARTY-LICENSES.txt and ATTRIBUTION.md.
System fonts, optional packs, user fonts/canvases/decals/materials and native OS
controls retain external ownership. Root licence/notice texts stay canonical.