AmberField

Sign In

Create Account

Theme

AmberField Blog

Filter by tag:

Pacing: Cutting for Clarity

Pacing isn’t speed; it’s attention. Cut to preserve comprehension, then add energy where intent demands it.

Tags: editing

Color Contrast That Guides the Eye

Use contrast to prioritize subject over background. Balance with consistent skin tones.

Tags: color
Learn Color Basics

Cleaning Dialogue Without Artifacts

Gentle reduction first, then EQ. Overprocessing kills presence.

Tags: audio
Audio for Video

Motion That Serves the Story

Motion should clarify, not decorate. Favor fewer, deliberate moves with cohesion.

Tags: motion
Motion for Editors
'; document.getElementById('site-footer').innerHTML = ' '; } })(); const setActiveTag = (tag) => { const buttons = Array.from(document.querySelectorAll('[data-tag]')); buttons.forEach(b => { const isActive = b.getAttribute('data-tag') === tag || (tag === 'all' && b.getAttribute('data-tag') === 'all'); b.setAttribute('aria-pressed', String(isActive)); b.classList.toggle('ring-2', isActive); b.classList.toggle('ring-black/70', isActive); b.classList.toggle('dark:ring-white/70', isActive); }); }; const applyFilter = (tag) => { const posts = Array.from(document.querySelectorAll('#posts article')); posts.forEach(p => { const t = (p.getAttribute('data-tags') || '').split(',').map(s => s.trim()); const hide = tag !== 'all' && !t.includes(tag); p.classList.toggle('hidden', hide); }); setActiveTag(tag); }; const url = new URL(window.location.href); const initialTag = url.searchParams.get('tag') || 'all'; applyFilter(initialTag); document.querySelectorAll('[data-tag]').forEach(b => { b.addEventListener('click', () => { const tag = b.getAttribute('data-tag'); applyFilter(tag); const u = new URL(window.location.href); u.searchParams.set('tag', tag); history.replaceState({}, '', u.toString()); }); }); const makeFullLink = (anchor) => { const u = new URL(window.location.href); u.hash = anchor.replace('#',''); return u.toString(); }; document.querySelectorAll('[data-copy]').forEach(b => { b.addEventListener('click', async () => { const anchor = b.getAttribute('data-copy') || ''; const urlToCopy = makeFullLink(anchor); try { if (navigator.share) { await navigator.share({ title: document.title, url: urlToCopy }); return; } } catch {} try { await navigator.clipboard.writeText(urlToCopy); alert('Link copied'); } catch { const ta = document.createElement('textarea'); ta.value = urlToCopy; ta.style.position = 'fixed'; ta.style.left = '-9999px'; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); alert('Link copied'); } catch { alert('Copy failed'); } document.body.removeChild(ta); } }); }); if (location.hash) { const el = document.querySelector(location.hash); if (el) { el.scrollIntoView({ behavior: 'smooth', block: 'start' }); el.classList.add('ring-2','ring-emerald-500','dark:ring-emerald-400'); setTimeout(() => el.classList.remove('ring-2','ring-emerald-500','dark:ring-emerald-400'), 2200); } } const THEME_KEY = 'af_theme'; const applyTheme = (mode) => { const root = document.documentElement; if (mode === 'dark') root.classList.add('dark'); else root.classList.remove('dark'); }; const storedTheme = localStorage.getItem(THEME_KEY); if (storedTheme) applyTheme(storedTheme); else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) applyTheme('dark'); document.getElementById('theme-toggle').addEventListener('click', () => { const isDark = document.documentElement.classList.contains('dark'); const next = isDark ? 'light' : 'dark'; applyTheme(next); localStorage.setItem(THEME_KEY, next); }); const COOKIE_KEY = 'af_cookies'; const banner = document.getElementById('cookie-banner'); const btnAccept = document.getElementById('cookie-accept'); const btnDecline = document.getElementById('cookie-decline'); const btnSettings = document.getElementById('cookie-settings'); const showBanner = () => banner.classList.remove('hidden'); const hideBanner = () => banner.classList.add('hidden'); const hasDecision = () => { try { return localStorage.getItem(COOKIE_KEY) !== null; } catch { return false; } }; const setDecision = (val) => { try { localStorage.setItem(COOKIE_KEY, JSON.stringify({ v: 1, decision: val, ts: Date.now() })); } catch {} }; if (!hasDecision()) showBanner(); btnAccept.addEventListener('click', () => { setDecision('accept'); hideBanner(); }); btnDecline.addEventListener('click', () => { setDecision('decline'); hideBanner(); }); btnSettings.addEventListener('click', () => { if (hasDecision()) { showBanner(); } else { showBanner(); } }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !banner.classList.contains('hidden')) hideBanner(); });