aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/gallery-probes/probe-fams.mjs8
-rw-r--r--tests/gallery-probes/probe.mjs102
2 files changed, 55 insertions, 55 deletions
diff --git a/tests/gallery-probes/probe-fams.mjs b/tests/gallery-probes/probe-fams.mjs
index 993d22d..c1b5f9d 100644
--- a/tests/gallery-probes/probe-fams.mjs
+++ b/tests/gallery-probes/probe-fams.mjs
@@ -71,17 +71,17 @@ try {
// Default is the shipped gold, unchanged until a chip is clicked. It reads the
// same as the amber family's --scr-hi because --gold-hi IS #ffbe54 — which is
// what makes the amber default pixel-identical rather than a near-miss.
- const kpInk0 = await evl(`getComputedStyle(document.querySelector('#card-R57 .kp-pad text')).fill`);
+ const kpInk0 = await evl(`getComputedStyle(document.querySelector('#card-R57 .dupre-kp-pad text')).fill`);
ok('R57 default ink = gold-hi', kpInk0 === 'rgb(255, 190, 84)', kpInk0);
// vfd recolors both the ink and the window behind it — a screen is not just its text
await evl(`document.querySelector('#card-R57 .fc[title="vfd"]').click()`);
- const kpInk1 = await evl(`getComputedStyle(document.querySelector('#card-R57 .kp-pad text')).fill`);
+ const kpInk1 = await evl(`getComputedStyle(document.querySelector('#card-R57 .dupre-kp-pad text')).fill`);
ok('R57 vfd chip recolors the ink to marquee cyan', kpInk1 === 'rgb(99, 230, 200)', kpInk1);
- /* .kp-win, not the first rect on the pad — that one is the faceplate, and
+ /* .dupre-kp-win, not the first rect on the pad — that one is the faceplate, and
reading it made this check report the plate's colour and fail for the wrong
reason. */
- const kpBg = await evl(`getComputedStyle(document.querySelector('#card-R57 .kp-win')).fill`);
+ const kpBg = await evl(`getComputedStyle(document.querySelector('#card-R57 .dupre-kp-win')).fill`);
ok('R57 vfd chip recolors the window too', kpBg === 'rgb(6, 16, 13)', kpBg);
ok('no exceptions after chip clicks', events.filter(e => e.method === 'Runtime.exceptionThrown').length === 0);
diff --git a/tests/gallery-probes/probe.mjs b/tests/gallery-probes/probe.mjs
index 4892188..a242c41 100644
--- a/tests/gallery-probes/probe.mjs
+++ b/tests/gallery-probes/probe.mjs
@@ -97,7 +97,7 @@ try {
// 1d. The chip actually recolours, and its default is untouched until asked —
// the same fallback discipline the screen families use.
const chipInk = await evl(`(()=>{
- const chip = document.querySelector('#card-07 .chip');
+ const chip = document.querySelector('#card-07 .dupre-chip');
const lit = () => getComputedStyle(chip).color;
const before = lit();
document.querySelector('#card-07 .fc[title="vfd"]').click();
@@ -181,10 +181,10 @@ try {
// resize to match. One-per-row cards must be much wider than four-per-row,
// and the count actually reaches the grid.
ok('default is 3 instruments/row', await evl(`document.body.dataset.cols`) === '3');
- await evl(`document.querySelector('.szbar .key[data-cols="1"]').click()`);
+ await evl(`document.querySelector('.szbar .dupre-key[data-cols="1"]').click()`);
const w1col = await evl(`document.querySelector('.card').getBoundingClientRect().width`);
const cols1 = await evl(`getComputedStyle(document.querySelector('.grid')).gridTemplateColumns.split(' ').length`);
- await evl(`document.querySelector('.szbar .key[data-cols="4"]').click()`);
+ await evl(`document.querySelector('.szbar .dupre-key[data-cols="4"]').click()`);
const w4col = await evl(`document.querySelector('.card').getBoundingClientRect().width`);
const cols4 = await evl(`getComputedStyle(document.querySelector('.grid')).gridTemplateColumns.split(' ').length`);
ok('1/row is much wider than 4/row', w1col > w4col * 2.5, `w1=${Math.round(w1col)} w4=${Math.round(w4col)}`);
@@ -194,10 +194,10 @@ try {
// 3. behavioral, zoomed: fader drag on card 03 changes readout. Run at 2/row,
// not 1/row: at one-per-row the card is wide enough that its controls fall
// outside the 1600px probe window and the dispatched mouse events miss.
- await evl(`document.querySelector('.szbar .key[data-cols="2"]').click()`);
+ await evl(`document.querySelector('.szbar .dupre-key[data-cols="2"]').click()`);
await evl(`document.querySelectorAll('.card')[2].scrollIntoView({block:'center'}); ''`);
await sleep(200);
- const fr = await evl(`(()=>{const c=document.querySelectorAll('.card')[2];const f=c.querySelector('.fader');const r=f.getBoundingClientRect();return [r.left,r.top,r.width,r.height];})()`);
+ const fr = await evl(`(()=>{const c=document.querySelectorAll('.card')[2];const f=c.querySelector('.dupre-fader');const r=f.getBoundingClientRect();return [r.left,r.top,r.width,r.height];})()`);
const before = await evl(`document.getElementById('rd-03').textContent`);
await drag(fr[0] + fr[2] * 0.2, fr[1] + fr[3] / 2, fr[0] + fr[2] * 0.9, fr[1] + fr[3] / 2);
await sleep(150);
@@ -218,21 +218,21 @@ try {
// 5. card 02 console keys: reading order and per-key tone. LIVE is green
// because --pass is what the kit means by live everywhere else; gold stays
// the generic engaged look. Craig's call, 2026-07-16.
- const order = await evl(`[...document.querySelectorAll('#card-02 .key')].map(b => b.textContent)`);
+ const order = await evl(`[...document.querySelectorAll('#card-02 .dupre-key')].map(b => b.textContent)`);
ok('card 02 keys read SCAN, LIVE, MUTED',
JSON.stringify(order) === JSON.stringify(['SCAN', 'LIVE', 'MUTED']), JSON.stringify(order));
const engaged = await evl(`(()=>{
- const lit = [...document.querySelectorAll('#card-02 .key')].filter(b => /\\b(on|green|red)\\b/.test(b.className));
- return lit.length === 1 ? lit[0].textContent + ':' + lit[0].className.replace('key ','') : 'lit=' + lit.length;
+ const lit = [...document.querySelectorAll('#card-02 .dupre-key')].filter(b => /\\bdupre-(on|green|red)\\b/.test(b.className));
+ return lit.length === 1 ? lit[0].textContent + ':' + lit[0].className.replace('dupre-key dupre-','') : 'lit=' + lit.length;
})()`);
ok('card 02 engages LIVE in green by default', engaged === 'LIVE:green', engaged);
const muted = await evl(`(()=>{
- const keys = [...document.querySelectorAll('#card-02 .key')];
+ const keys = [...document.querySelectorAll('#card-02 .dupre-key')];
keys.find(b => b.textContent === 'MUTED').click();
- const lit = keys.filter(b => /\\b(on|green|red)\\b/.test(b.className));
- return lit.length === 1 ? lit[0].textContent + ':' + lit[0].className.replace('key ','') : 'lit=' + lit.length;
+ const lit = keys.filter(b => /\\bdupre-(on|green|red)\\b/.test(b.className));
+ return lit.length === 1 ? lit[0].textContent + ':' + lit[0].className.replace('dupre-key dupre-','') : 'lit=' + lit.length;
})()`);
ok('card 02 MUTED engages red and releases LIVE', muted === 'MUTED:red', muted);
@@ -360,7 +360,7 @@ try {
// the operator can't be assumed to touch-type, and it is what Craig's
// reference photos show. A QWERTY drift here would silently lose the idiom.
const abcOrder = await evl(`(()=>{
- const letters = [...document.querySelectorAll('#card-R57 .kp-key')]
+ const letters = [...document.querySelectorAll('#card-R57 .dupre-kp-key')]
.map(k => k.dataset.k).filter(k => /^[A-Z]$/.test(k));
const want = [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'];
return JSON.stringify(letters) === JSON.stringify(want)
@@ -369,7 +369,7 @@ try {
ok('R57 carries A-Z in alphabetical order', abcOrder === 'ok', abcOrder);
const abcDigits = await evl(`(()=>{
- const d = [...document.querySelectorAll('#card-R57 .kp-key')]
+ const d = [...document.querySelectorAll('#card-R57 .dupre-kp-key')]
.map(k => k.dataset.k).filter(k => /^[0-9]$/.test(k));
return d.length === 10 ? 'ok' : 'got ' + d.length + ': ' + d.join('');
})()`);
@@ -383,7 +383,7 @@ try {
// start at column 3 while M-X started at column 0).
const layout = await evl(`(()=>{
const x = k => {
- const g = [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const g = [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
return g ? Math.round(g.querySelector('rect').getBBox().x) : null;
};
const colStarts = ['A','D','G','J','M','S','Y'].map(x);
@@ -400,7 +400,7 @@ try {
// deliberate inversion of where they started, easy to "tidy" back.
const reach = await evl(`(()=>{
const box = k => {
- const g = [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const g = [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
return g ? g.querySelector('rect').getBBox() : null;
};
const del = box('DEL'), clr = box('CLR'), ent = box('ENT');
@@ -418,7 +418,7 @@ try {
// the palette may be retuned, the distinction may not collapse.
const ladder = await evl(`(()=>{
const fill = k => {
- const g = [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const g = [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
return g ? g.querySelector('rect').getAttribute('fill') : null;
};
const f = { DEL: fill('DEL'), CLR: fill('CLR'), ENT: fill('ENT'), plain: fill('A'), digit: fill('1') };
@@ -432,7 +432,7 @@ try {
// 11. typing accumulates, in order. A keypad that registers presses but drops
// or reorders them is the failure that matters for a password field.
const typed = await evl(`(()=>{
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
key('CLR').dispatchEvent(new MouseEvent('click', {bubbles:true}));
for (const c of ['W','I','F','I','7']) key(c).dispatchEvent(new MouseEvent('click', {bubbles:true}));
return document.getElementById('rd-R57').textContent;
@@ -443,7 +443,7 @@ try {
// wiping the whole entry, which on a 20-character passphrase means
// starting over — so the check that matters is that DEL is not CLR.
const del = await evl(`(()=>{
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
const click = k => key(k).dispatchEvent(new MouseEvent('click', {bubbles:true}));
click('CLR');
for (const c of ['C','A','B','S']) click(c);
@@ -466,7 +466,7 @@ try {
// passphrase they can't read back. Checked past the 13-char truncation
// boundary, where there are no pad dots left for a space to displace.
const space = await evl(`(()=>{
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
const click = k => key(k).dispatchEvent(new MouseEvent('click', {bubbles:true}));
const win = () => document.querySelector('#card-R57 text[font-size="14"]').textContent;
click('CLR');
@@ -486,7 +486,7 @@ try {
// the checks above — they mutate it, so a check that assumed their leftovers
// would pass or fail on their behaviour instead of its own.
const committed = await evl(`(()=>{
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
const click = k => key(k).dispatchEvent(new MouseEvent('click', {bubbles:true}));
click('CLR');
for (const c of ['N','E','T','5']) click(c);
@@ -523,7 +523,7 @@ try {
// binds globally types into itself from anywhere on a 110-card page.
// Typing at the body with the card unfocused must do nothing at all.
const unfocused = await evl(`(()=>{
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
key('CLR').dispatchEvent(new MouseEvent('click', {bubbles:true}));
document.activeElement.blur();
for (const c of ['A','B','C']) document.body.dispatchEvent(
@@ -535,8 +535,8 @@ try {
// 13c. Focused, the same keys land — and land through press(), so click and key
// cannot drift apart.
const typedByKey = await evl(`(()=>{
- const pad = document.querySelector('#card-R57 .kp-pad');
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const pad = document.querySelector('#card-R57 .dupre-kp-pad');
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
key('CLR').dispatchEvent(new MouseEvent('click', {bubbles:true}));
pad.focus();
const send = k => pad.dispatchEvent(new KeyboardEvent('keydown', { key: k, bubbles: true, cancelable: true }));
@@ -554,8 +554,8 @@ try {
// identical buffer and readout. Duplicated logic in the handler would
// pass every check above this one and fail here.
const drift = await evl(`(()=>{
- const pad = document.querySelector('#card-R57 .kp-pad');
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const pad = document.querySelector('#card-R57 .dupre-kp-pad');
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
const rd = () => document.getElementById('rd-R57').textContent;
const seq = ['A','B','SPC','7'];
key('CLR').dispatchEvent(new MouseEvent('click', {bubbles:true}));
@@ -578,7 +578,7 @@ try {
const card = document.getElementById('card-R57');
const h = card.dupre;
if (!h || !h.press) return 'no handle';
- const key = k => [...card.querySelectorAll('.kp-key')].find(e => e.dataset.k === k);
+ const key = k => [...card.querySelectorAll('.dupre-kp-key')].find(e => e.dataset.k === k);
key('CLR').dispatchEvent(new MouseEvent('click', {bubbles:true}));
h.press('F1'); h.press('ArrowLeft'); h.press('');
const junk = h.get();
@@ -600,7 +600,7 @@ try {
// how the page is navigable and Escape belongs to the audit stepper, so a
// instrument that swallows either breaks something it cannot see.
const defaults = await evl(`(()=>{
- const pad = document.querySelector('#card-R57 .kp-pad');
+ const pad = document.querySelector('#card-R57 .dupre-kp-pad');
pad.focus();
const fired = k => {
const e = new KeyboardEvent('keydown', { key: k, bubbles: true, cancelable: true });
@@ -621,8 +621,8 @@ try {
// 13e. press() is an allowlist, not a mailbox: an unmapped key must not append.
const unmapped = await evl(`(()=>{
- const pad = document.querySelector('#card-R57 .kp-pad');
- const key = k => [...document.querySelectorAll('#card-R57 .kp-key')].find(e => e.dataset.k === k);
+ const pad = document.querySelector('#card-R57 .dupre-kp-pad');
+ const key = k => [...document.querySelectorAll('#card-R57 .dupre-kp-key')].find(e => e.dataset.k === k);
key('CLR').dispatchEvent(new MouseEvent('click', {bubbles:true}));
pad.focus();
['F1','ArrowLeft','Home','é','!'].forEach(k =>
@@ -639,10 +639,10 @@ try {
// while hunting ("stylus over g"), and asserting on it would fail a correct
// instrument for showing the operator where the pointer is.
const grammar = await evl(`(()=>{
- const cell = c => document.querySelector('#card-R58 .ix-cell[data-c="' + c + '"]');
- const lever = document.querySelector('#card-R58 .ix-lever');
+ const cell = c => document.querySelector('#card-R58 .dupre-ix-cell[data-c="' + c + '"]');
+ const lever = document.querySelector('#card-R58 .dupre-ix-lever');
const buf = () => document.getElementById('card-R58').dupre.get();
- document.querySelector('#card-R58 .ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
+ document.querySelector('#card-R58 .dupre-ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
const empty = buf();
['M','i','g'].forEach(c => cell(c).dispatchEvent(new MouseEvent('click', {bubbles:true})));
const afterSelecting = buf();
@@ -654,9 +654,9 @@ try {
// 14b. The lever prints whatever the stylus is resting on, once per pull — the
// operator's two hands are two separate acts.
const spelled = await evl(`(()=>{
- const cell = c => document.querySelector('#card-R58 .ix-cell[data-c="' + c + '"]');
- const lever = document.querySelector('#card-R58 .ix-lever');
- document.querySelector('#card-R58 .ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
+ const cell = c => document.querySelector('#card-R58 .dupre-ix-cell[data-c="' + c + '"]');
+ const lever = document.querySelector('#card-R58 .dupre-ix-lever');
+ document.querySelector('#card-R58 .dupre-ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
for (const c of ['M','i','g','n','o','n']) {
cell(c).dispatchEvent(new MouseEvent('click', {bubbles:true}));
lever.dispatchEvent(new MouseEvent('click', {bubbles:true}));
@@ -668,9 +668,9 @@ try {
// 14c. Pulling the lever twice prints the character twice: the selection stays
// put, which is what lets you type 'ss' without re-aiming.
const repeat = await evl(`(()=>{
- const cell = c => document.querySelector('#card-R58 .ix-cell[data-c="' + c + '"]');
- const lever = document.querySelector('#card-R58 .ix-lever');
- document.querySelector('#card-R58 .ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
+ const cell = c => document.querySelector('#card-R58 .dupre-ix-cell[data-c="' + c + '"]');
+ const lever = document.querySelector('#card-R58 .dupre-ix-lever');
+ document.querySelector('#card-R58 .dupre-ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
cell('s').dispatchEvent(new MouseEvent('click', {bubbles:true}));
lever.dispatchEvent(new MouseEvent('click', {bubbles:true}));
lever.dispatchEvent(new MouseEvent('click', {bubbles:true}));
@@ -690,7 +690,7 @@ try {
// That economy is an old value worth keeping, so it's asserted rather than
// tolerated: adding a 1 key would be a silent departure from the reference.
const charset = await evl(`(()=>{
- const have = new Set([...document.querySelectorAll('#card-R58 .ix-cell')].map(c => c.dataset.c));
+ const have = new Set([...document.querySelectorAll('#card-R58 .dupre-ix-cell')].map(c => c.dataset.c));
const need = [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ', ...'abcdefghijklmnopqrstuvwxyz',
...'23456789', 'ä','ö','ü','§','½','¼','¾'];
const missing = need.filter(c => !have.has(c));
@@ -707,7 +707,7 @@ try {
// are dark" is wrong, and only position decides.
const zones = await evl(`(()=>{
const disc = c => {
- const g = [...document.querySelectorAll('#card-R58 .ix-cell')].find(e => e.dataset.c === c);
+ const g = [...document.querySelectorAll('#card-R58 .dupre-ix-cell')].find(e => e.dataset.c === c);
return g ? g.querySelector('circle').getAttribute('fill') : null;
};
const caps = disc('P'), lower = disc('p'), ringCap = disc('J'), ringPunct = disc('&');
@@ -725,7 +725,7 @@ try {
const L = DUPRE.indexPlate && DUPRE.indexPlate.LAYOUT;
if (!L) return 'no LAYOUT';
if (!Array.isArray(L) || !L.every(Array.isArray)) return 'LAYOUT is not a grid';
- const cells = document.querySelectorAll('#card-R58 .ix-cell').length;
+ const cells = document.querySelectorAll('#card-R58 .dupre-ix-cell').length;
const declared = L.flat().filter(Boolean).length;
return cells === declared ? 'ok' : 'drawn ' + cells + ' but declared ' + declared;
})()`);
@@ -738,10 +738,10 @@ try {
// controls back onto the characters.
const clear = await evl(`(()=>{
const box = sel => { const e = document.querySelector('#card-R58 ' + sel); return e ? e.getBBox() : null; };
- const cells = [...document.querySelectorAll('#card-R58 .ix-cell')].map(c => c.getBBox());
+ const cells = [...document.querySelectorAll('#card-R58 .dupre-ix-cell')].map(c => c.getBBox());
const right = Math.max(...cells.map(b => b.x + b.width));
const hits = [];
- for (const sel of ['.ix-lever', '.ix-clear']) {
+ for (const sel of ['.dupre-ix-lever', '.dupre-ix-clear']) {
const b = box(sel);
if (!b) { hits.push(sel + ' missing'); continue; }
if (b.x < right) hits.push(sel + ' starts at ' + Math.round(b.x) + ', left of the plate edge ' + Math.round(right));
@@ -757,7 +757,7 @@ try {
// shrink was the trap, which is why VH now takes a floor.
const stack = await evl(`(()=>{
const bb = sel => { const e = document.querySelector('#card-R58 ' + sel); return e ? e.getBBox() : null; };
- const lever = bb('.ix-lever'), clr = bb('.ix-clear');
+ const lever = bb('.dupre-ix-lever'), clr = bb('.dupre-ix-clear');
const legend = [...document.querySelectorAll('#card-R58 text')].find(t => t.textContent === 'PRINT');
if (!lever || !clr || !legend) return 'missing gutter part';
const lg = legend.getBBox();
@@ -766,7 +766,7 @@ try {
if (overlaps(lever, clr)) return 'lever overlaps CLR';
if (overlaps(lg, clr)) return 'PRINT legend overlaps CLR';
if (overlaps(lg, lever)) return 'PRINT legend overlaps the lever';
- const vb = document.querySelector('#card-R58 .ix-pad').viewBox.baseVal;
+ const vb = document.querySelector('#card-R58 .dupre-ix-pad').viewBox.baseVal;
if (clr.y + clr.height > vb.height) return 'CLR falls outside the viewBox';
return 'ok';
})()`);
@@ -815,10 +815,10 @@ try {
// quietly become R57 with a nicer plate, and the one thing it exists to
// demonstrate is gone.
const ixType = await evl(`(()=>{
- const pad = document.querySelector('#card-R58 .ix-pad');
+ const pad = document.querySelector('#card-R58 .dupre-ix-pad');
const h = document.getElementById('card-R58').dupre;
const send = k => pad.dispatchEvent(new KeyboardEvent('keydown', { key: k, bubbles: true, cancelable: true }));
- document.querySelector('#card-R58 .ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
+ document.querySelector('#card-R58 .dupre-ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
pad.focus();
['M','i','g'].forEach(send);
const afterTyping = h.get();
@@ -833,10 +833,10 @@ try {
// uppercase; this one must not, and that difference is the plate's whole
// argument for having no shift key.
const ixCase = await evl(`(()=>{
- const pad = document.querySelector('#card-R58 .ix-pad');
+ const pad = document.querySelector('#card-R58 .dupre-ix-pad');
const h = document.getElementById('card-R58').dupre;
const send = k => pad.dispatchEvent(new KeyboardEvent('keydown', { key: k, bubbles: true, cancelable: true }));
- document.querySelector('#card-R58 .ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
+ document.querySelector('#card-R58 .dupre-ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
pad.focus();
send('a'); send('Enter');
send('A'); send('Enter');
@@ -848,7 +848,7 @@ try {
// always. (The missing space cell is a known gap — the real Mignon has a
// separate space key.)
const ixSpace = await evl(`(()=>{
- const pad = document.querySelector('#card-R58 .ix-pad');
+ const pad = document.querySelector('#card-R58 .dupre-ix-pad');
pad.focus();
const e = new KeyboardEvent('keydown', { key: ' ', bubbles: true, cancelable: true });
pad.dispatchEvent(e);
@@ -863,7 +863,7 @@ try {
// stylus legitimately stays where the previous check left it.
const ixBlur = await evl(`(()=>{
const h = document.getElementById('card-R58').dupre;
- document.querySelector('#card-R58 .ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
+ document.querySelector('#card-R58 .dupre-ix-clear').dispatchEvent(new MouseEvent('click', {bubbles:true}));
document.activeElement.blur();
const before = JSON.stringify([h.get(), h.selected()]);
['Q','Z'].forEach(k => document.body.dispatchEvent(