release: v0.12.0 (#520)

Forty-one commits since v0.11.0. See CHANGELOG.md for the full list and the upgrade notes.
This commit is contained in:
Ralksta
2026-08-23 23:18:14 +02:00
committed by GitHub
parent 2f546f440d
commit 10ec68f493
119 changed files with 6888 additions and 758 deletions

View File

@@ -3,8 +3,10 @@
import React, { useState } from 'react';
import { useProofing } from './ProofingContext';
import { IconCheck, IconCopy, IconLink } from './Icons';
import { useDictionary } from './I18nProvider';
export function ProofingModal() {
const t = useDictionary();
const proofing = useProofing();
const [copiedState, setCopiedState] = useState<'none' | 'link' | 'list'>('none');
@@ -36,10 +38,8 @@ export function ProofingModal() {
};
const handleMailto = () => {
const subject = encodeURIComponent(`Photo Selection (${favorites.size} items)`);
const body = encodeURIComponent(
`Hello,\n\nHere is my photo selection:\n\n${getFormattedList()}\n\nShare Link: ${getProofingUrl()}\n\nBest regards,`,
);
const subject = encodeURIComponent(t.proofing.mailSubject(favorites.size));
const body = encodeURIComponent(t.proofing.mailBody(getFormattedList(), getProofingUrl()));
window.location.href = `mailto:?subject=${subject}&body=${body}`;
};
@@ -82,12 +82,12 @@ export function ProofingModal() {
}}
>
<h3 style={{ margin: 0, fontSize: '1.2rem', fontWeight: 600 }}>
❤️ Selection ({favorites.size})
{t.proofing.modalTitle(favorites.size)}
</h3>
<button
type="button"
onClick={() => setIsModalOpen(false)}
aria-label="Close modal"
aria-label={t.proofing.closeModal}
style={{
background: 'none',
border: 'none',
@@ -103,8 +103,7 @@ export function ProofingModal() {
</div>
<p style={{ fontSize: '0.9rem', opacity: 0.8, marginBottom: '1rem' }}>
You have selected {favorites.size} photo{favorites.size === 1 ? '' : 's'}. Choose an
export option below to share your selection:
{t.proofing.intro(favorites.size)}
</p>
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>
@@ -127,11 +126,11 @@ export function ProofingModal() {
>
{copiedState === 'link' ? (
<>
<IconCheck size={15} aria-hidden="true" /> Link Copied!
<IconCheck size={15} aria-hidden="true" /> {t.proofing.linkCopied}
</>
) : (
<>
<IconLink size={15} aria-hidden="true" /> Copy Shareable Link
<IconLink size={15} aria-hidden="true" /> {t.proofing.copyLink}
</>
)}
</button>
@@ -155,11 +154,11 @@ export function ProofingModal() {
>
{copiedState === 'list' ? (
<>
<IconCheck size={15} aria-hidden="true" /> List Copied!
<IconCheck size={15} aria-hidden="true" /> {t.proofing.listCopied}
</>
) : (
<>
<IconCopy size={15} aria-hidden="true" /> Copy Text List (#1, #2...)
<IconCopy size={15} aria-hidden="true" /> {t.proofing.copyList}
</>
)}
</button>
@@ -182,14 +181,14 @@ export function ProofingModal() {
cursor: 'pointer',
}}
>
✉️ Send Email to Photographer
{t.proofing.sendEmail}
</button>
)}
<button
type="button"
onClick={() => {
if (confirm('Clear all selected favorites?')) {
if (confirm(t.proofing.confirmClear)) {
clearFavorites();
setIsModalOpen(false);
}
@@ -204,7 +203,7 @@ export function ProofingModal() {
opacity: 0.8,
}}
>
Clear Selection
{t.proofing.clearSelection}
</button>
</div>
</div>