Social links: X, YouTube, TikTok and Instagram icons
- Small monochrome service icons (Simple Icons 16.34.0, CC0) linking to ArtCraft's accounts, after Website · GitHub · Discord in the footer and in Settings › Community; quieter than Discord, brighter on hover - Settings: the community description gets its own line, so the Website and GitHub buttons no longer overlap it - Credit the icons in assets/social/README.md, ATTRIBUTION.md and NOTICE Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
d4f5a33ea4
commit
4aa07a56f8
|
|
@ -11,6 +11,7 @@ next to them.
|
|||
| Path | Title | Author | Source | License |
|
||||
|---|---|---|---|---|
|
||||
| `assets/app-icon/` (all files) | ArtCraft Launcher app icon (grid of app-coloured tiles with a launch arrow) | ArtCraft Launcher contributors | Original work, see [`assets/app-icon/README.md`](assets/app-icon/README.md) | MIT OR Apache-2.0, [`assets/app-icon/LICENSE.txt`](assets/app-icon/LICENSE.txt) |
|
||||
| `assets/social/x.svg`, `youtube.svg`, `tiktok.svg`, `instagram.svg` | X, YouTube, TikTok and Instagram logos, linking to ArtCraft's accounts | [Simple Icons](https://simpleicons.org/) contributors | Simple Icons, `fill` set to white for tinting; see [`assets/social/README.md`](assets/social/README.md) | CC0 1.0. The logos are trademarks of X Corp., Google LLC, TikTok / ByteDance and Meta Platforms, Inc. |
|
||||
| `docs/brand/artcraft-logo.svg`, `artcraft-logo-white.svg` | ArtCraft wordmark, shown in the window header | ArtCraft Team | Supplied brand files, unmodified (same as PhotoCraft's `docs/brand/`) | **Not open source; not MIT or Apache-2.0.** ArtCraft trademark, [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt) |
|
||||
| `docs/brand/artcraft-mark-64.png`, `artcraft-mark-black-44.png` | ArtCraft "A" mark, the tray / menu-bar icon | ArtCraft Team | Rendered unmodified from `docs/brand/artcraft-mark.svg` and `artcraft-mark-black.svg` by `packaging/icons.sh` | **Not open source; not MIT or Apache-2.0.** ArtCraft trademark, [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt) |
|
||||
| `assets/fonts/Inter-Regular.ttf`, `Inter-Medium.ttf`, `Inter-SemiBold.ttf` | Inter 4.001 (UI font) | The Inter Project Authors (Rasmus Andersson) | <https://github.com/rsms/inter> (copied from PhotoCraft's `assets/fonts/`) | SIL OFL 1.1, [`assets/fonts/OFL-Inter.txt`](assets/fonts/OFL-Inter.txt) |
|
||||
|
|
|
|||
3
NOTICE
3
NOTICE
|
|
@ -14,6 +14,9 @@ Third-party material
|
|||
This product bundles third-party material under its own licenses, listed below. The per-file
|
||||
list (author, source, license) is in ATTRIBUTION.md.
|
||||
|
||||
Social service icons (assets/social/*.svg) — Simple Icons, CC0 1.0. The X, YouTube, TikTok and
|
||||
Instagram logos are trademarks of their respective owners and are used only to link to ArtCraft's
|
||||
accounts.
|
||||
Inter font (assets/fonts/Inter-*.ttf) — SIL Open Font License 1.1. See assets/fonts/OFL-Inter.txt.
|
||||
Craft App Suite app icons (assets/app-icons/*.png) — from each app's repository
|
||||
(github.com/storytold/<app>), MIT OR Apache-2.0, Copyright (c) 2026 ArtCraft Team and the <App>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
Social service icons
|
||||
====================
|
||||
|
||||
`x.svg`, `youtube.svg`, `tiktok.svg` and `instagram.svg` are from [Simple Icons](https://simpleicons.org/)
|
||||
16.34.0 (`https://cdn.jsdelivr.net/npm/simple-icons@16.34.0/icons/<name>.svg`), released under
|
||||
[CC0 1.0](https://github.com/simple-icons/simple-icons/blob/develop/LICENSE.md). The only change is
|
||||
`fill="#ffffff"` on the root element, so the app can tint them to the theme.
|
||||
|
||||
The logos themselves are trademarks of their owners (X Corp., Google LLC, TikTok / ByteDance Ltd.
|
||||
and Meta Platforms, Inc.). They are used only to link to ArtCraft's own accounts on those services.
|
||||
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff"><title>Instagram</title><path d="M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077"/></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff"><title>TikTok</title><path d="M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z"/></svg>
|
||||
|
After Width: | Height: | Size: 722 B |
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff"><title>X</title><path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z"/></svg>
|
||||
|
After Width: | Height: | Size: 314 B |
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#ffffff"><title>YouTube</title><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg>
|
||||
|
After Width: | Height: | Size: 474 B |
|
|
@ -159,6 +159,14 @@ affiliated with, sponsored by or endorsed by any of these companies.";
|
|||
pub const WEBSITE_URL: &str = "https://getartcraft.com";
|
||||
/// ArtCraft on GitHub: every Craft App's source.
|
||||
pub const GITHUB_URL: &str = "https://github.com/storytold";
|
||||
/// ArtCraft's social accounts: (service, URL). Shown as small icons, less prominent than Discord.
|
||||
pub const SOCIAL: [(&str, &str); 4] = [
|
||||
("X", "https://x.com/get_artcraft"),
|
||||
("YouTube", "https://www.youtube.com/@OfficialArtcraftStudios"),
|
||||
("TikTok", "https://www.tiktok.com/@artcraft.studios"),
|
||||
("Instagram", "https://www.instagram.com/officialartcraftstudios"),
|
||||
];
|
||||
|
||||
/// The ArtCraft community on Discord.
|
||||
pub const DISCORD_URL: &str = "https://discord.gg/artcraft";
|
||||
|
||||
|
|
|
|||
|
|
@ -160,18 +160,23 @@ impl LauncherUi {
|
|||
}
|
||||
|
||||
section(ui, "Community");
|
||||
row(ui, "Questions, ideas and news from the ArtCraft team", &mut |ui| {
|
||||
ui.label(RichText::new("Questions, ideas and news from the ArtCraft team").color(t.text_muted));
|
||||
ui.add_space(4.0);
|
||||
ui.horizontal(|ui| {
|
||||
use artcraft_launcher_core::catalog::{DISCORD_URL, GITHUB_URL, WEBSITE_URL};
|
||||
// Right to left: Website, GitHub, Discord.
|
||||
if widgets::discord_button(ui).clicked() {
|
||||
ui.ctx().open_url(egui::OpenUrl::new_tab(DISCORD_URL));
|
||||
}
|
||||
if widgets::secondary(ui, "GitHub", 0.0).on_hover_text(GITHUB_URL).clicked() {
|
||||
ui.ctx().open_url(egui::OpenUrl::new_tab(GITHUB_URL));
|
||||
}
|
||||
if widgets::secondary(ui, "Website", 0.0).on_hover_text(WEBSITE_URL).clicked() {
|
||||
ui.ctx().open_url(egui::OpenUrl::new_tab(WEBSITE_URL));
|
||||
}
|
||||
if widgets::secondary(ui, "GitHub", 0.0).on_hover_text(GITHUB_URL).clicked() {
|
||||
ui.ctx().open_url(egui::OpenUrl::new_tab(GITHUB_URL));
|
||||
}
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
ui.spacing_mut().item_spacing.x = 4.0;
|
||||
widgets::social_icons(ui, 16.0);
|
||||
});
|
||||
});
|
||||
|
||||
section(ui, "Appearance");
|
||||
|
|
|
|||
|
|
@ -34,6 +34,17 @@ pub fn artcraft_logo(dark_background: bool) -> ImageSource<'static> {
|
|||
/// The ArtCraft wordmark's width / height (its SVG view box: 1038.05 × 108).
|
||||
pub const ARTCRAFT_LOGO_ASPECT: f32 = 1038.05 / 108.0;
|
||||
|
||||
/// A social service's logo (Simple Icons, white, for tinting), by its name in `catalog::SOCIAL`.
|
||||
pub fn social(service: &str) -> Option<ImageSource<'static>> {
|
||||
Some(match service {
|
||||
"X" => egui::include_image!("../../../assets/social/x.svg"),
|
||||
"YouTube" => egui::include_image!("../../../assets/social/youtube.svg"),
|
||||
"TikTok" => egui::include_image!("../../../assets/social/tiktok.svg"),
|
||||
"Instagram" => egui::include_image!("../../../assets/social/instagram.svg"),
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
/// The launcher's icon.
|
||||
pub fn launcher() -> ImageSource<'static> {
|
||||
egui::include_image!("../../../assets/app-icon/hicolor/128x128/apps/ai.storyteller.artcraft-launcher.png")
|
||||
|
|
|
|||
|
|
@ -195,7 +195,12 @@ impl LauncherUi {
|
|||
};
|
||||
ui.label(small(label));
|
||||
ui.add_space(14.0);
|
||||
// Right to left: these read Website · GitHub · Discord.
|
||||
// Right to left, so this reads: Website · GitHub · Discord, then the social icons.
|
||||
ui.scope(|ui| {
|
||||
ui.spacing_mut().item_spacing.x = 2.0;
|
||||
widgets::social_icons(ui, 13.0);
|
||||
});
|
||||
ui.add_space(8.0);
|
||||
use artcraft_launcher_core::catalog::{DISCORD_URL, GITHUB_URL, WEBSITE_URL};
|
||||
widgets::small_link(ui, "Discord", DISCORD_URL);
|
||||
ui.label(RichText::new("·").size(11.5).color(t.text_faint));
|
||||
|
|
|
|||
|
|
@ -235,3 +235,24 @@ pub fn small_link(ui: &mut Ui, text: &str, url: &str) -> Response {
|
|||
}
|
||||
resp
|
||||
}
|
||||
|
||||
/// ArtCraft's social accounts as a row of small monochrome icons (faint, brighter on hover).
|
||||
/// In a right-to-left layout they still read left to right.
|
||||
pub fn social_icons(ui: &mut Ui, size: f32) {
|
||||
let t = Tokens::get(ui.ctx());
|
||||
let rtl = ui.layout().prefer_right_to_left();
|
||||
let services = artcraft_launcher_core::catalog::SOCIAL;
|
||||
let ordered: Vec<&(&str, &str)> = if rtl { services.iter().rev().collect() } else { services.iter().collect() };
|
||||
for (name, url) in ordered {
|
||||
let Some(icon) = crate::icons::social(name) else { continue };
|
||||
let pad = 4.0;
|
||||
let (rect, resp) = ui.allocate_exact_size(vec2(size + 2.0 * pad, size + 2.0 * pad), Sense::click());
|
||||
let color = if resp.hovered() { t.text } else { t.text_faint };
|
||||
egui::Image::new(icon).tint(color).paint_at(ui, rect.shrink(pad));
|
||||
resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Link, true, *name));
|
||||
let resp = resp.on_hover_text(format!("ArtCraft on {name}")).on_hover_cursor(egui::CursorIcon::PointingHand);
|
||||
if resp.clicked() {
|
||||
ui.ctx().open_url(egui::OpenUrl::new_tab(*url));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -332,6 +332,11 @@ fn links_open_the_right_pages() {
|
|||
let sites = all_opened(&mut h, "Website");
|
||||
assert!(sites.contains(&"https://getartcraft.com".to_string()), "{sites:?}");
|
||||
assert!(sites.contains(&"https://getartcraft.com/apps/photocraft".to_string()), "{sites:?}");
|
||||
// Social icons in the footer.
|
||||
assert_eq!(click_opens(&mut h, "X").as_deref(), Some("https://x.com/get_artcraft"));
|
||||
assert_eq!(click_opens(&mut h, "YouTube").as_deref(), Some("https://www.youtube.com/@OfficialArtcraftStudios"));
|
||||
assert_eq!(click_opens(&mut h, "TikTok").as_deref(), Some("https://www.tiktok.com/@artcraft.studios"));
|
||||
assert_eq!(click_opens(&mut h, "Instagram").as_deref(), Some("https://www.instagram.com/officialartcraftstudios"));
|
||||
// The … menu.
|
||||
h.get_all_by_label("…").next().unwrap().click();
|
||||
h.run_steps(3);
|
||||
|
|
|
|||
Loading…
Reference in New Issue