diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index d59cf86e..3e5b4451 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -17,6 +17,25 @@ Generated-in-code assets are original and have no file to list: | File | Author | Source | Licence | |---|---|---|---| +| assets/icon.svg | SolidCraft contributors | original macOS adaptation of the code-drawn SolidCraft mark, edited and exported with VectorCraft; Apple HIG and production templates consulted as layout references only | MIT OR Apache-2.0 | +| assets/SolidCraft.icon/icon.json | SolidCraft contributors | approved Icon Composer composition and appearance settings for the original SolidCraft artwork | MIT OR Apache-2.0 | +| assets/SolidCraft.icon/Assets/01-background.svg | SolidCraft contributors | original full-square porcelain background exported from VectorCraft for system masking | MIT OR Apache-2.0 | +| assets/SolidCraft.icon/Assets/02-grid.svg | SolidCraft contributors | original perspective grid with elliptical radial alpha, exported from VectorCraft | MIT OR Apache-2.0 | +| assets/SolidCraft.icon/Assets/03-solid.svg | SolidCraft contributors | original blue CAD solid with white edges clipped to its silhouette, exported from VectorCraft | MIT OR Apache-2.0 | +| assets/Assets.car | SolidCraft contributors | Apple actool compilation of assets/SolidCraft.icon for macOS; contains original artwork only | MIT OR Apache-2.0 | +| assets/icon.vectorcraft | SolidCraft contributors | editable VectorCraft source for assets/icon.svg, with named face and background layers | MIT OR Apache-2.0 | +| assets/icon.png | SolidCraft contributors | 1024 × 1024 transparent sRGB export of assets/icon.svg from VectorCraft | MIT OR Apache-2.0 | +| assets/icon.icns | SolidCraft contributors | traditional macOS fallback packaged from assets/icon.png by Apple's iconutil | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_16x16.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_16x16@2x.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_32x32.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_32x32@2x.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_128x128.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_128x128@2x.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_256x256.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_256x256@2x.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_512x512.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | +| assets/icon.iconset/icon_512x512@2x.png | SolidCraft contributors | native sips export from assets/icon.png | MIT OR Apache-2.0 | | docs/screenshots/sample-plate.png | SolveCraft contributors | screenshot of SolveCraft itself (`solvecraft --sample`) | MIT OR Apache-2.0 | | docs/screenshots/enclosure-demo-0.2.1.gif | SolveCraft contributors | original electronics enclosure screen recording of the actual SolveCraft 0.2.1 English desktop UI, generated with examples/demo/record_ui.sh and its original animated pointer overlay (4× playback) | MIT OR Apache-2.0 | | docs/screenshots/enclosure-demo-0.2.1.mp4 | SolveCraft contributors | original electronics enclosure screen recording of the actual SolveCraft 0.2.1 English desktop UI, generated with examples/demo/record_ui.sh and its original animated pointer overlay (4× playback) | MIT OR Apache-2.0 | diff --git a/apps/solvecraft/src/main.rs b/apps/solvecraft/src/main.rs index 3267d450..dfc4a42b 100644 --- a/apps/solvecraft/src/main.rs +++ b/apps/solvecraft/src/main.rs @@ -12,6 +12,7 @@ #![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)] #![forbid(unsafe_code)] +#[cfg(not(target_os = "macos"))] #[path = "../../app_icon.rs"] mod app_icon; mod control_server; @@ -127,13 +128,15 @@ const STENCIL_BITS: u8 = 8; const MSAA: u16 = 4; fn app_viewport() -> Result { + // Let macOS use the bundle's layered icon; eframe's default bitmap would replace it. + #[cfg(target_os = "macos")] + let icon = egui::IconData::default(); + #[cfg(not(target_os = "macos"))] + let icon = + egui::IconData { rgba: app_icon::rgba(64).map_err(|e| eframe::Error::AppCreation(std::io::Error::other(e).into()))?, width: 64, height: 64 }; Ok(egui::ViewportBuilder::default() .with_title("SolidCraft") - .with_icon(egui::IconData { - rgba: app_icon::rgba(64).map_err(|e| eframe::Error::AppCreation(std::io::Error::other(e).into()))?, - width: 64, - height: 64, - }) + .with_icon(icon) .with_inner_size([1600.0, 1000.0]) .with_min_inner_size([960.0, 600.0]) .with_drag_and_drop(true) @@ -281,6 +284,15 @@ mod backend_tests { #[cfg(test)] mod icon_tests { + #[cfg(target_os = "macos")] + #[test] + fn macos_preserves_the_bundle_icon_instead_of_setting_a_runtime_bitmap() { + let viewport = super::app_viewport().expect("viewport"); + assert_eq!(viewport.icon.as_deref(), Some(&eframe::egui::IconData::default())); + assert_eq!(viewport.app_id.as_deref(), Some("ai.storyteller.solvecraft")); + } + + #[cfg(not(target_os = "macos"))] #[test] fn desktop_viewport_supplies_the_original_mark_to_the_window() { let viewport = super::app_viewport().expect("viewport"); diff --git a/assets/Assets.car b/assets/Assets.car new file mode 100644 index 00000000..0ebc5605 Binary files /dev/null and b/assets/Assets.car differ diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 00000000..483d3031 --- /dev/null +++ b/assets/README.md @@ -0,0 +1,48 @@ +# SolidCraft macOS icon + +`SolidCraft.icon/` is the approved Icon Composer source, containing separate +background, grid and solid SVG layers and the owner's appearance settings. +The white edges are clipped to the solid silhouette. Artwork is original and +attributed in `ATTRIBUTION.md`. + +`Assets.car` is compiled by Apple's `actool` and supplies the layered icon on +macOS 26 and later. It is checked in so the existing release workflow can still +package on older Xcode runners. After editing and saving `SolidCraft.icon`, +regenerate the catalog with Xcode 26 or later from the repository root: + +```sh +mkdir -p target/macos-icon +xcrun actool assets/SolidCraft.icon \ + --compile target/macos-icon --platform macosx \ + --minimum-deployment-target 11.0 --app-icon SolidCraft \ + --output-partial-info-plist target/macos-icon/icon-info.plist \ + --output-format human-readable-text +cp target/macos-icon/Assets.car assets/Assets.car +``` + +`icon.vectorcraft` and `icon.svg` preserve the traditional artwork before +Icon Composer's system material effects. `icon.png` is its transparent 1024 px +VectorCraft export with native rounded corners and optical padding. The +`icon.iconset/` variants and `icon.icns` provide the older-macOS fallback. +After re-exporting the traditional PNG, regenerate them with Apple's tools: + +```sh +for s in 16 32 128 256 512; do + sips -z "$s" "$s" assets/icon.png \ + --out "assets/icon.iconset/icon_${s}x${s}.png" >/dev/null + sips -z "$((s * 2))" "$((s * 2))" assets/icon.png \ + --out "assets/icon.iconset/icon_${s}x${s}@2x.png" >/dev/null +done +iconutil -c icns -o assets/icon.icns assets/icon.iconset +``` + +Only `packaging/macos/package.sh` consumes these resources. Its existing signed +app/DMG workflow copies the catalog and ICNS into `Contents/Resources`, and +`Info.plist` references `SolidCraft` through `CFBundleIconName` and +`CFBundleIconFile`. The macOS viewport opts out of eframe's runtime bitmap so +Finder, the Dock and the application switcher use the bundle icon. Other +platforms retain the existing code-drawn icon and packaging. + +Design references: [Apple app-icon HIG](https://developer.apple.com/design/human-interface-guidelines/app-icons) +and [Icon Composer documentation](https://developer.apple.com/documentation/xcode/creating-your-app-icon-using-icon-composer). +No Apple artwork is shipped. diff --git a/assets/SolidCraft.icon/Assets/01-background.svg b/assets/SolidCraft.icon/Assets/01-background.svg new file mode 100644 index 00000000..69c86349 --- /dev/null +++ b/assets/SolidCraft.icon/Assets/01-background.svg @@ -0,0 +1,13 @@ + + + + + + + + + Untitled-2 + + + + diff --git a/assets/SolidCraft.icon/Assets/02-grid.svg b/assets/SolidCraft.icon/Assets/02-grid.svg new file mode 100644 index 00000000..b9855a03 --- /dev/null +++ b/assets/SolidCraft.icon/Assets/02-grid.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + Untitled-2 + + + + + diff --git a/assets/SolidCraft.icon/Assets/03-solid.svg b/assets/SolidCraft.icon/Assets/03-solid.svg new file mode 100644 index 00000000..f9fbe5da --- /dev/null +++ b/assets/SolidCraft.icon/Assets/03-solid.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Untitled-2 + + + + + + + + + + + + diff --git a/assets/SolidCraft.icon/icon.json b/assets/SolidCraft.icon/icon.json new file mode 100644 index 00000000..5296c3a0 --- /dev/null +++ b/assets/SolidCraft.icon/icon.json @@ -0,0 +1,115 @@ +{ + "fill" : "system-light", + "groups" : [ + { + "layers" : [ + { + "glass-specializations" : [ + { + "appearance" : "tinted", + "value" : false + } + ], + "image-name" : "03-solid.svg", + "name" : "03-solid" + } + ], + "name" : "03 Solid", + "shadow" : { + "kind" : "none", + "opacity" : 0 + }, + "specular" : true, + "translucency" : { + "enabled" : false, + "value" : 0.3 + } + }, + { + "layers" : [ + { + "fill" : "none", + "glass-specializations" : [ + { + "value" : true + }, + { + "appearance" : "tinted", + "value" : false + } + ], + "hidden" : false, + "image-name" : "02-grid.svg", + "name" : "02-grid", + "opacity-specializations" : [ + { + "value" : 1 + }, + { + "appearance" : "tinted", + "value" : 1 + } + ] + } + ], + "name" : "02 Grid", + "shadow" : { + "kind" : "none", + "opacity" : 0 + }, + "specular" : false, + "translucency" : { + "enabled" : false, + "value" : 0.3 + } + }, + { + "layers" : [ + { + "fill" : "none", + "glass" : false, + "hidden" : false, + "image-name" : "01-background.svg", + "name" : "01-background", + "position-specializations" : [ + { + "value" : { + "scale" : 1, + "translation-in-points" : [ + 0, + 0 + ] + } + }, + { + "idiom" : "watchOS", + "value" : { + "scale" : 1.09, + "translation-in-points" : [ + 0, + 0 + ] + } + } + ] + } + ], + "name" : "01 Background", + "shadow" : { + "kind" : "none", + "opacity" : 0 + }, + "specular" : false, + "translucency" : { + "enabled" : false, + "value" : 0.3 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/assets/icon.icns b/assets/icon.icns new file mode 100644 index 00000000..561f60d0 Binary files /dev/null and b/assets/icon.icns differ diff --git a/assets/icon.iconset/icon_128x128.png b/assets/icon.iconset/icon_128x128.png new file mode 100644 index 00000000..8b9e9dab Binary files /dev/null and b/assets/icon.iconset/icon_128x128.png differ diff --git a/assets/icon.iconset/icon_128x128@2x.png b/assets/icon.iconset/icon_128x128@2x.png new file mode 100644 index 00000000..309ea4ee Binary files /dev/null and b/assets/icon.iconset/icon_128x128@2x.png differ diff --git a/assets/icon.iconset/icon_16x16.png b/assets/icon.iconset/icon_16x16.png new file mode 100644 index 00000000..ad4c4dc6 Binary files /dev/null and b/assets/icon.iconset/icon_16x16.png differ diff --git a/assets/icon.iconset/icon_16x16@2x.png b/assets/icon.iconset/icon_16x16@2x.png new file mode 100644 index 00000000..5a629192 Binary files /dev/null and b/assets/icon.iconset/icon_16x16@2x.png differ diff --git a/assets/icon.iconset/icon_256x256.png b/assets/icon.iconset/icon_256x256.png new file mode 100644 index 00000000..309ea4ee Binary files /dev/null and b/assets/icon.iconset/icon_256x256.png differ diff --git a/assets/icon.iconset/icon_256x256@2x.png b/assets/icon.iconset/icon_256x256@2x.png new file mode 100644 index 00000000..2d432f00 Binary files /dev/null and b/assets/icon.iconset/icon_256x256@2x.png differ diff --git a/assets/icon.iconset/icon_32x32.png b/assets/icon.iconset/icon_32x32.png new file mode 100644 index 00000000..5a629192 Binary files /dev/null and b/assets/icon.iconset/icon_32x32.png differ diff --git a/assets/icon.iconset/icon_32x32@2x.png b/assets/icon.iconset/icon_32x32@2x.png new file mode 100644 index 00000000..40cbf4c0 Binary files /dev/null and b/assets/icon.iconset/icon_32x32@2x.png differ diff --git a/assets/icon.iconset/icon_512x512.png b/assets/icon.iconset/icon_512x512.png new file mode 100644 index 00000000..2d432f00 Binary files /dev/null and b/assets/icon.iconset/icon_512x512.png differ diff --git a/assets/icon.iconset/icon_512x512@2x.png b/assets/icon.iconset/icon_512x512@2x.png new file mode 100644 index 00000000..36b7d736 Binary files /dev/null and b/assets/icon.iconset/icon_512x512@2x.png differ diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 00000000..36b7d736 Binary files /dev/null and b/assets/icon.png differ diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 00000000..e77f135c --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SolidCraft macOS application icon + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icon.vectorcraft b/assets/icon.vectorcraft new file mode 100644 index 00000000..7aa98dcf --- /dev/null +++ b/assets/icon.vectorcraft @@ -0,0 +1,2783 @@ +{ + "format": "vectorcraft", + "version": 4, + "generator": "VectorCraft 0.10.0", + "document": { + "version": 1, + "title": "SolidCraft macOS application icon", + "units": "Pixels", + "color_mode": "Rgb", + "artboards": [ + { + "id": 1, + "name": "Artboard 1", + "rect": { + "x0": 0.0, + "y0": 0.0, + "x1": 1024.0, + "y1": 1024.0 + }, + "show_center_mark": false, + "show_cross_hairs": false + } + ], + "layers": [ + { + "id": 1, + "name": "Layer 1", + "kind": { + "type": "layer", + "color": { + "Preset": 0 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 2, + "name": "Porcelain • legacy macOS silhouette", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.99215686, + "b": 0.99607843 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.8627451, + "g": 0.8901961, + "b": 0.92941177 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 512.0, + "y": 96.0 + }, + "end": { + "x": 512.0, + "y": 928.0 + }, + "aspect": 1.0 + }, + "angle": -90.0 + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ], + "effects": [ + { + "id": "stylize.dropShadow", + "params": { + "blur": 13, + "color": "#243047", + "mode": "multiply", + "opacity": 16, + "x": 0, + "y": 10 + }, + "visible": true + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 320.0, + 96.0 + ], + "in": [ + 166.0, + 96.0 + ] + }, + { + "p": [ + 704.0, + 96.0 + ], + "out": [ + 858.0, + 96.0 + ] + }, + { + "p": [ + 928.0, + 320.0 + ], + "in": [ + 928.0, + 166.0 + ] + }, + { + "p": [ + 928.0, + 704.0 + ], + "out": [ + 928.0, + 858.0 + ] + }, + { + "p": [ + 704.0, + 928.0 + ], + "in": [ + 858.0, + 928.0 + ] + }, + { + "p": [ + 320.0, + 928.0 + ], + "out": [ + 166.0, + 928.0 + ] + }, + { + "p": [ + 96.0, + 704.0 + ], + "in": [ + 96.0, + 858.0 + ] + }, + { + "p": [ + 96.0, + 320.0 + ], + "out": [ + 96.0, + 166.0 + ] + } + ], + "closed": true + } + ] + } + } + } + ] + } + }, + { + "id": 12, + "name": "Experiment • faint origin grid", + "kind": { + "type": "layer", + "color": { + "Custom": [ + 120, + 154, + 191 + ] + }, + "template": false, + "printable": true, + "children": [ + { + "id": 15, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 0.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 320.0, + 96.0 + ], + "in": [ + 166.0, + 96.0 + ] + }, + { + "p": [ + 704.0, + 96.0 + ], + "out": [ + 858.0, + 96.0 + ] + }, + { + "p": [ + 928.0, + 320.0 + ], + "in": [ + 928.0, + 166.0 + ] + }, + { + "p": [ + 928.0, + 704.0 + ], + "out": [ + 928.0, + 858.0 + ] + }, + { + "p": [ + 704.0, + 928.0 + ], + "in": [ + 858.0, + 928.0 + ] + }, + { + "p": [ + 320.0, + 928.0 + ], + "out": [ + 166.0, + 928.0 + ] + }, + { + "p": [ + 96.0, + 704.0 + ], + "in": [ + 96.0, + 858.0 + ] + }, + { + "p": [ + 96.0, + 320.0 + ], + "out": [ + 96.0, + 166.0 + ] + } + ], + "closed": true + } + ] + }, + "clipping": true + } + }, + { + "id": 13, + "name": "Grid • elliptical radial alpha beneath solid", + "opacity": 0.28, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.3, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 0.9, + "midpoint": 0.5 + }, + { + "offset": 0.65, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 0.35, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 0.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 512.0, + "y": 697.379008638268 + }, + "end": { + "x": 1080.5120000000002, + "y": 697.379008638268 + }, + "aspect": 0.4998857142857143 + }, + "angle": -0.0 + }, + "width": 3.2 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 80.0, + -200.0413747080408 + ] + }, + { + "p": [ + 944.0, + 297.95862529195887 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 297.95862529195887 + ] + }, + { + "p": [ + 944.0, + -200.0413747080408 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + -107.40989137285379 + ] + }, + { + "p": [ + 944.0, + 390.59010862714587 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 390.59010862714587 + ] + }, + { + "p": [ + 944.0, + -107.40989137285379 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + -14.778408037666793 + ] + }, + { + "p": [ + 944.0, + 483.22159196233287 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 483.22159196233287 + ] + }, + { + "p": [ + 944.0, + -14.778408037666793 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 77.8530752975202 + ] + }, + { + "p": [ + 944.0, + 575.8530752975198 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 575.8530752975198 + ] + }, + { + "p": [ + 944.0, + 77.8530752975202 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 170.4845586327072 + ] + }, + { + "p": [ + 944.0, + 668.4845586327069 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 668.4845586327069 + ] + }, + { + "p": [ + 944.0, + 170.4845586327072 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 263.1160419678942 + ] + }, + { + "p": [ + 944.0, + 761.1160419678938 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 761.1160419678938 + ] + }, + { + "p": [ + 944.0, + 263.1160419678942 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 355.7475253030812 + ] + }, + { + "p": [ + 944.0, + 853.7475253030809 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 853.7475253030809 + ] + }, + { + "p": [ + 944.0, + 355.7475253030812 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 541.0104919734551 + ] + }, + { + "p": [ + 944.0, + 1039.010491973455 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1039.010491973455 + ] + }, + { + "p": [ + 944.0, + 541.0104919734551 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 633.6419753086423 + ] + }, + { + "p": [ + 944.0, + 1131.6419753086418 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1131.6419753086418 + ] + }, + { + "p": [ + 944.0, + 633.6419753086423 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 726.2734586438291 + ] + }, + { + "p": [ + 944.0, + 1224.273458643829 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1224.273458643829 + ] + }, + { + "p": [ + 944.0, + 726.2734586438291 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 818.9049419790163 + ] + }, + { + "p": [ + 944.0, + 1316.9049419790158 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1316.9049419790158 + ] + }, + { + "p": [ + 944.0, + 818.9049419790163 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 911.5364253142031 + ] + }, + { + "p": [ + 944.0, + 1409.5364253142027 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1409.5364253142027 + ] + }, + { + "p": [ + 944.0, + 911.5364253142031 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1004.1679086493903 + ] + }, + { + "p": [ + 944.0, + 1502.1679086493898 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 1502.1679086493898 + ] + }, + { + "p": [ + 944.0, + 1004.1679086493903 + ] + } + ], + "closed": false + } + ] + } + } + }, + { + "id": 14, + "name": "Origin axes • shared elliptical radial alpha", + "opacity": 0.28, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 0.3, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 0.9, + "midpoint": 0.5 + }, + { + "offset": 0.65, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 0.35, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.3137255, + "g": 0.49411765, + "b": 0.6666667 + }, + "opacity": 0.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 512.0, + "y": 697.379008638268 + }, + "end": { + "x": 1080.5120000000002, + "y": 697.379008638268 + }, + "aspect": 0.4998857142857143 + }, + "angle": -0.0 + }, + "width": 3.6 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 80.0, + 448.3790086382682 + ] + }, + { + "p": [ + 944.0, + 946.3790086382678 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 80.0, + 946.3790086382678 + ] + }, + { + "p": [ + 944.0, + 448.3790086382682 + ] + } + ], + "closed": false + } + ] + } + } + } + ], + "clip": true + } + }, + { + "id": 3, + "name": "SolidCraft • machined solid", + "kind": { + "type": "layer", + "color": { + "Preset": 1 + }, + "template": false, + "printable": true, + "children": [ + { + "id": 4, + "name": "Solid silhouette", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.15686275, + "g": 0.39215687, + "b": 0.72156864 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 512.0, + 139.358024691358 + ] + }, + { + "p": [ + 672.71004337671, + 231.98950802654502 + ] + }, + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + }, + { + "p": [ + 833.4200867534202, + 511.0 + ] + }, + { + "p": [ + 833.4200867534202, + 697.3790086382679 + ] + }, + { + "p": [ + 512.0, + 882.641975308642 + ] + }, + { + "p": [ + 351.2899566232899, + 790.0104919734549 + ] + }, + { + "p": [ + 351.2899566232899, + 603.631483335187 + ] + }, + { + "p": [ + 190.5799132465799, + 511.0 + ] + }, + { + "p": [ + 190.5799132465799, + 325.7370333296259 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 5, + "name": "Top • extruded profile", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.5529412, + "g": 0.76862746, + "b": 0.9882353 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.3647059, + "g": 0.62352943, + "b": 0.92156863 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 409.32413895376857, + "y": 139.358024691358 + }, + "end": { + "x": 520.9283357431506, + "y": 511.0 + }, + "aspect": 1.0 + }, + "angle": -73.2849718051073 + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 190.5799132465799, + 325.7370333296259 + ] + }, + { + "p": [ + 512.0, + 139.358024691358 + ] + }, + { + "p": [ + 672.71004337671, + 231.98950802654502 + ] + }, + { + "p": [ + 512.0, + 325.7370333296259 + ] + }, + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + }, + { + "p": [ + 512.0, + 511.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 6, + "name": "Left • stepped face", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.2627451, + "g": 0.56078434, + "b": 0.92156863 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.16862746, + "g": 0.44705883, + "b": 0.8117647 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 264.238683127572, + "y": 342.4776628480332 + }, + "end": { + "x": 442.8053979905832, + "y": 882.641975308642 + }, + "aspect": 1.0 + }, + "angle": -71.70722403543496 + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 190.5799132465799, + 325.7370333296259 + ] + }, + { + "p": [ + 512.0, + 511.0 + ] + }, + { + "p": [ + 512.0, + 882.641975308642 + ] + }, + { + "p": [ + 351.2899566232899, + 790.0104919734549 + ] + }, + { + "p": [ + 351.2899566232899, + 603.631483335187 + ] + }, + { + "p": [ + 190.5799132465799, + 511.0 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 7, + "name": "Right • milled recess", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.15686275, + "g": 0.4117647, + "b": 0.7411765 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.11764706, + "g": 0.3019608, + "b": 0.59607846 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 610.2116931746561, + "y": 420.60060060060056 + }, + "end": { + "x": 732.9763096429764, + "y": 882.641975308642 + }, + "aspect": 1.0 + }, + "angle": -75.12027824799682 + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 512.0, + 511.0 + ] + }, + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + }, + { + "p": [ + 672.71004337671, + 603.631483335187 + ] + }, + { + "p": [ + 833.4200867534202, + 511.0 + ] + }, + { + "p": [ + 833.4200867534202, + 697.3790086382679 + ] + }, + { + "p": [ + 512.0, + 882.641975308642 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 8, + "name": "Top • lower step", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.5137255, + "g": 0.7294118, + "b": 0.9647059 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.33333334, + "g": 0.5921569, + "b": 0.9019608 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 599.051273495718, + "y": 431.7610202795388 + }, + "end": { + "x": 738.5565194824454, + "y": 588.0068957846736 + }, + "aspect": 1.0 + }, + "angle": -48.239700296102136 + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + }, + { + "p": [ + 833.4200867534202, + 511.0 + ] + }, + { + "p": [ + 672.71004337671, + 603.631483335187 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 9, + "name": "Inner • upper step", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.1882353, + "g": 0.42352942, + "b": 0.7372549 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.32156864, + "b": 0.6117647 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "geom": { + "start": { + "x": 599.051273495718, + "y": 242.0338857375894 + }, + "end": { + "x": 660.433581729878, + "y": 418.3685166648129 + }, + "aspect": 1.0 + }, + "angle": -70.80692820925006 + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 1.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 672.71004337671, + 231.98950802654502 + ] + }, + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + }, + { + "p": [ + 512.0, + 325.7370333296259 + ] + } + ], + "closed": true + } + ] + } + } + }, + { + "id": 17, + "kind": { + "type": "group", + "children": [ + { + "id": 16, + "name": "Blue-face silhouette • white edge mask", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "none" + }, + "width": 0.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 512.0, + 139.358024691358 + ] + }, + { + "p": [ + 672.71004337671, + 231.98950802654502 + ] + }, + { + "p": [ + 672.71004337671, + 394.87660985577554 + ] + }, + { + "p": [ + 694.4447465574972, + 406.9569172160034 + ] + }, + { + "p": [ + 693.3946760755761, + 430.29090912318713 + ] + }, + { + "p": [ + 833.4200867534202, + 511.0 + ] + }, + { + "p": [ + 833.4200867534202, + 697.3790086382679 + ] + }, + { + "p": [ + 512.0, + 882.641975308642 + ] + }, + { + "p": [ + 351.2899566232899, + 790.0104919734549 + ] + }, + { + "p": [ + 351.2899566232899, + 603.631483335187 + ] + }, + { + "p": [ + 190.5799132465799, + 511.0 + ] + }, + { + "p": [ + 190.5799132465799, + 325.7370333296259 + ] + } + ], + "closed": true + } + ] + }, + "clipping": true + } + }, + { + "id": 10, + "name": "Cut edges • original SolidCraft topology", + "opacity": 0.88, + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.9607843, + "b": 1.0 + } + }, + "width": 23.0 + } + ] + }, + "kind": { + "type": "path", + "path": { + "subpaths": [ + { + "anchors": [ + { + "p": [ + 190.5799132465799, + 325.7370333296259 + ] + }, + { + "p": [ + 512.0, + 511.0 + ] + }, + { + "p": [ + 512.0, + 882.641975308642 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 512.0, + 511.0 + ] + }, + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + } + ], + "closed": false + }, + { + "anchors": [ + { + "p": [ + 672.71004337671, + 231.98950802654502 + ] + }, + { + "p": [ + 512.0, + 325.7370333296259 + ] + }, + { + "p": [ + 672.71004337671, + 418.36851666481294 + ] + }, + { + "p": [ + 672.71004337671, + 603.631483335187 + ] + }, + { + "p": [ + 833.4200867534202, + 511.0 + ] + } + ], + "closed": false + } + ] + } + } + } + ], + "clip": true + } + } + ] + } + } + ], + "swatches": [ + { + "name": "[None]", + "paint": { + "type": "none" + }, + "global": false, + "spot": false + }, + { + "name": "White", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Black", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.10980392, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Orange", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.96862745, + "g": 0.5764706, + "b": 0.11764706 + } + }, + "global": false, + "spot": false + }, + { + "name": "Amber", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9882353, + "g": 0.93333334, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Yellow Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8509804, + "g": 0.8784314, + "b": 0.12941177 + } + }, + "global": false, + "spot": false + }, + { + "name": "Lime", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.7764706, + "b": 0.24705882 + } + }, + "global": false, + "spot": false + }, + { + "name": "Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.22352941, + "g": 0.70980394, + "b": 0.2901961 + } + }, + "global": false, + "spot": false + }, + { + "name": "Emerald", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.57254905, + "b": 0.27058825 + } + }, + "global": false, + "spot": false + }, + { + "name": "Teal", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.40784314, + "b": 0.21568628 + } + }, + "global": false, + "spot": false + }, + { + "name": "Aqua", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.13333334, + "g": 0.70980394, + "b": 0.4509804 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.6627451, + "b": 0.6156863 + } + }, + "global": false, + "spot": false + }, + { + "name": "Cyan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + } + }, + "global": false, + "spot": false + }, + { + "name": "Azure", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.44313726, + "b": 0.7372549 + } + }, + "global": false, + "spot": false + }, + { + "name": "Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + } + }, + "global": false, + "spot": false + }, + { + "name": "Indigo", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + }, + "global": false, + "spot": false + }, + { + "name": "Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4, + "g": 0.1764706, + "b": 0.5686275 + } + }, + "global": false, + "spot": false + }, + { + "name": "Purple", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.5764706, + "g": 0.15294118, + "b": 0.56078434 + } + }, + "global": false, + "spot": false + }, + { + "name": "Magenta", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.61960787, + "g": 0.0, + "b": 0.3647059 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rose", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + } + }, + "global": false, + "spot": false + }, + { + "name": "Pink", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.92941177, + "g": 0.11764706, + "b": 0.4745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Brown", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.78039217, + "g": 0.69803923, + "b": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "Tan", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6, + "g": 0.5254902, + "b": 0.45882353 + } + }, + "global": false, + "spot": false + }, + { + "name": "Coffee", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.4509804, + "g": 0.3882353, + "b": 0.34117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Chocolate", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3254902, + "g": 0.2784314, + "b": 0.25490198 + } + }, + "global": false, + "spot": false + }, + { + "name": "Sand", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.7764706, + "g": 0.6117647, + "b": 0.42745098 + } + }, + "global": false, + "spot": false + }, + { + "name": "Copper", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.6509804, + "g": 0.4862745, + "b": 0.32156864 + } + }, + "global": false, + "spot": false + }, + { + "name": "Rust", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.54901963, + "g": 0.38431373, + "b": 0.22352941 + } + }, + "global": false, + "spot": false + }, + { + "name": "Walnut", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.45882353, + "g": 0.29803923, + "b": 0.14117648 + } + }, + "global": false, + "spot": false + }, + { + "name": "Espresso", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.3764706, + "g": 0.21960784, + "b": 0.07450981 + } + }, + "global": false, + "spot": false + }, + { + "name": "White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Radial White, Black", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Radial", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Sunset", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.83137256, + "g": 0.078431375, + "b": 0.3529412 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + }, + { + "name": "Ocean", + "paint": { + "type": "gradient", + "gradient": { + "kind": "Linear", + "stops": [ + { + "offset": 0.0, + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.67058825, + "b": 0.8862745 + }, + "opacity": 1.0, + "midpoint": 0.5 + }, + { + "offset": 1.0, + "color": { + "model": "rgb", + "r": 0.18039216, + "g": 0.19215687, + "b": 0.57254905 + }, + "opacity": 1.0, + "midpoint": 0.5 + } + ] + }, + "angle": 0.0 + }, + "global": false, + "spot": false + } + ], + "swatch_groups": [ + { + "name": "Grays", + "swatches": [ + { + "name": "K=90", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.9 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=80", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.8 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=70", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.7 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=60", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.6 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=50", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.5 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=40", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.4 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=30", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.3 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=20", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.2 + } + }, + "global": false, + "spot": false + }, + { + "name": "K=10", + "paint": { + "type": "solid", + "color": { + "model": "gray", + "k": 0.1 + } + }, + "global": false, + "spot": false + } + ] + }, + { + "name": "Brights", + "swatches": [ + { + "name": "Bright Red", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.11372549, + "b": 0.14509805 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Yellow", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 0.9019608, + "b": 0.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Green", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.9019608, + "b": 0.4627451 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Blue", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.16078432, + "g": 0.4745098, + "b": 1.0 + } + }, + "global": false, + "spot": false + }, + { + "name": "Bright Violet", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.8352941, + "g": 0.0, + "b": 0.9764706 + } + }, + "global": false, + "spot": false + } + ] + } + ], + "graphic_styles": [ + { + "name": "Default Graphic Style", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 1.0, + "g": 1.0, + "b": 1.0 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 1, + "unit_box": true + }, + { + "name": "Black Outline", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "none" + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 1.0 + } + ] + }, + "id": 2, + "unit_box": true + }, + { + "name": "Heavy Ink", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.105882354, + "g": 0.078431375, + "b": 0.39215687 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.0, + "g": 0.0, + "b": 0.0 + } + }, + "width": 4.0 + } + ] + }, + "id": 3, + "unit_box": true + }, + { + "name": "Sunshine", + "appearance": { + "items": [ + { + "kind": "fill", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.9843137, + "g": 0.6901961, + "b": 0.23137255 + } + } + }, + { + "kind": "stroke", + "paint": { + "type": "solid", + "color": { + "model": "rgb", + "r": 0.94509804, + "g": 0.3529412, + "b": 0.14117648 + } + }, + "width": 2.0 + } + ] + }, + "id": 4, + "unit_box": true + } + ], + "symbols": [], + "guides": [], + "grid": { + "spacing": 72.0, + "subdivisions": 8 + }, + "raster_effects_ppi": 72.0, + "images": {}, + "next_id": 18, + "metadata": { + "author": "", + "authorTitle": "", + "description": "", + "keywords": [], + "rating": 0, + "copyrightStatus": "unknown", + "copyrightNotice": "", + "copyrightUrl": "", + "created": 1791828637, + "modified": null + } + }, + "images": {} +} \ No newline at end of file diff --git a/packaging/macos/Info.plist.in b/packaging/macos/Info.plist.in index 547172df..f12ee746 100644 --- a/packaging/macos/Info.plist.in +++ b/packaging/macos/Info.plist.in @@ -28,6 +28,8 @@ @VERSION@ CFBundleIconFile SolidCraft + CFBundleIconName + SolidCraft LSApplicationCategoryType public.app-category.graphics-design diff --git a/packaging/macos/package.sh b/packaging/macos/package.sh index 4b0b2ac7..41ef3eb5 100755 --- a/packaging/macos/package.sh +++ b/packaging/macos/package.sh @@ -62,14 +62,10 @@ done echo "==> assembling $APP" mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" cp "$WORK/bin/solidcraft" "$APP/Contents/MacOS/SolidCraft" -# The icon, drawn by the CLI (no image files are committed). -SET="$WORK/SolidCraft.iconset" -mkdir -p "$SET" -for s in 16 32 128 256 512; do - "$WORK/bin/solidcraft-cli" icon --size "$s" --out "$SET/icon_${s}x${s}.png" >/dev/null - "$WORK/bin/solidcraft-cli" icon --size $((s * 2)) --out "$SET/icon_${s}x${s}@2x.png" >/dev/null -done -iconutil -c icns -o "$APP/Contents/Resources/SolidCraft.icns" "$SET" +# Apple-compiled layered icon and older-macOS fallback (regeneration: assets/README.md). +# Keep compiled resources so packaging also works on runners with older Xcode versions. +cp "$ROOT/assets/Assets.car" "$APP/Contents/Resources/Assets.car" +cp "$ROOT/assets/icon.icns" "$APP/Contents/Resources/SolidCraft.icns" mkdir -p "$APP/Contents/Resources/Licenses" copy_docs "$APP/Contents/Resources/Licenses" sed -e "s/@VERSION@/$VERSION/g" -e "s/@SHORT_VERSION@/$SHORT_VERSION/g" "$HERE/Info.plist.in" >"$APP/Contents/Info.plist" @@ -100,11 +96,13 @@ ls -la "$MNT" "$MNT/SolidCraft.app/Contents" "$MNT/SolidCraft.app/Contents/MacOS test -L "$MNT/Applications" && test "$(readlink "$MNT/Applications")" = /Applications plutil -lint "$MNT/SolidCraft.app/Contents/Info.plist" # Check the names Finder/LaunchServices actually use, and the bundle identity. -for key in CFBundleName CFBundleDisplayName CFBundleExecutable CFBundleIconFile; do +for key in CFBundleName CFBundleDisplayName CFBundleExecutable CFBundleIconFile CFBundleIconName; do test "$(/usr/libexec/PlistBuddy -c "Print :$key" "$MNT/SolidCraft.app/Contents/Info.plist")" = SolidCraft done test "$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$MNT/SolidCraft.app/Contents/Info.plist")" = "$MACOS_BUNDLE_ID" test -s "$MNT/SolidCraft.app/Contents/Resources/SolidCraft.icns" +cmp "$ROOT/assets/icon.icns" "$MNT/SolidCraft.app/Contents/Resources/SolidCraft.icns" +cmp "$ROOT/assets/Assets.car" "$MNT/SolidCraft.app/Contents/Resources/Assets.car" cmp "$HERE/README.txt" "$MNT/README.txt" case "$ARCH" in universal) WANT=(arm64 x86_64) ;; aarch64) WANT=(arm64) ;; *) WANT=(x86_64) ;; esac for arch in "${WANT[@]}"; do