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 @@
-
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 @@
-
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 @@
+
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 @@
-
⌥
+
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 @@
-
+