diff --git a/docs/lab/index.html b/docs/lab/index.html
index 633348368..8a9ad5c7d 100644
--- a/docs/lab/index.html
+++ b/docs/lab/index.html
@@ -198,6 +198,7 @@ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
Default-on features:
+
diff --git a/docs/lab/lab.css b/docs/lab/lab.css
index e67068e92..a4f603b11 100644
--- a/docs/lab/lab.css
+++ b/docs/lab/lab.css
@@ -258,7 +258,7 @@ input[type="checkbox"]::after {
height:var(--checkbox-handle-size);
border-radius:var(--checkbox-handle-size);
transform: translate(0, 0);
- transition: all 168ms ease-out; /*cubic-bezier(0.09, 0.49, 0.71, 0.98);*/
+ transition: all 90ms ease-out; /*cubic-bezier(0.09, 0.49, 0.71, 0.98);*/
}
input[type="checkbox"][checked] {
background-color: var(--checkbox-on-bg);
diff --git a/docs/lab/samples.js b/docs/lab/samples.js
index 554b73097..f1262b56b 100644
--- a/docs/lab/samples.js
+++ b/docs/lab/samples.js
@@ -173,7 +173,7 @@ samples.set('Feature: ccmp', `
/i --> /idotless ==> i\u0300
/idotless /gravecomb --> /igrave ==> \u0131\u0300
-Enclosing glyphs (glyph + {U+20DD,U+20DE})
+Enclosing glyphs (base + {U+20DD,U+20DE})
U+20DD COMBINING ENCLOSING CIRCLE: ⃝
U+20DE COMBINING ENCLOSING SQUARE: ⃞
@@ -204,6 +204,15 @@ U\u20DE V\u20DE W\u20DE X\u20DE Y\u20DE Z\u20DE !\u20DE ?\u
←\u20DE →\u20DE ↑\u20DE ↓\u20DE
HE\u20DDLLO WO\u20DERLD
+
+The following should NOT compose but instead replace U+20DD or U+20DE with largeCircle or whiteLargeSquare: (They are in the wrong order: {U+20DD,U+20DE} + base. This was fixed in version 3.18.)
+
+\u20DDA \u20DDB \u20DDC \u20DD1 \u20DD2 \u20DD3
+
+\u20DEA \u20DEB \u20DEC \u20DE1 \u20DE2 \u20DE3
+
+;\u20DDELLO ;\u20DEORLD
+
`)
diff --git a/src/features/ccmp.fea b/src/features/ccmp.fea
index c48ad7c51..efe9495df 100644
--- a/src/features/ccmp.fea
+++ b/src/features/ccmp.fea
@@ -560,7 +560,7 @@ lookup ccmp03 {
} ccmp03;
# * enclosingsquarecomb -> composite
-sub A enclosingsquarecomb by A.squared;
+sub A' enclosingsquarecomb' by A.squared;
sub B enclosingsquarecomb by B.squared;
sub C enclosingsquarecomb by C.squared;
sub D enclosingsquarecomb by D.squared;
@@ -620,69 +620,8 @@ sub rightArrow enclosingsquarecomb by rightArrow.squared;
sub dngb_check enclosingsquarecomb by dngb_check.squared;
sub dngb_ballotx enclosingsquarecomb by dngb_ballotx.squared;
-# enclosingsquarecomb * -> composite
-sub enclosingsquarecomb A by A.squared;
-sub enclosingsquarecomb B by B.squared;
-sub enclosingsquarecomb C by C.squared;
-sub enclosingsquarecomb D by D.squared;
-sub enclosingsquarecomb E by E.squared;
-sub enclosingsquarecomb F by F.squared;
-sub enclosingsquarecomb G by G.squared;
-sub enclosingsquarecomb H by H.squared;
-sub enclosingsquarecomb I by I.squared;
-sub enclosingsquarecomb J by J.squared;
-sub enclosingsquarecomb K by K.squared;
-sub enclosingsquarecomb L by L.squared;
-sub enclosingsquarecomb M by M.squared;
-sub enclosingsquarecomb N by N.squared;
-sub enclosingsquarecomb O by O.squared;
-sub enclosingsquarecomb P by P.squared;
-sub enclosingsquarecomb Q by Q.squared;
-sub enclosingsquarecomb R by R.squared;
-sub enclosingsquarecomb S by S.squared;
-sub enclosingsquarecomb T by T.squared;
-sub enclosingsquarecomb U by U.squared;
-sub enclosingsquarecomb V by V.squared;
-sub enclosingsquarecomb W by W.squared;
-sub enclosingsquarecomb X by X.squared;
-sub enclosingsquarecomb Y by Y.squared;
-sub enclosingsquarecomb Z by Z.squared;
-sub enclosingsquarecomb zero by zero.squared;
-sub enclosingsquarecomb one by one.squared;
-sub enclosingsquarecomb two by two.squared;
-sub enclosingsquarecomb three by three.squared;
-sub enclosingsquarecomb four by four.squared;
-sub enclosingsquarecomb five by five.squared;
-sub enclosingsquarecomb six by six.squared;
-sub enclosingsquarecomb seven by seven.squared;
-sub enclosingsquarecomb eight by eight.squared;
-sub enclosingsquarecomb nine by nine.squared;
-sub enclosingsquarecomb zero.slash by zero.slash.squared;
-sub enclosingsquarecomb one.ss01 by one.ss01.squared;
-sub enclosingsquarecomb three.1 by three.1.squared;
-sub enclosingsquarecomb four.ss01 by four.ss01.squared;
-sub enclosingsquarecomb six.ss01 by six.ss01.squared;
-sub enclosingsquarecomb nine.ss01 by nine.ss01.squared;
-sub enclosingsquarecomb exclam by exclam.squared;
-sub enclosingsquarecomb question by question.squared;
-sub enclosingsquarecomb numbersign by numbersign.squared;
-sub enclosingsquarecomb hyphen by hyphen.squared;
-sub enclosingsquarecomb less by less.squared;
-sub enclosingsquarecomb greater by greater.squared;
-sub enclosingsquarecomb equal by equal.squared;
-sub enclosingsquarecomb plus by plus.squared;
-sub enclosingsquarecomb minus by minus.squared;
-sub enclosingsquarecomb multiply by multiply.squared;
-sub enclosingsquarecomb divide by divide.squared;
-sub enclosingsquarecomb upArrow by upArrow.squared;
-sub enclosingsquarecomb downArrow by downArrow.squared;
-sub enclosingsquarecomb leftArrow by leftArrow.squared;
-sub enclosingsquarecomb rightArrow by rightArrow.squared;
-sub enclosingsquarecomb dngb_check by dngb_check.squared;
-sub enclosingsquarecomb dngb_ballotx by dngb_ballotx.squared;
-
# * enclosingcirclecomb -> composite
-sub A enclosingcirclecomb by A.circled;
+sub A' enclosingcirclecomb' by A.circled;
sub B enclosingcirclecomb by B.circled;
sub C enclosingcirclecomb by C.circled;
sub D enclosingcirclecomb by D.circled;
@@ -742,63 +681,29 @@ sub rightArrow enclosingcirclecomb by rightArrow.circled;
sub dngb_check enclosingcirclecomb by dngb_check.circled;
sub dngb_ballotx enclosingcirclecomb by dngb_ballotx.circled;
-# enclosingcirclecomb * -> composite
-sub enclosingcirclecomb A by A.circled;
-sub enclosingcirclecomb B by B.circled;
-sub enclosingcirclecomb C by C.circled;
-sub enclosingcirclecomb D by D.circled;
-sub enclosingcirclecomb E by E.circled;
-sub enclosingcirclecomb F by F.circled;
-sub enclosingcirclecomb G by G.circled;
-sub enclosingcirclecomb H by H.circled;
-sub enclosingcirclecomb I by I.circled;
-sub enclosingcirclecomb J by J.circled;
-sub enclosingcirclecomb K by K.circled;
-sub enclosingcirclecomb L by L.circled;
-sub enclosingcirclecomb M by M.circled;
-sub enclosingcirclecomb N by N.circled;
-sub enclosingcirclecomb O by O.circled;
-sub enclosingcirclecomb P by P.circled;
-sub enclosingcirclecomb Q by Q.circled;
-sub enclosingcirclecomb R by R.circled;
-sub enclosingcirclecomb S by S.circled;
-sub enclosingcirclecomb T by T.circled;
-sub enclosingcirclecomb U by U.circled;
-sub enclosingcirclecomb V by V.circled;
-sub enclosingcirclecomb W by W.circled;
-sub enclosingcirclecomb X by X.circled;
-sub enclosingcirclecomb Y by Y.circled;
-sub enclosingcirclecomb Z by Z.circled;
-sub enclosingcirclecomb zero by zero.circled;
-sub enclosingcirclecomb one by one.circled;
-sub enclosingcirclecomb two by two.circled;
-sub enclosingcirclecomb three by three.circled;
-sub enclosingcirclecomb four by four.circled;
-sub enclosingcirclecomb five by five.circled;
-sub enclosingcirclecomb six by six.circled;
-sub enclosingcirclecomb seven by seven.circled;
-sub enclosingcirclecomb eight by eight.circled;
-sub enclosingcirclecomb nine by nine.circled;
-sub enclosingcirclecomb zero.slash by zero.slash.circled;
-sub enclosingcirclecomb one.ss01 by one.ss01.circled;
-sub enclosingcirclecomb three.1 by three.1.circled;
-sub enclosingcirclecomb four.ss01 by four.ss01.circled;
-sub enclosingcirclecomb six.ss01 by six.ss01.circled;
-sub enclosingcirclecomb nine.ss01 by nine.ss01.circled;
-sub enclosingcirclecomb exclam by exclam.circled;
-sub enclosingcirclecomb question by question.circled;
-sub enclosingcirclecomb numbersign by numbersign.circled;
-sub enclosingcirclecomb hyphen by hyphen.circled;
-sub enclosingcirclecomb less by less.circled;
-sub enclosingcirclecomb greater by greater.circled;
-sub enclosingcirclecomb equal by equal.circled;
-sub enclosingcirclecomb plus by plus.circled;
-sub enclosingcirclecomb minus by minus.circled;
-sub enclosingcirclecomb multiply by multiply.circled;
-sub enclosingcirclecomb divide by divide.circled;
-sub enclosingcirclecomb upArrow by upArrow.circled;
-sub enclosingcirclecomb downArrow by downArrow.circled;
-sub enclosingcirclecomb leftArrow by leftArrow.circled;
-sub enclosingcirclecomb rightArrow by rightArrow.circled;
-sub enclosingcirclecomb dngb_check by dngb_check.circled;
-sub enclosingcirclecomb dngb_ballotx by dngb_ballotx.circled;
+# enclosingsquarecomb * -> "hey you got the wrong order"
+# See https://github.com/rsms/inter/issues/335
+@ENCLOSED_BASE = [
+ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+ zero one two three four five six seven eight nine
+ zero.slash one.ss01 three.1 four.ss01 six.ss01 nine.ss01
+ exclam
+ question
+ numbersign
+ hyphen
+ less
+ greater
+ equal
+ plus
+ minus
+ multiply
+ divide
+ upArrow
+ downArrow
+ leftArrow
+ rightArrow
+ dngb_check
+ dngb_ballotx
+];
+sub enclosingsquarecomb' @ENCLOSED_BASE by whiteLargeSquare;
+sub enclosingcirclecomb' @ENCLOSED_BASE by largeCircle;