diff --git a/EurKEY-macOS-icon/drafts/colored-c-star-key.svg b/EurKEY-macOS-icon/drafts/colored-c-star-key.svg deleted file mode 100644 index 066235e..0000000 --- a/EurKEY-macOS-icon/drafts/colored-c-star-key.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/EurKEY-macOS-icon/drafts/text-eu-template.svg b/EurKEY-macOS-icon/drafts/text-eu-template.svg deleted file mode 100644 index c567f71..0000000 --- a/EurKEY-macOS-icon/drafts/text-eu-template.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - EU - diff --git a/EurKEY-macOS-icon/drafts/text-eur-template.svg b/EurKEY-macOS-icon/drafts/text-eur-template.svg deleted file mode 100644 index 1c22b5b..0000000 --- a/EurKEY-macOS-icon/drafts/text-eur-template.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - EUR - diff --git a/docs/eurkey-v1.2-layout.pdf b/docs/eurkey-v1.2-layout.pdf deleted file mode 100644 index 9197274..0000000 Binary files a/docs/eurkey-v1.2-layout.pdf and /dev/null differ diff --git a/docs/eurkey-v1.3-layout.pdf b/docs/eurkey-v1.3-layout.pdf deleted file mode 100644 index ad6cd4a..0000000 Binary files a/docs/eurkey-v1.3-layout.pdf and /dev/null differ diff --git a/docs/eurkey-v1.4-layout.pdf b/docs/eurkey-v1.4-layout.pdf deleted file mode 100644 index ee33b39..0000000 Binary files a/docs/eurkey-v1.4-layout.pdf and /dev/null differ diff --git a/docs/eurkey-v2.0-layout.pdf b/docs/eurkey-v2.0-layout.pdf deleted file mode 100644 index 32a13b2..0000000 Binary files a/docs/eurkey-v2.0-layout.pdf and /dev/null differ diff --git a/eurkey-macos.eu/img/icon-deadkeys.svg b/eurkey-macos.eu/img/icon-deadkeys.svg new file mode 100644 index 0000000..2ca3be0 --- /dev/null +++ b/eurkey-macos.eu/img/icon-deadkeys.svg @@ -0,0 +1,8 @@ + + + + + a + + + diff --git a/eurkey-macos.eu/img/icon-iso.svg b/eurkey-macos.eu/img/icon-iso.svg new file mode 100644 index 0000000..37d0df9 --- /dev/null +++ b/eurkey-macos.eu/img/icon-iso.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/eurkey-macos.eu/index.html b/eurkey-macos.eu/index.html index bcf0221..2f9a722 100644 --- a/eurkey-macos.eu/index.html +++ b/eurkey-macos.eu/index.html @@ -54,22 +54,22 @@

Features

-
+

Dead Keys for Diacritics

Type accented characters (ä, é, ñ, č, …) using intuitive Option-key combinations. No character palette needed.

-
+

ISO International Layout

Built for the physical English International keyboard found on European MacBooks — with the extra § key and big Enter.

-
+

Multiple Versions

Ships v1.2, v1.3, v1.4, and v2.0 in a single bundle. Pick the one that fits your workflow.

-
+

Easy Install

Download the DMG, drag the bundle to Keyboard Layouts, log out. Done in under a minute.

