Hugmyndir flytja fjöll; dæmi um texta og hugmyndavinnu: Við erum á framfarabraut, Finndu þitt stuð, Vistvænni steypa virkar, Hjólin snúast á Höfða, Gerðu vel við þína fasteign, Gíga? Gíga!, Leggjum grunn að sælureit, Texti, tónn og hugmyndir

Hugmyndir flytja fjöll

(function () { const sequences = [ { text: "Hugmyndir flytja fjöll", label: "Hugmyndasmiður", firstHold: 920, labelHold: 1280, lineHold: 1280 }, { text: "Við erum á framfarabraut", label: "Reitir", pausesBefore: [{ text: "framfarabraut", duration: 680 }], lineHold: 980 }, { text: "Finndu þitt stuð", label: "Orkusalan", pausesBefore: [{ text: "þitt", duration: 520 }], lineHold: 900 }, { text: "Vistvænni steypa virkar", label: "BM Vallá", pausesBefore: [{ text: "virkar", duration: 520 }], lineHold: 1040 }, { text: "Hjólin snúast á Höfða", label: "Reitir", pausesBefore: [{ text: "Höfða", duration: 460 }], lineHold: 960 }, { text: "Gerðu vel við þína fasteign", label: "BM Vallá", pausesAfter: [{ text: "vel", duration: 430 }], lineHold: 1000 }, { text: "Gíga? Gíga!", label: "Orkusalan", pausesAfter: [{ text: "?", duration: 920 }], lineHold: 1150 }, { text: "Leggjum grunn að sælureit", label: "BM Vallá", pausesBefore: [{ text: "sælureit", duration: 560 }], lineHold: 1040 }, { text: "Texti, tónn og hugmyndir", label: "Hugmyndasmiður", lineHold: 960 } ]; const sleep = (duration) => new Promise((resolve) => window.setTimeout(resolve, duration)); const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)"); const forcedReducedMotion = new URLSearchParams(window.location.search).has("hms-reduced-motion"); function toChars(text) { if ("Segmenter" in Intl) { return Array.from( new Intl.Segmenter("is", { granularity: "grapheme" }).segment(text), (part) => part.segment ); } return Array.from(text); } function textIndexToCharIndex(text, index) { return toChars(text.slice(0, index)).length; } function collectPauses(entry, key) { const pauses = new Map(); (entry[key] || []).forEach((pause) => { const textIndex = entry.text.indexOf(pause.text); if (textIndex === -1) { return; } const offset = key === "pausesAfter" ? pause.text.length : 0; const charIndex = textIndexToCharIndex(entry.text, textIndex + offset); pauses.set(charIndex, Math.max(pauses.get(charIndex) || 0, pause.duration)); }); return pauses; } function seededJitter(char, index, textLength) { const code = char.codePointAt(0) || 0; return (code * 17 + index * 29 + textLength * 11) % 58; } function typingDelay(char, index, chars, entry) { const jitter = seededJitter(char, index, chars.length); let delay = 44 + jitter; if (char === " ") { delay = 30 + (jitter % 42); } if (index > 0 && chars[index - 1] === " ") { delay += 22 + (jitter % 90); } if (char === "," || char === ":") { delay += 120; } if (char === "!" || char === "?") { delay += 260; } return Math.round(delay * (entry.pace || 1)); } function deletionDelay(char, index, textLength) { return 20 + (seededJitter(char, index, textLength) % 30); } function parts(root) { return { line: root.querySelector("[data-hms-combined-line]"), label: root.querySelector("[data-hms-combined-label]"), cursor: root.querySelector("[data-hms-combined-cursor]"), loader: root.querySelector("[data-hms-combined-loader]") }; } async function showLoader(root) { const { loader } = parts(root); loader.classList.add("is-visible"); await sleep(720); loader.classList.remove("is-visible"); await sleep(220); } async function revealLabel(root, entry) { const { label } = parts(root); if (!entry.label) { return; } label.textContent = entry.label; label.classList.add("is-visible"); await sleep(360); await sleep(entry.labelHold || 1280); } async function eraseDisplayedLine(root, entry) { const { line, label, cursor } = parts(root); const chars = toChars(line.textContent); cursor.classList.add("is-visible"); for (let index = chars.length; index > 0; index -= 1) { if (!root.isConnected) { return; } line.textContent = chars.slice(0, index - 1).join(""); await sleep(deletionDelay(chars[index - 1], index, chars.length)); } cursor.classList.remove("is-visible"); label.classList.remove("is-visible"); await sleep(entry.endHold || 120); } async function playLoadedEntry(root, entry) { const { line, label, cursor } = parts(root); line.textContent = entry.text; label.textContent = ""; label.classList.remove("is-visible"); cursor.classList.remove("is-visible"); await sleep(entry.firstHold || 900); cursor.classList.add("is-visible"); await sleep(380); await revealLabel(root, entry); await eraseDisplayedLine(root, entry); } async function typeEntry(root, entry) { const { line, label, cursor } = parts(root); const chars = toChars(entry.text); const beforePauses = collectPauses(entry, "pausesBefore"); const afterPauses = collectPauses(entry, "pausesAfter"); label.classList.remove("is-visible"); label.textContent = ""; cursor.classList.add("is-visible"); line.textContent = ""; await sleep(entry.initialHold || 180); for (let index = 0; index < chars.length; index += 1) { if (!root.isConnected) { return; } if (beforePauses.has(index)) { await sleep(beforePauses.get(index)); } line.textContent += chars[index]; await sleep(typingDelay(chars[index], index, chars, entry)); if (afterPauses.has(index + 1)) { await sleep(afterPauses.get(index + 1)); } } await sleep(entry.lineHold || 920); await revealLabel(root, entry); await eraseDisplayedLine(root, entry); } function showStatic(root, entry) { const { line, label, cursor, loader } = parts(root); line.textContent = entry.text; label.textContent = entry.label || ""; label.classList.toggle("is-visible", Boolean(entry.label)); cursor.classList.remove("is-visible"); loader.classList.remove("is-visible"); } async function play(root) { await playLoadedEntry(root, sequences[0]); let index = 1; while (root.isConnected) { await showLoader(root); await typeEntry(root, sequences[index]); index = (index + 1) % sequences.length; } } document.querySelectorAll("[data-hms-combined-hero]").forEach((root) => { if (root.dataset.hmsCombinedInitialized === "true") { return; } root.dataset.hmsCombinedInitialized = "true"; if (reduceMotion.matches || forcedReducedMotion) { showStatic(root, sequences[0]); return; } play(root); }); })();

Ég bý til hugmyndir og texta fyrir félög sem vilja tala skýrt, slá réttan tón og hrífa fólk með sér. Hvort sem verkefnið snýr að auglýsingum, leit að réttu nafni eða óvæntum uppátækjum þá getum við fundið leið sem virkar.

Orð lýsa gæðum

Vel skrifuð skilaboð eiga að vera á mannamáli og vekja tilfinningar. Ég elska að tengjast fólki á íslensku og ensku hvort sem það er með auglýsingum, vefsíðutextum, ársskýrslum, færslum, ávörpum, fréttum, sendibréfum, leikhandritum, viðtölum eða söngvum.

Ég heiti Matthías

Ég er verðlaunaður handritshöfundur og tónlistarmaður og hef víðtæka reynslu af skapandi vinnu fyrir vörumerki í landinu. Þá hef ég unnið við gerð frétta og texta af ólíku tagi auk þess sem ég var heimsfrægur í u.þ.b. 15 mínútur. Ég vil vinna með metnaðarfullu fólki að verkefnum sem skipta máli.

Tölum saman

hugmyndasmidur
@hugmyndasmidur.is