Files
Thingport/web/og/og-image.html
Tautvydas Derzinskas a7a91902a0 feat: add MyMiniFactory as a provider
Import, collection import and synced collections from MyMiniFactory, alongside MakerWorld,
Printables and Thingiverse.

- Backend: API v2 client with an instance-wide API key for metadata, collections and
  authors; files from MyMiniFactory's own download links (free models need no login).
  Paid models, and free ones whose files are archives, download as the user from their
  MyMiniFactory library through their session (PHPSESSID), fetching the model files
  MyMiniFactory unpacked from each archive. Paid models are left out of collection
  listings and syncs.
- One migration: MyMiniFactory category ids, username and session columns, plus a data
  migration giving existing users' starter categories the new category ids. Category
  matching now prefers the most specific site category.
- Frontend: provider everywhere the others appear (badges, Configuration and
  Administration providers, sync Browse tab, user menu, link detection, System Health,
  category ids), shared instance-key form for Thingiverse and MyMiniFactory, en and lt.
- Thingport Grab: new provider sites are allowed once from the popup (optional
  all-sites access, content script registered at runtime), so adding one never makes
  the browser disable the extension; captures the signed-in MyMiniFactory username and
  session; paid-model notice.
- Docs, website, store assets and screenshots updated.
2026-10-18 18:19:43 +02:00

148 lines
4.2 KiB
HTML

<!doctype html>
<!--
Source for src/assets/og-default.png (the social preview card). Colours are the dark tokens from
src/styles/global.css. To regenerate after editing, from web/:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --hide-scrollbars \
--force-device-scale-factor=1 --window-size=1200,630 \
--screenshot=src/assets/og-default.png "file://$PWD/og/og-image.html"
-->
<html>
<head>
<meta charset="utf-8" />
<style>
@font-face {
font-family: "Thingport";
src: url("../../frontend/src/assets/fonts/thingport-700.woff") format("woff");
font-weight: 700;
}
@font-face {
font-family: "Thingport";
src: url("../../frontend/src/assets/fonts/thingport-500.woff") format("woff");
font-weight: 500;
}
:root {
--bg: #181f39;
--panel: #1e2746;
--border: #333a54;
--text: #b3b7c0;
--heading: #ffffff;
--accent: #00b800;
--accent-light: #5be584;
--alt: rgb(255, 114, 32);
}
* {
box-sizing: border-box;
margin: 0;
}
html,
body {
width: 1200px;
height: 630px;
overflow: hidden;
}
body {
position: relative;
background:
radial-gradient(55% 70% at 18% 0%, rgba(0, 184, 0, 0.26) 0%, rgba(0, 184, 0, 0) 70%),
radial-gradient(40% 60% at 100% 100%, rgba(91, 229, 132, 0.1) 0%, rgba(91, 229, 132, 0) 70%), var(--bg);
font-family: "Thingport", system-ui, sans-serif;
color: var(--text);
}
.grid {
position: absolute;
inset: 0;
background-image:
linear-gradient(var(--border) 1px, transparent 1px),
linear-gradient(90deg, var(--border) 1px, transparent 1px);
background-size: 40px 40px;
opacity: 0.25;
mask-image: radial-gradient(70% 90% at 25% 40%, #000 0%, transparent 80%);
}
.copy {
position: absolute;
left: 72px;
top: 72px;
width: 520px;
}
.logo {
height: 64px;
display: block;
}
h1 {
margin-top: 64px;
font-size: 60px;
line-height: 1.05;
font-weight: 700;
color: var(--heading);
letter-spacing: -0.01em;
}
h1 em {
font-style: normal;
color: var(--accent-light);
}
p {
margin-top: 24px;
font-size: 25px;
line-height: 1.4;
font-weight: 500;
}
.pills {
position: absolute;
left: 72px;
bottom: 64px;
display: flex;
gap: 8px;
}
/* Sized so four sites end before the screenshot. */
.pill {
padding: 7px 11px;
font-size: 17px;
font-weight: 500;
color: #fff;
background: var(--accent);
}
.pill.alt {
background: var(--alt);
}
/* The app's own badge colours for these two (frontend/src/constants/importProviders.ts). */
.pill.thingiverse {
background: #2b78fe;
}
.pill.myminifactory {
background: #00866f;
}
.shot {
position: absolute;
left: 650px;
top: 92px;
width: 860px;
border: 1px solid var(--border);
background: var(--panel);
padding: 10px;
box-shadow:
0 30px 80px rgba(0, 0, 0, 0.45),
0 0 0 8px rgba(0, 184, 0, 0.08);
}
.shot img {
display: block;
width: 100%;
}
</style>
</head>
<body>
<div class="grid"></div>
<div class="copy">
<img class="logo" src="../../frontend/src/assets/logos/thingport-lockup-compact-on-dark.svg" alt="" />
<h1>Your personal <em>3D model</em> library</h1>
<p>Free, open-source and self-hosted. Import, preview and organise every model in one place.</p>
</div>
<div class="pills">
<span class="pill">MakerWorld</span>
<span class="pill alt">Printables</span>
<span class="pill thingiverse">Thingiverse</span><span class="pill myminifactory">MyMiniFactory</span>
</div>
<div class="shot"><img src="../../frontend/src/assets/screenshots/02_models.png" alt="" /></div>
</body>
</html>