diff --git a/eurkey-macos.eu/keyboard.js b/eurkey-macos.eu/keyboard.js index da1fecb..7a4af80 100644 --- a/eurkey-macos.eu/keyboard.js +++ b/eurkey-macos.eu/keyboard.js @@ -63,7 +63,7 @@ const DEAD_KEY_NAMES = { "\u00af": "The Macrons", "\u02da": "The Rings & Dots", "\u03b1": "The Greeks", "\u221a": "The Mathematicians", "\u00ac": "The Navigators", "\u00a9": "The Navigators", - " ": "The Mathematicians", + "\uD835\uDD44": "The Mathematicians", }; const cache = new Map(); @@ -186,8 +186,7 @@ function renderKeyboard(data) { } else { keyElements.set(keyCode, keyEl); - let hasDead = false; - let deadState = null; + const deadStates = []; for (const layer of LAYERS) { const info = charForKey(data, layer.mod, keyCode); @@ -196,18 +195,19 @@ function renderKeyboard(data) { if (info) { span.textContent = displayChar(info.char); if (info.deadKey) { - hasDead = true; - deadState = info.deadKey; + if (!deadStates.includes(info.deadKey)) deadStates.push(info.deadKey); span.classList.add("key-char--is-dead"); } } keyEl.appendChild(span); } - if (hasDead) { + if (deadStates.length > 0) { + deadStates.reverse(); keyEl.classList.add("key--dead"); - keyEl.dataset.deadKey = deadState; - keyEl.addEventListener("click", () => toggleDeadKeyMode(deadState)); + keyEl.dataset.deadKey = deadStates[0]; + keyEl.dataset.deadKeys = JSON.stringify(deadStates); + keyEl.addEventListener("click", () => cycleDeadKeyMode(keyEl)); } } @@ -228,6 +228,23 @@ function toggleDeadKeyMode(deadState) { } } +function cycleDeadKeyMode(keyEl) { + const deadStates = JSON.parse(keyEl.dataset.deadKeys || "[]"); + if (deadStates.length === 0) return; + + if (!currentDeadKey || !deadStates.includes(currentDeadKey)) { + enterDeadKeyMode(deadStates[0]); + } else { + const idx = deadStates.indexOf(currentDeadKey); + const next = idx + 1; + if (next < deadStates.length) { + enterDeadKeyMode(deadStates[next]); + } else { + exitDeadKeyMode(); + } + } +} + function enterDeadKeyMode(deadState) { if (!currentData) return; const charMap = buildCompositionMap(currentData, deadState); @@ -260,21 +277,35 @@ function enterDeadKeyMode(deadState) { const baseComposed = charMap[baseChar] || ""; const shiftComposed = charMap[shiftChar] || ""; - const spans = keyEl.querySelectorAll(".key-char"); - // order: shift, option-shift, base, option - if (spans[0]) spans[0].textContent = displayChar(shiftComposed); - if (spans[1]) spans[1].textContent = ""; - if (spans[2]) spans[2].textContent = displayChar(baseComposed); - if (spans[3]) spans[3].textContent = ""; - - if (keyEl.dataset.deadKey === deadState) { + const allDead = JSON.parse(keyEl.dataset.deadKeys || "[]"); + if (allDead.includes(deadState)) { keyEl.classList.add("key--dead-active"); - } else if (baseComposed || shiftComposed) { - keyEl.classList.add("key--has-composition"); - keyEl.classList.remove("key--no-composition"); + // only show the span for the layer that owns this dead key + const spans = keyEl.querySelectorAll(".key-char"); + const layerOrder = [MOD_SHIFT, MOD_OPTION_SHIFT, MOD_BASE, MOD_OPTION]; + for (let i = 0; i < spans.length; i++) { + const info = charForKey(currentData, layerOrder[i], keyCode); + if (info?.deadKey === deadState) { + spans[i].style.visibility = "visible"; + } else { + spans[i].style.visibility = "hidden"; + } + } } else { - keyEl.classList.add("key--no-composition"); - keyEl.classList.remove("key--has-composition"); + const spans = keyEl.querySelectorAll(".key-char"); + // order: shift, option-shift, base, option + if (spans[0]) spans[0].textContent = displayChar(shiftComposed); + if (spans[1]) spans[1].textContent = ""; + if (spans[2]) spans[2].textContent = displayChar(baseComposed); + if (spans[3]) spans[3].textContent = ""; + + if (baseComposed || shiftComposed) { + keyEl.classList.add("key--has-composition"); + keyEl.classList.remove("key--no-composition"); + } else { + keyEl.classList.add("key--no-composition"); + keyEl.classList.remove("key--has-composition"); + } } } } @@ -302,6 +333,7 @@ function exitDeadKeyMode() { for (let i = 0; i < spans.length; i++) { const info = charForKey(currentData, layerOrder[i], keyCode); spans[i].textContent = info ? displayChar(info.char) : ""; + spans[i].style.visibility = ""; } } } diff --git a/src/keylayouts/EurKEY v2.0.keylayout b/src/keylayouts/EurKEY v2.0.keylayout index bf28e3c..ef775b5 100644 --- a/src/keylayouts/EurKEY v2.0.keylayout +++ b/src/keylayouts/EurKEY v2.0.keylayout @@ -508,7 +508,7 @@ - + @@ -1093,7 +1093,6 @@ - @@ -1132,10 +1131,6 @@ - - - - @@ -1584,7 +1579,6 @@ - @@ -1775,6 +1769,6 @@ - +