Add FigCraft to the Craft App Suite

The thirteenth app: catalog row, details page with four pictures, icon, tagline in every
language, Linux desktop entry, and the lists in the docs and packaging.

- Details pictures move to craft-launcher-assets v2, which adds figcraft/.
- The MSI wizard's icon grid is four to a row in 30 px cells, so thirteen icons fit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
BFlatandClaude Opus 5.5 committed 2026-10-13 21:51:10 +07:00
1 parent d6fdab6596
commit ba8ec97900
24 files changed
+92 -31

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
ArtCraft Launcher installs, updates and launches the **Craft App Suite** (PhotoCraft, LightCraft,
FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft,
CADCraft, SoundCraft). It is written in **Rust only** (no JavaScript or TypeScript): the desktop
CADCraft, SoundCraft, FigCraft). It is written in **Rust only** (no JavaScript or TypeScript): the desktop
app is native egui/eframe, and the web build is the same Rust compiled to WebAssembly (trunk +
wasm-bindgen). **No Tauri, Electron or webview shells**, ever.
+1
View File
@@ -42,6 +42,7 @@ licensed like those apps. Refresh them from the source path, never redraw them.
| `assets/app-icons/gridcraft.png` | GridCraft app icon (app icon), 128 px | ArtCraft Team and the GridCraft contributors | [`storytold/gridcraft`](https://github.com/storytold/gridcraft) `assets/app-icon/hicolor/128x128/apps/ai.storyteller.gridcraft.png`, copied unmodified | MIT OR Apache-2.0 (GridCraft's [`LICENSE-MIT`](https://github.com/storytold/gridcraft/blob/main/LICENSE-MIT), [`LICENSE-APACHE`](https://github.com/storytold/gridcraft/blob/main/LICENSE-APACHE)) |
| `assets/app-icons/cadcraft.png` | CADCraft app icon (app icon), 128 px | ArtCraft Team and the CADCraft contributors | [`storytold/cadcraft`](https://github.com/storytold/cadcraft) `assets/app-icon/hicolor/128x128/apps/ai.storyteller.cadcraft.png`, copied unmodified | MIT OR Apache-2.0 (CADCraft's [`LICENSE-MIT`](https://github.com/storytold/cadcraft/blob/main/LICENSE-MIT), [`LICENSE-APACHE`](https://github.com/storytold/cadcraft/blob/main/LICENSE-APACHE)) |
| `assets/app-icons/soundcraft.png` | SoundCraft app icon (nightingale (placeholder)), 128 px | ArtCraft Team and the SoundCraft contributors | [`storytold/soundcraft`](https://github.com/storytold/soundcraft) `assets/app-icon/hicolor/128x128/apps/ai.storyteller.soundcraft.png`, copied unmodified | MIT OR Apache-2.0 (SoundCraft's [`LICENSE-MIT`](https://github.com/storytold/soundcraft/blob/main/LICENSE-MIT), [`LICENSE-APACHE`](https://github.com/storytold/soundcraft/blob/main/LICENSE-APACHE)) |
| `assets/app-icons/figcraft.png` | FigCraft app icon (chameleon), 128 px | ArtCraft Team and the FigCraft contributors | [`storytold/figcraft`](https://github.com/storytold/figcraft) `assets/app-icon/hicolor/128x128/apps/ai.storyteller.figcraft.png`, copied unmodified | MIT OR Apache-2.0 (FigCraft's [`LICENSE-MIT`](https://github.com/storytold/figcraft/blob/main/LICENSE-MIT), [`LICENSE-APACHE`](https://github.com/storytold/figcraft/blob/main/LICENSE-APACHE)) |
## Documentation and README
+2 -1
View File
@@ -12,7 +12,7 @@
<p align="center">
<b>One place to install, update and open every app in the Craft App Suite, rebuilt in pure Rust.</b><br>
PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft,<br>
DeckCraft, GridCraft, CADCraft and SoundCraft: the right build for your computer, kept up to date.
DeckCraft, GridCraft, CADCraft, SoundCraft and FigCraft: the right build for your computer, kept up to date.
</p>
<p align="center">
@@ -247,6 +247,7 @@ stand on its own.
| <img src="https://raw.githubusercontent.com/storytold/deckcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.deckcraft.png" alt="" width="32" height="32"> | **DeckCraft** | Presentations and slide decks | [GitHub](https://github.com/storytold/deckcraft) | [Website](https://getartcraft.com/apps/deckcraft) |
| <img src="https://raw.githubusercontent.com/storytold/cadcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.cadcraft.png" alt="" width="32" height="32"> | **CADCraft** | Computer-aided design | [GitHub](https://github.com/storytold/cadcraft) | [Website](https://getartcraft.com/apps/cadcraft) |
| <img src="https://raw.githubusercontent.com/storytold/soundcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.soundcraft.png" alt="" width="32" height="32"> | **SoundCraft** | Audio recording and editing | [GitHub](https://github.com/storytold/soundcraft) | [Website](https://getartcraft.com/apps/soundcraft) |
| <img src="https://raw.githubusercontent.com/storytold/figcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.figcraft.png" alt="" width="32" height="32"> | **FigCraft** | Interface design and prototyping | [GitHub](https://github.com/storytold/figcraft) | [Website](https://getartcraft.com/apps/figcraft) |
And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video studio for artists who want real control.
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+14 -6
View File
@@ -1,4 +1,4 @@
//! The Craft App Suite: the twelve apps the launcher knows about.
//! The Craft App Suite: the thirteen apps the launcher knows about.
//!
//! The list is data so a later version can fetch it from an API; [`SUITE`] is the built-in copy.
//!
@@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize};
pub enum AppGroup {
/// The seven original apps.
Classic,
/// The five apps added after them.
/// The six apps added after them.
New,
}
@@ -94,8 +94,8 @@ const fn app(
CraftApp { id, name, tagline, group, color, ink_light, ink_dark, repo, former_ids: &[], former_names: &[] }
}
/// The Craft App Suite, in display order: the seven classic apps, then the five new ones.
pub const SUITE: [CraftApp; 12] = [
/// The Craft App Suite, in display order: the seven classic apps, then the six new ones.
pub const SUITE: [CraftApp; 13] = [
app(
"photocraft",
"PhotoCraft",
@@ -196,6 +196,14 @@ pub const SUITE: [CraftApp; 12] = [
[[0x1f, 0xa5, 0xc9], [0x0e, 0x72, 0x90], [0x5f, 0xd0, 0xee]],
"storytold/soundcraft",
),
app(
"figcraft",
"FigCraft",
"Interface design and prototyping",
AppGroup::New,
[[0x02, 0xda, 0x96], [0x01, 0x7a, 0x54], [0x3f, 0xe6, 0xae]],
"storytold/figcraft",
),
];
/// ArtCraft's website.
@@ -239,9 +247,9 @@ mod tests {
use super::*;
#[test]
fn suite_has_seven_classic_and_five_new_apps_with_unique_ids() {
fn suite_has_seven_classic_and_six_new_apps_with_unique_ids() {
assert_eq!(SUITE.iter().filter(|a| a.group == AppGroup::Classic).count(), 7);
assert_eq!(SUITE.iter().filter(|a| a.group == AppGroup::New).count(), 5);
assert_eq!(SUITE.iter().filter(|a| a.group == AppGroup::New).count(), 6);
let mut ids: Vec<_> = SUITE.iter().map(|a| a.id).collect();
ids.sort_unstable();
ids.dedup();
+40 -3
View File
@@ -53,7 +53,7 @@ const fn feature(title: &'static str, text: &'static str) -> Feature {
pub const SCREENSHOTS_BASE: &str = "https://raw.githubusercontent.com/storytold/craft-launcher-assets";
/// The tag of the pictures repository the launcher reads. Also part of the saved copies' path.
pub const SCREENSHOTS_REV: &str = "v1";
pub const SCREENSHOTS_REV: &str = "v2";
/// The largest picture the launcher accepts. The real ones are 60 to 150 KB.
pub const MAX_SCREENSHOT_BYTES: usize = 2 << 20;
@@ -67,7 +67,7 @@ pub fn looks_like_jpeg(bytes: &[u8]) -> bool {
/// Where every Craft App runs (getartcraft.com lists the same for each of them).
const PLATFORMS: &str = "macOS, Windows, Linux, FreeBSD, web";
pub const DETAILS: [AppDetails; 12] = [
pub const DETAILS: [AppDetails; 13] = [
AppDetails {
id: "photocraft",
headline: "The image editor you already know how to use.",
@@ -371,6 +371,43 @@ pub const DETAILS: [AppDetails; 12] = [
],
platforms: PLATFORMS,
},
AppDetails {
id: "figcraft",
headline: "Interface design, rebuilt in pure Rust.",
about: "Frames, auto layout, components and variants, vector networks, styles, variables and prototypes in a \
native app that opens instantly and works offline. No account, no telemetry and no subscription. \
Early alpha.",
features: &[
feature("Familiar by design", "The toolbar, layers panel, Design panel, menus and shortcuts sit where your hands expect them."),
feature(
"Layouts that build themselves",
"Auto layout in both directions with wrap and grid, padding, gaps and Hug, Fill and Fixed sizing, plus constraints and layout grids.",
),
feature(
"Components that scale",
"Instances with overrides that survive edits, component sets with variants and properties, and styles and variables with light and dark modes.",
),
feature(
"Real vector networks",
"Pen and pencil, a shape builder, booleans whose operands stay editable, variable-width strokes and smooth corners.",
),
feature(
"Prototype and hand off",
"Connections, triggers and animated transitions, a presentation view, and Dev Mode with measurements, annotations and generated code.",
),
feature(
"Agent-ready",
"Every menu item, tool and gesture is a command, available over the CLI, a JSON control channel or an MCP server.",
),
],
shots: &[
shot("hero", "Auto layout screens in light and dark"),
shot("components", "Components, variants and the Assets panel"),
shot("prototype", "Prototype connections and flows"),
shot("dev-mode", "Dev Mode with annotations and generated code"),
],
platforms: PLATFORMS,
},
];
impl AppDetails {
@@ -417,7 +454,7 @@ mod tests {
let page = AppDetails::by_id("photocraft").unwrap();
assert_eq!(
page.screenshot_url("demo").as_deref(),
Some("https://raw.githubusercontent.com/storytold/craft-launcher-assets/v1/photocraft/demo.jpg")
Some("https://raw.githubusercontent.com/storytold/craft-launcher-assets/v2/photocraft/demo.jpg")
);
for key in ["", "nope", "../vectorcraft/neon", "demo/../masks", "demo.jpg", "/etc/passwd", "demo?x=1", "demo#"] {
assert_eq!(page.screenshot_url(key), None, "{key:?}");
+1
View File
@@ -31,6 +31,7 @@ pub fn meta(app: &CraftApp) -> (&'static str, Option<&'static str>) {
"gridcraft" => ("Office;Spreadsheet;", None),
"cadcraft" => ("Graphics;Engineering;VectorGraphics;", None),
"soundcraft" => ("AudioVideo;Audio;Midi;Mixer;Sequencer;Recorder;", None),
"figcraft" => ("Graphics;2DGraphics;VectorGraphics;X-Design;", Some("figcraft")),
_ => ("Graphics;", None),
}
}
+1
View File
@@ -746,6 +746,7 @@ pub(crate) mod linux {
"gridcraft" => include_bytes!("../../../assets/app-icons/gridcraft.png"),
"cadcraft" => include_bytes!("../../../assets/app-icons/cadcraft.png"),
"soundcraft" => include_bytes!("../../../assets/app-icons/soundcraft.png"),
"figcraft" => include_bytes!("../../../assets/app-icons/figcraft.png"),
_ => return None,
})
}
+1
View File
@@ -152,6 +152,7 @@ deckcraft Presentations and slide shows Prezentace a promítání snímků
gridcraft Spreadsheets and data Tabulky a data
cadcraft Computer-aided design and drafting Počítačem podporované navrhování a kreslení
soundcraft Recording, editing and mixing audio Nahrávání, úpravy a mixování zvuku
figcraft Interface design and prototyping Návrh rozhraní a prototypování
month Jan 1.
month Feb 2.
month Mar 3.
1 # Czech (cs) catalog for ArtCraft Launcher.
152 cadcraft
153 soundcraft
154 month figcraft
155 month
156 month
157 month
158 month
+2 -1
View File
@@ -14,7 +14,7 @@
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite",
# app names (PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft,
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft), "GitHub", "Discord".
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft), "GitHub", "Discord".
# Shortcut keys keep their key-cap names (Shift, Alt, Ctrl, Cmd, Esc).
# Trailing "…" (U+2026) must be preserved. Placeholders {name}, {n}, {version}, {count}, {v},
# {what}, {unit}, {real}, {e} must appear in translation.
@@ -170,6 +170,7 @@ deckcraft Presentations and slide shows Präsentationen und Diashows
gridcraft Spreadsheets and data Tabellenkalkulation und Daten
cadcraft Computer-aided design and drafting Computergestütztes Konstruieren und Zeichnen
soundcraft Recording, editing and mixing audio Audio aufnehmen, bearbeiten und mischen
figcraft Interface design and prototyping Interface-Design und Prototyping
# Contextual: month abbreviations for date rendering
month Jan Jan.
Can't render this file because it contains an unexpected character in line 11 and column 16.
+2 -1
View File
@@ -14,7 +14,7 @@
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft,
# DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,
# SoundCraft), "GitHub", "Discord", "Finder", "makers".
# SoundCraft, FigCraft), "GitHub", "Discord", "Finder", "makers".
# Trailing "…" (U+2026) must be preserved. Placeholders must appear in the translation:
# {ago}, {a}, {b}, {count}, {date}, {day}, {done}, {e}, {f}, {installed}, {latest}, {min},
# {month}, {name}, {n}, {os}, {platform}, {sources}, {total}, {version}, {v}, {year}.
@@ -165,6 +165,7 @@ deckcraft Presentations and slide shows Presentaciones y diapositivas
gridcraft Spreadsheets and data Hojas de cálculo y datos
cadcraft Computer-aided design and drafting CAD: diseño y dibujo técnico
soundcraft Recording, editing and mixing audio Grabación, edición y mezcla de audio
figcraft Interface design and prototyping Diseño de interfaces y prototipado
month Jan ene.
month Feb feb.
month Mar mar.
Can't render this file because it contains an unexpected character in line 5 and column 48.
+2 -1
View File
@@ -12,7 +12,7 @@
# Coverage: the whole interface: every menu string and tl! literal (complete_menus = true).
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft,
# PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft), "GitHub",
# PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft), "GitHub",
# "Discord".
# Trailing "…" (U+2026) must be preserved. Placeholders {name}, {n}, {version}, {count}, {v},
# {what}, {unit}, {real}, {e} must appear in translation.
@@ -168,6 +168,7 @@ deckcraft Presentations and slide shows Présentations et diaporamas
gridcraft Spreadsheets and data Tableurs et données
cadcraft Computer-aided design and drafting Conception et dessin assistés par ordinateur
soundcraft Recording, editing and mixing audio Enregistrement, édition et mixage audio
figcraft Interface design and prototyping Design d'interfaces et prototypage
# Contextual: month abbreviations for date rendering
month Jan janv.
Can't render this file because it contains an unexpected character in line 5 and column 50.
+2 -1
View File
@@ -14,7 +14,7 @@
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite",
# app names (PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft,
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft), "GitHub", "Discord".
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft), "GitHub", "Discord".
# Shortcut keys keep their key-cap names (Shift, Alt, Ctrl, Cmd, Esc).
# Trailing "…" (U+2026) must be preserved. Placeholders {name}, {n}, {version}, {count}, {v},
# {what}, {unit}, {real}, {e} must appear in translation.
@@ -170,6 +170,7 @@ deckcraft Presentations and slide shows Prezentációk és diavetítések
gridcraft Spreadsheets and data Táblázatok és adatok
cadcraft Computer-aided design and drafting Számítógépes tervezés és műszaki rajz
soundcraft Recording, editing and mixing audio Hangrögzítés, hangszerkesztés és keverés
figcraft Interface design and prototyping Felülettervezés és prototípuskészítés
# Contextual: month abbreviations for date rendering
month Jan jan.
Can't render this file because it contains an unexpected character in line 11 and column 16.
+2 -1
View File
@@ -14,7 +14,7 @@
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite",
# app names (PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft,
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft), "GitHub", "Discord".
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft), "GitHub", "Discord".
# Shortcut keys keep their key-cap names (Shift, Alt, Ctrl, Cmd, Esc).
# Trailing "…" (U+2026) must be preserved. Placeholders {name}, {n}, {version}, {count}, {v},
# {what}, {unit}, {real}, {e} must appear in translation.
@@ -172,6 +172,7 @@ deckcraft Presentations and slide shows プレゼンテーションとスライ
gridcraft Spreadsheets and data 表計算とデータ
cadcraft Computer-aided design and drafting コンピューター支援設計と製図
soundcraft Recording, editing and mixing audio オーディオの録音、編集、ミックス
figcraft Interface design and prototyping インターフェースデザインとプロトタイピング
# Contextual: month abbreviations for date rendering
month Jan 1月
Can't render this file because it contains an unexpected character in line 14 and column 44.
+2 -1
View File
@@ -13,7 +13,7 @@
# Coverage: the whole interface — every menu string and tl! literal (complete_menus = true).
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft,
# PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft), "GitHub",
# PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft), "GitHub",
# "Discord".
# Shortcut keys keep their key-cap names (Shift, Alt, Ctrl, Cmd, Esc).
# Trailing "…" (U+2026) must be preserved. Placeholders {name}, {n}, {version}, {count}, {v},
@@ -171,6 +171,7 @@ deckcraft Presentations and slide shows Prezentacje i pokazy slajdów
gridcraft Spreadsheets and data Arkusze kalkulacyjne i dane
cadcraft Computer-aided design and drafting Projektowanie i kreślenie wspomagane komputerowo
soundcraft Recording, editing and mixing audio Nagrywanie, edycja i miksowanie dźwięku
figcraft Interface design and prototyping Projektowanie interfejsów i prototypowanie
# Contextual: month abbreviations for date rendering
month Jan sty
Can't render this file because it contains an unexpected character in line 11 and column 15.
+1
View File
@@ -158,6 +158,7 @@ deckcraft Presentations and slide shows Apresentações e slides
gridcraft Spreadsheets and data Planilhas e dados
cadcraft Computer-aided design and drafting Desenho técnico e projeto assistido por computador (CAD)
soundcraft Recording, editing and mixing audio Gravação, edição e mixagem de áudio
figcraft Interface design and prototyping Design de interfaces e prototipagem
# Contextual: month abbreviations for date rendering
month Jan jan.
1 # Brazilian Portuguese (pt-BR) catalog for ArtCraft Launcher.
158 month # Contextual: month abbreviations for date rendering
159 month
160 month
161 month
162 month
163 month
164 month
+2 -1
View File
@@ -13,7 +13,7 @@
# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite
# name "Craft App Suite",
# app names (PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft,
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft), "GitHub", "Discord", "Website".
# WordCraft, DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft), "GitHub", "Discord", "Website".
# Shortcut keys keep their key-cap names (Shift, Alt, Ctrl, Cmd, Esc).
# Trailing "…" (U+2026) must be preserved. Placeholders {name}, {n}, {version}, {count}, {v},
# {what}, {unit}, {real}, {e} must appear in translation.
@@ -168,6 +168,7 @@ deckcraft Presentations and slide shows Презентации и слайд-ш
gridcraft Spreadsheets and data Электронные таблицы и данные
cadcraft Computer-aided design and drafting Автоматизированное проектирование и черчение
soundcraft Recording, editing and mixing audio Запись, редактирование и сведение звука
figcraft Interface design and prototyping Дизайн интерфейсов и прототипирование
# Contextual: month abbreviations for date rendering
month Jan янв.
Can't render this file because it contains an unexpected character in line 13 and column 44.
+1
View File
@@ -247,6 +247,7 @@ deckcraft Presentations and slide shows 演示文稿与幻灯片
gridcraft Spreadsheets and data 电子表格与数据处理
cadcraft Computer-aided design and drafting 计算机辅助设计与制图
soundcraft Recording, editing and mixing audio 音频录制、编辑与混音
figcraft Interface design and prototyping 界面设计与原型制作
Show in Files 在文件管理器中显示
Loading ArtCraft Launcher… 正在加载 ArtCraft Launcher…
Can't render this file because it contains an unexpected character in line 4 and column 3.
+1
View File
@@ -17,6 +17,7 @@ pub fn app(id: &str) -> Option<ImageSource<'static>> {
"gridcraft" => egui::include_image!("../../../assets/app-icons/gridcraft.png"),
"cadcraft" => egui::include_image!("../../../assets/app-icons/cadcraft.png"),
"soundcraft" => egui::include_image!("../../../assets/app-icons/soundcraft.png"),
"figcraft" => egui::include_image!("../../../assets/app-icons/figcraft.png"),
_ => return None,
})
}
+3 -3
View File
@@ -631,8 +631,8 @@ fn links_to_the_website_github_and_each_apps_pages() {
// Cards: every app links to its repo and to its own page on getartcraft.com (plus the footer's).
let shown_cards = h.query_all_by_label("GitHub").count() - 1;
let shown_sites = h.query_all_by_label("Website").count() - 1;
assert!(shown_cards >= 12, "{shown_cards}");
assert_eq!(shown_sites, 12, "every app has a website page");
assert!(shown_cards >= 13, "{shown_cards}");
assert_eq!(shown_sites, 13, "every app has a website page");
// The table's … menu has the app's website and GitHub repo.
let (mut h, _) = harness(ViewMode::Table, egui::Theme::Dark, true);
h.run_steps(6);
@@ -1206,7 +1206,7 @@ fn the_lead_picture_can_be_enlarged() {
#[test]
fn every_page_opens_and_pages_through_its_pictures() {
let (mut h, _sent) = harness(ViewMode::Grid, egui::Theme::Dark, true);
// Tall enough to show all twelve cards at once.
// Tall enough to show all thirteen cards at once.
h.set_size(egui::vec2(1180.0, 3000.0));
h.run_steps(8);
for d in &artcraft_launcher_core::details::DETAILS {
@@ -13,8 +13,8 @@
<description>
<p>
ArtCraft Launcher lists every app in the Craft App Suite (PhotoCraft, LightCraft, FilmCraft,
DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft
and SoundCraft), installs the right build for your computer, and keeps them up to date.
DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,
SoundCraft and FigCraft), installs the right build for your computer, and keeps them up to date.
</p>
<ul>
<li>One place to find, install and open every Craft app</li>
+2 -2
View File
@@ -19,8 +19,8 @@ license: MIT OR Apache-2.0
description: |-
Install, update and launch the Craft App Suite.
ArtCraft Launcher lists PhotoCraft, LightCraft, FilmCraft, DesignCraft,
VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft
and SoundCraft, installs the right build for this computer and keeps them up
VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,
SoundCraft and FigCraft, installs the right build for this computer and keeps them up
to date from GitHub releases. It can live in the system tray.
# The binary links only glibc and libgcc_s directly. Windowing (X11/Wayland, xkbcommon) and the
+6 -6
View File
@@ -111,7 +111,7 @@ function New-InstallerArt([string] $BannerOut, [string] $DialogOut) {
$line = [System.Drawing.Color]::FromArgb(38, 242, 241, 238)
# The Craft App Suite, in the launcher's order (crates/core/src/catalog.rs).
$apps = 'photocraft', 'vectorcraft', 'filmcraft', 'lightcraft', 'pdfcraft', 'effectcraft',
'designcraft', 'wordcraft', 'deckcraft', 'gridcraft', 'cadcraft', 'soundcraft'
'designcraft', 'wordcraft', 'deckcraft', 'gridcraft', 'cadcraft', 'soundcraft', 'figcraft'
$mark = [System.Drawing.Image]::FromFile((Join-Path $Root 'assets\app-icon\hicolor\256x256\apps\ai.storyteller.artcraft-launcher.png'))
$wordmark = [System.Drawing.Image]::FromFile((Join-Path $Root 'docs\brand\artcraft-logo-white.png'))
$icons = $apps | ForEach-Object { [System.Drawing.Image]::FromFile((Join-Path $Root "assets\app-icons\$_.png")) }
@@ -148,14 +148,14 @@ function New-InstallerArt([string] $BannerOut, [string] $DialogOut) {
$x += $g.MeasureString([string]$ch, $labelFont, 100, [System.Drawing.StringFormat]::GenericTypographic).Width + 1.35
}
$brush.Dispose()
# The apps, three to a row, in 40 px cells divided by hairlines.
# The apps, four to a row, in 30 px cells divided by hairlines.
$pen = New-Object System.Drawing.Pen $line, 1
$left = 22; $top = 126; $cell = 40
$left = 22; $top = 126; $cell = 30
for ($i = 0; $i -lt $icons.Count; $i++) {
$cx = $left + ($i % 3) * $cell
$cy = $top + [math]::Floor($i / 3) * $cell
$cx = $left + ($i % 4) * $cell
$cy = $top + [math]::Floor($i / 4) * $cell
$g.DrawRectangle($pen, $cx, $cy, $cell, $cell)
$g.DrawImage($icons[$i], $cx + 6, $cy + 6, $cell - 12, $cell - 12)
$g.DrawImage($icons[$i], $cx + 4, $cy + 4, $cell - 8, $cell - 8)
}
$pen.Dispose()
}
+1
View File
@@ -31,6 +31,7 @@ const APPS: &[(&str, &str)] = &[
("gridcraft", "GridCraft"),
("cadcraft", "CADCraft"),
("soundcraft", "SoundCraft"),
("figcraft", "FigCraft"),
];
const DEFAULT_PORT: u16 = 8787;