Publish Untrace Desktop 1.6.1 with offline batch workflows
This commit is contained in:
1 parent
99b4b22352
commit
7ce81b0727
47 files changed
+5958
-1208
No files matched your search
+5
-123
@@ -1,126 +1,8 @@
|
||||
<script>
|
||||
import { onMount } from "svelte";
|
||||
import { theme } from "./lib/theme.js";
|
||||
import TopBar from "./lib/TopBar.svelte";
|
||||
import Tool from "./lib/Tool.svelte";
|
||||
import Removals from "./lib/Removals.svelte";
|
||||
import HowItWorks from "./lib/HowItWorks.svelte";
|
||||
import Faq from "./lib/Faq.svelte";
|
||||
import Footer from "./lib/Footer.svelte";
|
||||
import Toast from "./lib/Toast.svelte";
|
||||
|
||||
let toasts = [];
|
||||
let nextId = 0;
|
||||
|
||||
const assurances = [
|
||||
{
|
||||
title: "Runs in your browser",
|
||||
detail: "No upload, no queue, no server that could keep a copy.",
|
||||
},
|
||||
{
|
||||
title: "Reads the whole file",
|
||||
detail: "EXIF, XMP, IPTC and the JUMBF boxes that hold C2PA data.",
|
||||
},
|
||||
{
|
||||
title: "Shows its work",
|
||||
detail: "Every finding is listed before anything is changed.",
|
||||
},
|
||||
];
|
||||
|
||||
function notify(event) {
|
||||
const id = nextId++;
|
||||
toasts = [...toasts, { id, ...event.detail }];
|
||||
setTimeout(() => dismiss(id), 5000);
|
||||
}
|
||||
|
||||
function dismiss(id) {
|
||||
toasts = toasts.filter((toast) => toast.id !== id);
|
||||
}
|
||||
|
||||
<script>
|
||||
import { onMount } from 'svelte';
|
||||
import { theme } from './lib/theme.js';
|
||||
import Workspace from './lib/Workspace.svelte';
|
||||
onMount(() => theme.init());
|
||||
</script>
|
||||
|
||||
<TopBar />
|
||||
|
||||
<main>
|
||||
<div class="wrap">
|
||||
<section class="lede">
|
||||
<p class="eyebrow">C2PA · AI credentials · EXIF</p>
|
||||
<h1>Remove content credentials from an image</h1>
|
||||
<p>
|
||||
Untrace strips C2PA content credentials, AI generation tags, GPS
|
||||
coordinates and EXIF metadata from a photo — free, and without the file
|
||||
ever leaving your device.
|
||||
</p>
|
||||
<div class="chip-row">
|
||||
<span class="chip">Free</span>
|
||||
<span class="chip">No sign-in</span>
|
||||
<span class="chip">Open source</span>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<Tool on:notify={notify} />
|
||||
|
||||
<ul class="assurances">
|
||||
{#each assurances as item}
|
||||
<li>
|
||||
<h2>{item.title}</h2>
|
||||
<p>{item.detail}</p>
|
||||
</li>
|
||||
{/each}
|
||||
</ul>
|
||||
|
||||
<div class="stack sections">
|
||||
<Removals />
|
||||
<HowItWorks />
|
||||
<Faq />
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<Footer />
|
||||
|
||||
<Toast {toasts} {dismiss} />
|
||||
|
||||
<style>
|
||||
main {
|
||||
padding-bottom: var(--space-8);
|
||||
}
|
||||
|
||||
.assurances {
|
||||
display: grid;
|
||||
gap: var(--space-3);
|
||||
margin-top: var(--space-5);
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.assurances {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: var(--space-4);
|
||||
}
|
||||
}
|
||||
|
||||
.assurances li {
|
||||
display: grid;
|
||||
gap: var(--space-1);
|
||||
padding-left: var(--space-4);
|
||||
border-left: var(--border-w) solid var(--border-strong);
|
||||
}
|
||||
|
||||
.assurances h2 {
|
||||
font-size: var(--fs-2);
|
||||
line-height: var(--lh-2);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.assurances p {
|
||||
color: var(--text-3);
|
||||
font-size: var(--fs-1);
|
||||
line-height: var(--lh-2);
|
||||
}
|
||||
|
||||
.sections {
|
||||
margin-top: var(--space-9);
|
||||
}
|
||||
</style>
|
||||
<Workspace />
|
||||
Reference in new issue
Block a user