commit 0631660542dd24c831791bdf01a70e7aab5502a3 parent 1284f78c5dc62c619d9171ab0e35cc7d7ffb2a26 Author: Florian Dold <dold@taler.net> Date: Wed, 4 Nov 2026 23:56:37 +0100 merchant web UI: cover token setup with browser and visual checks Exercise selector geometry, rounding, keyboard interaction, type switching, and floating actions across desktop, mobile, and supported languages. Add reviewed image and accessibility snapshots for the final UI. Diffstat:
91 files changed, 14799 insertions(+), 7 deletions(-)
diff --git a/packages/taler-merchant-webui/contrib/qa/percentage-editor-check.mjs b/packages/taler-merchant-webui/contrib/qa/percentage-editor-check.mjs @@ -0,0 +1,300 @@ +/* + This file is part of GNU Taler + (C) 2026 Taler Systems S.A. + SPDX-License-Identifier: GPL-3.0-or-later + */ +import assert from "node:assert/strict"; +import { createServer } from "node:http"; +import { readFileSync } from "node:fs"; +import { build } from "esbuild"; +import puppeteer from "puppeteer-core"; +import { buildOptions } from "../../esbuild.config.mjs"; +const bundle = await build({ + ...buildOptions({ outdir: "unused", dev: true }), + entryPoints: undefined, + stdin: { + resolveDir: process.cwd(), + loader: "tsx", + contents: ` + import { render } from 'preact'; + + import { CreateSubscriptionScreen } from './src/screens/CreateSubscriptionScreen.tsx'; + import { installFormSubmitShortcut } from './src/ui/formSubmitShortcut.ts'; + { + window.removeShortcut = installFormSubmitShortcut(document); + if (location.pathname === '/wizard') render(<CreateSubscriptionScreen setupMode="wizard" primaryCurrency="CHF" + categories={[{id:1,name:'Coffee',productCount:1},{id:2,name:'Cake',productCount:1}]} + onCreateFamily={async payload => { window.saved = payload; }} />, document.getElementById('app')); + } + `, + }, + splitting: false, + sourcemap: false, + write: false, +}); +const script = bundle.outputFiles.find((f) => f.path.endsWith(".js")).text; +const css = readFileSync("dist/prod/style.css"); +const server = createServer((req, res) => { + const pathname = new URL(req.url, "http://local").pathname; + res.setHeader( + "Content-Type", + pathname === "/app.js" + ? "text/javascript" + : pathname === "/style.css" + ? "text/css" + : "text/html", + ); + res.end( + pathname === "/app.js" + ? script + : pathname === "/style.css" + ? css + : '<!doctype html><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/style.css"><div id="app"></div><script type="module" src="/app.js"></script>', + ); +}); +await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + +const browser = await puppeteer.launch({ + executablePath: process.env.CHROME_BIN || "/usr/bin/google-chrome", + headless: true, + args: ["--no-sandbox"], +}); +let checks = 0; +try { + const page = await browser.newPage(); + await page.evaluateOnNewDocument(() => + localStorage.setItem("taler_merchant_lang", "en"), + ); + const origin = `http://127.0.0.1:${server.address().port}`; + const settle = () => + page.evaluate( + () => + new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(resolve)), + ), + ); + const shortcut = async () => { + await page.keyboard.down("Control"); + await page.keyboard.press("Enter"); + await page.keyboard.up("Control"); + await settle(); + }; + const type = async (selector, value) => { + await page.focus(selector); + await page.keyboard.down("Control"); + await page.keyboard.press("KeyA"); + await page.keyboard.up("Control"); + await page.keyboard.type(value); + await settle(); + }; + const mode = '[data-percentage-editor] button[aria-label^="Rounding mode:"]'; + const precision = + '[data-percentage-editor] button[aria-label^="Rounding increment:"]'; + const popup = '[data-percentage-editor] [role="dialog"]'; + const open = async (selector) => { + await page.focus(selector); + await page.keyboard.press("ArrowDown"); + await settle(); + const box = await page.$eval(popup, (el) => { + const r = el.getBoundingClientRect(); + return { + left: r.left, + top: r.top, + right: r.right, + bottom: r.bottom, + width: innerWidth, + height: innerHeight, + }; + }); + assert.ok( + box.left >= 11 && + box.top >= 11 && + box.right <= box.width - 11 && + box.bottom <= box.height - 11, + "popover stays inside viewport", + ); + checks++; + }; + for (const width of [1280, 390]) { + await page.setViewport({ width, height: width === 390 ? 844 : 1100 }); + await page.goto(origin + "/wizard"); + await page.waitForSelector("#sub_name_input"); + await type("#sub_name_input", "Coffee stamps"); + await type("#sub_desc_input", "Collect stamps for a discount."); + await shortcut(); + await page.focus('input[name="token-issuance-scope"][value="any"]'); + await page.keyboard.press("Space"); + await shortcut(); + await type("#sub_discount_percentage", "12.5"); + await page.click('label:has(> input[name="stamp_count"][value="5"])'); + await page.focus('input[name="stamp_count"][value="5"]'); + for (const value of ["10", "15", "20", "custom"]) { + await page.keyboard.press("ArrowRight"); + assert.equal( + await page.$eval('input[name="stamp_count"]:checked', (el) => el.value), + value, + ); + } + await page.keyboard.press("Tab"); + assert.equal( + await page.evaluate(() => document.activeElement.id), + "sub_required_tokens", + ); + await type("#sub_required_tokens", "7"); + await page.click('label:has(> input[name="stamp_count"][value="10"])'); + assert.equal(await page.$("#sub_required_tokens"), null); + await page.click('label:has(> input[name="stamp_count"][value="custom"])'); + assert.equal( + await page.$eval("#sub_required_tokens", (el) => el.value), + "7", + ); + await page.click('label:has(> input[name="stamp_count"][value="5"])'); + checks++; + + await page.focus('input[name="token-redemption-scope"][value="any"]'); + await page.keyboard.press("Space"); + await page.$eval("[data-percentage-editor]", (el) => + el.scrollIntoView({ block: "center" }), + ); + await settle(); + const before = await page.$eval( + '[data-field="sub_required_tokens"]', + (el) => el.getBoundingClientRect().top, + ); + await open(mode); + assert.equal( + await page.evaluate(() => document.activeElement.value), + "down", + ); + await page.keyboard.press("ArrowDown"); + await page.keyboard.press("Enter"); + await settle(); + assert.equal(await page.$(popup), null); + assert.match(await page.$eval(mode, (el) => el.textContent), /to nearest/); + await open(mode); + assert.equal( + await page.evaluate(() => document.activeElement.value), + "nearest", + "reopening focuses the selected direction", + ); + await page.keyboard.press("Escape"); + assert.equal( + await page.evaluate(() => + document.activeElement.getAttribute("aria-expanded"), + ), + "false", + ); + await open(precision); + assert.equal( + await page.evaluate(() => document.activeElement.id), + "sub_discount_rounding_precision", + ); + assert.ok( + Math.abs( + (await page.$eval( + '[data-field="sub_required_tokens"]', + (el) => el.getBoundingClientRect().top, + )) - before, + ) < 1, + "editors do not move the form", + ); + await type("#sub_discount_rounding_precision", "0.00000001"); + await page.keyboard.press("Enter"); + await settle(); + assert.equal(await page.$(popup), null); + assert.equal( + await page.$eval("#token-step-heading", (el) => el.textContent), + "Customer reward", + "Enter finishes editing without advancing", + ); + assert.match( + await page.$eval(precision, (el) => el.textContent), + /0\.00000001/, + ); + await open(precision); + await page.keyboard.press("Tab"); + await page.keyboard.press("Tab"); + await settle(); + assert.equal( + await page.$(popup), + null, + "Tab leaves the editor without trapping focus", + ); + await open(mode); + await page.click("#token-step-heading"); + await settle(); + assert.equal(await page.$(popup), null, "outside click dismisses"); + await open(precision); + await type("#sub_discount_rounding_precision", "0"); + await page.keyboard.press("Escape"); + await shortcut(); + assert.equal( + await page.$eval("#token-step-heading", (el) => el.textContent), + "Customer reward", + ); + assert.equal( + await page.evaluate(() => document.activeElement.id), + "sub_discount_rounding_precision", + "invalid precision reopens and focuses its editor", + ); + assert.equal( + await page.$eval("#sub_discount_rounding_precision", (el) => + el.getAttribute("aria-invalid"), + ), + "true", + ); + await type("#sub_discount_rounding_precision", "0.05"); + await page.waitForFunction( + () => !document.querySelector("#sub_discount_rounding_precision-error"), + ); + assert.equal( + await page.$('[role="alert"]'), + null, + "correcting the increment clears the summary immediately", + ); + assert.equal( + await page.evaluate(() => document.activeElement.id), + "sub_discount_rounding_precision", + "clearing feedback keeps focus in the editor", + ); + await shortcut(); + assert.equal( + await page.$eval("#token-step-heading", (el) => el.textContent), + "Validity", + "Ctrl+Enter advances from inside the editor", + ); + await page.evaluate(() => { + Array.from(document.querySelectorAll("button")) + .find((button) => button.textContent.trim() === "Back") + .click(); + }); + await settle(); + assert.equal( + await page.$(popup), + null, + "returning to the step keeps editors closed", + ); + await shortcut(); + await shortcut(); + await shortcut(); + assert.deepEqual( + await page.evaluate( + () => window.saved.extraData.experimental_discount.rounding, + ), + { mode: "nearest", precision: "0.05" }, + ); + assert.equal( + await page.evaluate( + () => window.saved.extraData.experimental_discount.percentage, + ), + "12.5", + ); + checks++; + } + console.log( + `PASS ${checks} percentage editor checks across desktop and mobile, including keyboard editing, validation and saved semantics`, + ); +} finally { + await browser.close(); + await new Promise((resolve) => server.close(resolve)); +} diff --git a/packages/taler-merchant-webui/contrib/qa/token-layout-check.mjs b/packages/taler-merchant-webui/contrib/qa/token-layout-check.mjs @@ -0,0 +1,547 @@ +/* + This file is part of GNU Taler + (C) 2026 Taler Systems S.A. + SPDX-License-Identifier: GPL-3.0-or-later + */ +// Run after building from the package root. Keep both shells' chrome visible. +import assert from "node:assert/strict"; +import { createServer } from "node:http"; +import { readFileSync } from "node:fs"; +import { build } from "esbuild"; +import puppeteer from "puppeteer-core"; +import { buildOptions } from "../../esbuild.config.mjs"; +const bundle = await build({ + ...buildOptions({ outdir: "unused", dev: true }), + entryPoints: undefined, + stdin: { + resolveDir: process.cwd(), + loader: "tsx", + contents: ` + import { render } from 'preact'; + import { StoryViewerScreen } from './src/stories/StoryViewerScreen.tsx'; + import { CreateSubscriptionScreen } from './src/screens/CreateSubscriptionScreen.tsx'; + import { Layout } from './src/ui/Layout.tsx'; + import { TranslationProvider } from './src/context/translation.tsx'; + import { FormActionFooter } from './src/ui/FormActionFooter.tsx'; + import { useState } from 'preact/hooks'; + const footerCase = new URLSearchParams(location.search).get('footer'); + function FooterFixture() { + const [long, setLong] = useState(footerCase !== 'short'); + const [error, setError] = useState(''); + return <main class="merchant-page-content"> + <div class={footerCase === 'modal' ? 'modal-scroll-content relative overflow-y-auto p-6' : ''} + style={footerCase === 'modal' ? { height: 400 } : undefined}> + <form class="space-y-6" onSubmit={e => { e.preventDefault(); setError('Please check these settings.'); }}> + <div data-fixture-content style={{height: long ? 1400 : 60}}> + <button type="button" data-toggle-length onClick={() => setLong(!long)}>Toggle form length</button> + </div> + <FormActionFooter variant={footerCase === 'inline' ? 'inline' : 'sticky'} validationError={error}> + <button type="submit">Save</button> + </FormActionFooter> + </form> + </div> + </main>; + } + const catalogue = new URLSearchParams(location.search).get('shell') === 'catalogue'; + render(<TranslationProvider>{footerCase ? <FooterFixture /> : catalogue ? <StoryViewerScreen /> : + <Layout><CreateSubscriptionScreen setupMode="wizard" primaryCurrency="CHF" + categories={[{id: 1, name: 'Coffee and freshly baked pastries from our neighbourhood bakery', productCount: 0}]} /> + </Layout>}</TranslationProvider>, document.getElementById('app')); + `, + }, + splitting: false, + sourcemap: false, + write: false, +}); +const script = bundle.outputFiles.find((f) => f.path.endsWith(".js")).text; +const css = readFileSync("dist/prod/style.css"); +const server = createServer((req, res) => { + const pathname = new URL(req.url, "http://local").pathname; + res.setHeader( + "Content-Type", + pathname === "/app.js" + ? "text/javascript" + : pathname === "/style.css" + ? "text/css" + : "text/html", + ); + res.end( + pathname === "/app.js" + ? script + : pathname === "/style.css" + ? css + : '<!doctype html><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/style.css"><div id="app"></div><script type="module" src="/app.js"></script>', + ); +}); +await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); +let browser; +let checks = 0; +let footerChecks = 0; +const settle = (page) => + page.evaluate( + () => + new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(resolve)), + ), + ); +const setInput = (page, selector, value) => + page.$eval( + selector, + (el, value) => { + el.value = value; + el.dispatchEvent(new Event("input", { bubbles: true })); + }, + value, + ); +const click = async (page, selector) => { + // Avoid Puppeteer's auto-scroll when testing clamping at specified offsets. + await page.$eval(selector, (el) => el.click()); + await settle(page); +}; +const nav = "form nav button"; +const radio = (kind) => `input[name="token-kind"][value="${kind}"]`; +const metrics = (page) => + page.evaluate(() => { + const form = document.querySelector("form"); + const rect = (el) => { + const { x, y, width, height } = el.getBoundingClientRect(); + return { x, y, width, height }; + }; + return { + scroll: scrollY, + height: document.documentElement.scrollHeight, + width: document.documentElement.clientWidth, + sidebar: rect(document.querySelector("aside")), + header: rect(form.parentElement.querySelector("header")), + progress: rect(form.querySelector("nav")), + heading: rect(document.querySelector("#token-step-heading")), + form: rect(form), + name: rect(document.querySelector("#sub_name_input")), + description: rect(document.querySelector("#sub_desc_input")), + choices: [...form.querySelectorAll('input[name="token-kind"]')].map( + (el) => rect(el.closest("label")), + ), + }; + }); +function sameGeometry(before, after, context) { + function compare(a, b, key) { + if (typeof a === "number") + assert.ok(Math.abs(a - b) <= 1, `${context}: ${key}: ${a} -> ${b}`); + else + for (const name of Object.keys(a)) + compare(a[name], b[name], `${key}.${name}`); + } + compare(before, after, "layout"); + checks++; +} +async function switches(page, context) { + for (const position of [0, 0.5, 1]) { + await page.evaluate( + (fraction) => + scrollTo( + 0, + fraction * (document.documentElement.scrollHeight - innerHeight), + ), + position, + ); + await settle(page); + for (const kind of ["subscription", "discount"]) { + const before = await metrics(page); + await click(page, radio(kind)); + sameGeometry( + before, + await metrics(page), + `${context} scroll=${position} kind=${kind}`, + ); + } + } + assert.deepEqual( + await page.evaluate(() => { + const ids = [...document.querySelectorAll("[id]")].map((el) => el.id); + return { + duplicateIds: ids.filter((id, i) => ids.indexOf(id) !== i), + hiddenControls: document.querySelectorAll( + '[aria-hidden="true"] input, [aria-hidden="true"] button, [aria-hidden="true"] textarea, [aria-hidden="true"] [tabindex]', + ).length, + }; + }), + { duplicateIds: [], hiddenControls: 0 }, + ); +} +async function checkFooter(page, context) { + const maximum = await page.evaluate(() => + Math.max(0, document.documentElement.scrollHeight - innerHeight), + ); + // Short forms keep their natural position. Exercise the final part of an + // actual scroll, where the old footer rose into the surrounding padding. + if (!maximum) return; + let previousBottom; + let previouslyFloating = false; + for (const distance of [60, 30, 0]) { + await page.evaluate((y) => scrollTo(0, y), Math.max(0, maximum - distance)); + await settle(page); + const bounds = await page.$eval("[data-form-action-footer]", (el) => { + const rect = el.getBoundingClientRect(); + const form = el.closest("form"); + const column = form; + const allowed = column.getBoundingClientRect(); + const stickyEdge = innerHeight - parseFloat(getComputedStyle(el).bottom); + const normalEnd = form + .querySelector("[data-action-end]") + .getBoundingClientRect().bottom; + return { + left: rect.left, + right: rect.right, + allowedLeft: allowed.left, + allowedRight: allowed.right, + bottom: rect.bottom, + top: rect.top, + // Other catalogue content can extend beyond a short form. Once its + // normal end is visible, the actions belong to the form, not the viewport. + expected: Math.min(normalEnd, stickyEdge), + shouldFloat: normalEnd > stickyEdge + 1, + tail: el.previousElementSibling.getBoundingClientRect().bottom, + floating: el.dataset.floating, + position: getComputedStyle(el).position, + }; + }); + assert.equal( + bounds.position, + "sticky", + `${context}: use native CSS sticky positioning`, + ); + assert.ok( + Math.abs(bounds.left - bounds.allowedLeft) <= 1 && + Math.abs(bounds.right - bounds.allowedRight) <= 1, + `${context}: actions must stay within the fields column ${JSON.stringify(bounds)}`, + ); + assert.equal( + bounds.floating, + bounds.shouldFloat ? "true" : "false", + `${context}: glass only while floating (${distance}px from end; maximum ${maximum}; ${JSON.stringify(bounds)})`, + ); + assert.ok( + Math.abs(bounds.bottom - bounds.expected) <= 1, + `${context}: footer ${JSON.stringify(bounds)}`, + ); + if ( + previousBottom !== undefined && + previouslyFloating && + bounds.shouldFloat + ) + assert.ok( + Math.abs(bounds.bottom - previousBottom) <= 1, + `${context}: footer moved at page end`, + ); + if (!distance) + assert.ok( + bounds.tail <= bounds.top + 1, + `${context}: footer covers the final form content`, + ); + previousBottom = bounds.bottom; + previouslyFloating = bounds.shouldFloat; + footerChecks++; + } +} + +async function populate(page) { + await setInput( + page, + "#sub_name_input", + "Our neighbourhood coffee and freshly baked pastry loyalty offer", + ); + await setInput( + page, + "#sub_desc_input", + "Collect discount stamps on your visits.", + ); + const go = async (index) => { + await page.$$eval(nav, (buttons, index) => buttons[index].click(), index); + await settle(page); + }; + await go(1); + await click( + page, + '[aria-labelledby="earning_rules_heading"] input[type="radio"]', + ); + await go(2); + await setInput(page, "#sub_discount_percentage", "10"); + await click(page, 'label:has(> input[name="stamp_count"][value="5"])'); + await click( + page, + '[data-field="redemption-products"] button[aria-haspopup="dialog"]', + ); + await click(page, '[role="option"]'); + await page.keyboard.press("Escape"); + await go(0); + await click(page, radio("subscription")); + await go(1); + await setInput(page, "#sub_discount_percentage", "20"); + await click(page, 'input[name="token-redemption-scope"][value="any"]'); + await go(0); + await click(page, radio("discount")); +} +try { + browser = await puppeteer.launch({ + executablePath: process.env.CHROME_BIN || "/usr/bin/google-chrome", + headless: true, + args: ["--no-sandbox", "--disable-dev-shm-usage"], + }); + for (const shell of ["catalogue", "merchant"]) { + for (const lang of ["en", "de", "de-CH", "fr", "it"]) { + const page = await browser.newPage(); + const errors = []; + page.on("pageerror", (e) => errors.push(e.message)); + await page.evaluateOnNewDocument( + (lang) => localStorage.setItem("taler_merchant_lang", lang), + lang, + ); + for (const [width, height] of [ + [1440, 1100], + [1024, 768], + [390, 844], + ]) { + await page.setViewport({ width, height }); + await page.goto( + `http://127.0.0.1:${server.address().port}/?shell=${shell}#/storybook/integration-token-wizard`, + ); + await page.reload(); + await page.waitForSelector(radio("discount")); + await settle(page); + const context = `${shell}/${lang}/${width}x${height}`; + await switches(page, context); + await checkFooter(page, context); + await populate(page); + await switches(page, `${context}/saved drafts`); + // Real pointer and keyboard input, with controls visible first. + await page.$eval(radio("subscription"), (el) => + el.scrollIntoView({ block: "center" }), + ); + await settle(page); + let before = await metrics(page); + await page.click(radio("subscription")); + await settle(page); + sameGeometry(before, await metrics(page), `${context}/pointer`); + before = await metrics(page); + await page.keyboard.press("ArrowLeft"); + await settle(page); + assert.equal( + await page.$eval(radio("discount"), (el) => el.checked), + true, + ); + sameGeometry(before, await metrics(page), `${context}/keyboard`); + await page.setViewport({ width: width + 37, height }); + await settle(page); + await switches(page, `${context}/resized`); + await setInput(page, "#sub_name_input", ""); + await click(page, 'form button[type="submit"]'); + await page.waitForSelector('[data-form-action-footer] [role="alert"]'); + await checkFooter(page, `${context}/resized/error`); + } + assert.deepEqual(errors, []); + await page.close(); + console.log(`PASS ${shell}/${lang}`); + } + } + for (const shell of ["catalogue", "merchant"]) { + for (const width of [1440, 390]) { + for (const reduced of [false, true]) { + const page = await browser.newPage(); + await page.setViewport({ width, height: 768 }); + await page.emulateMediaFeatures([ + { + name: "prefers-reduced-motion", + value: reduced ? "reduce" : "no-preference", + }, + ]); + await page.goto( + `http://127.0.0.1:${server.address().port}/?shell=${shell}#/storybook/integration-token-wizard`, + ); + await page.waitForSelector("[data-form-action-footer]"); + await page.evaluate(() => + scrollTo(0, document.documentElement.scrollHeight), + ); + await settle(page); + const result = await page.evaluate(async () => { + const bar = document.querySelector("[data-form-action-footer]"); + const primary = bar.querySelector('button[type="submit"]'); + const cancel = bar.querySelector('button[type="button"]'); + const snapshot = () => { + const rect = bar.getBoundingClientRect(); + const button = primary.getBoundingClientRect(); + return { + width: rect.width, + height: rect.height, + left: rect.left, + cancelLeft: cancel.getBoundingClientRect().left, + right: button.right, + bottom: button.bottom, + alert: Boolean(bar.querySelector('[role="alert"]')), + }; + }; + const before = snapshot(); + const sample = async () => { + const frames = []; + const start = performance.now(); + while (performance.now() - start < 260) { + await new Promise(requestAnimationFrame); + frames.push(snapshot()); + } + return frames; + }; + primary.click(); + const opening = await sample(); + const form = bar.closest("form"); + const column = matchMedia("(min-width: 1024px)").matches + ? form.querySelector("[data-token-setup-fields]") + : form; + const formWidth = column.getBoundingClientRect().width; + bar.querySelector("[data-dismiss-error]").click(); + const closing = await sample(); + return { + before, + opening, + closing, + formWidth, + leftInset: + parseFloat(getComputedStyle(bar).paddingLeft) + + parseFloat(getComputedStyle(bar).borderLeftWidth), + surfaceTransition: getComputedStyle( + bar.querySelector("[data-action-surface]"), + ).transitionProperty, + }; + }); + const context = `${shell}/${width}/reduced-motion=${reduced}`; + assert.ok( + Math.abs(result.before.width - result.formWidth) <= 1, + `${context}: actions span the fields column`, + ); + assert.ok( + Math.abs( + result.before.cancelLeft - result.before.left - result.leftInset, + ) <= 1, + `${context}: Cancel is aligned to the start of the row`, + ); + assert.ok( + result.opening.at(-1).height > result.before.height, + `${context}: feedback expands vertically`, + ); + assert.ok( + Math.abs(result.closing.at(-1).width - result.before.width) <= 1, + `${context}: unchanged width after dismissal`, + ); + assert.ok( + result.opening.every((frame) => frame.alert), + `${context}: feedback visible immediately`, + ); + for (const frame of [...result.opening, ...result.closing]) { + assert.ok( + Math.abs(frame.width - result.before.width) <= 1 && + Math.abs(frame.cancelLeft - result.before.cancelLeft) <= 1, + `${context}: stable width and Cancel position`, + ); + assert.ok( + Math.abs(frame.right - result.before.right) <= 1 && + Math.abs(frame.bottom - result.before.bottom) <= 1, + `${context}: primary button moved`, + ); + } + if (reduced) assert.equal(result.surfaceTransition, "none"); + await page.close(); + } + } + } + console.log( + "PASS 8 full-column footer, error growth, dismissal, and reduced-motion scenarios", + ); + for (const width of [1440, 390]) { + for (const mode of ["page", "modal", "short", "inline"]) { + const page = await browser.newPage(); + await page.setViewport({ width, height: 844 }); + await page.goto( + `http://127.0.0.1:${server.address().port}/?footer=${mode}`, + ); + const bar = "[data-form-action-footer]"; + await page.waitForSelector(bar); + if (mode === "inline") { + assert.equal(await page.$("[data-action-end]"), null); + assert.equal(await page.$("[data-action-surface]"), null); + await page.close(); + continue; + } + const expectSurface = async (floating) => { + await page.waitForFunction( + (floating) => { + const bar = document.querySelector("[data-form-action-footer]"); + const surface = bar.querySelector("[data-action-surface]"); + return ( + bar.dataset.floating === String(floating) && + getComputedStyle(surface).opacity === (floating ? "1" : "0") + ); + }, + {}, + floating, + ); + }; + const scroll = async (bottom) => + page.evaluate((bottom) => { + const root = + document.querySelector(".modal-scroll-content") ?? + document.scrollingElement; + root.scrollTop = bottom ? root.scrollHeight : 0; + }, bottom); + await expectSurface(mode !== "short"); + if (mode === "short") { + // Short forms never acquire a floating surface, including after errors. + await page.$eval(`${bar} button[type=submit]`, (el) => el.click()); + await page.waitForSelector('[role="alert"]'); + await expectSurface(false); + await page.close(); + continue; + } + const size = await page.$eval(bar, (el) => ({ + width: el.offsetWidth, + height: el.offsetHeight, + })); + await scroll(true); + await expectSurface(false); + assert.deepEqual( + await page.$eval(bar, (el) => ({ + width: el.offsetWidth, + height: el.offsetHeight, + })), + size, + ); + await scroll(false); + await expectSurface(true); + // Error growth moves the normal-flow marker; no scroll handler is needed. + await page.$eval(`${bar} button[type=submit]`, (el) => el.click()); + await page.waitForSelector('[role="alert"]'); + await expectSurface(true); + await scroll(true); + await expectSurface(false); + await page.$eval("[data-dismiss-error]", (el) => el.click()); + await expectSurface(false); + await page.setViewport({ + width: width === 1440 ? 390 : 1440, + height: 844, + }); + await scroll(true); + await expectSurface(false); + await scroll(false); + await expectSurface(true); + await page.$eval("[data-toggle-length]", (el) => el.click()); + await expectSurface(false); + await page.close(); + } + } + console.log( + "PASS 8 floating-surface scenarios (page, modal, short, inline; desktop/mobile)", + ); + console.log( + `PASS ${checks} layout comparisons and ${footerChecks} footer positions (both shells, all five languages)`, + ); +} finally { + await browser?.close(); + await new Promise((resolve) => server.close(resolve)); +} diff --git a/packages/taler-merchant-webui/contrib/qa/token-selector-check.mjs b/packages/taler-merchant-webui/contrib/qa/token-selector-check.mjs @@ -0,0 +1,306 @@ +/* + This file is part of GNU Taler + (C) 2026 Taler Systems S.A. + SPDX-License-Identifier: GPL-3.0-or-later + */ +// Run from the package root after pnpm build. +import assert from "node:assert/strict"; +import { createServer } from "node:http"; +import { createReadStream, existsSync } from "node:fs"; +import path from "node:path"; +import puppeteer from "puppeteer-core"; +const root = path.resolve("dist/prod"); +const server = createServer((req, res) => { + const pathname = new URL(req.url, "http://local").pathname; + const file = path.join(root, pathname === "/" ? "index.html" : pathname); + if (!file.startsWith(root + path.sep) || !existsSync(file)) { + res.writeHead(404); + res.end(); + return; + } + res.setHeader( + "Content-Type", + file.endsWith(".js") + ? "text/javascript" + : file.endsWith(".css") + ? "text/css" + : "text/html", + ); + createReadStream(file).pipe(res); +}); +await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); +let browser; +let checks = 0; +const settle = (page) => + page.evaluate( + () => + new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(resolve)), + ), + ); +const geometry = (page) => + page.evaluate(() => { + const rect = (selector) => { + const { x, y, width, height } = document + .querySelector(selector) + .getBoundingClientRect(); + return [x, y, width, height]; + }; + return { + dialog: rect('[role="dialog"]'), + search: rect('[role="combobox"]'), + scroll: scrollY, + }; + }); +async function unchanged(page, expected, context) { + await settle(page); + const actual = await geometry(page); + for (const key of ["dialog", "search"]) + for (let i = 0; i < 4; i++) { + assert.ok( + Math.abs(actual[key][i] - expected[key][i]) <= 1, + `${context}: ${key}[${i}] ${expected[key][i]} -> ${actual[key][i]}`, + ); + } + assert.equal(actual.scroll, expected.scroll, `${context}: page scroll`); + assert.equal( + await page.$eval( + '[role="combobox"]', + (el) => el === document.activeElement, + ), + true, + ); + checks++; +} +async function search(page, value) { + await page.$eval( + '[role="combobox"]', + (el, value) => { + el.value = value; + el.dispatchEvent(new Event("input", { bubbles: true })); + }, + value, + ); + await settle(page); +} +try { + browser = await puppeteer.launch({ + executablePath: process.env.CHROME_BIN || "/usr/bin/google-chrome", + headless: true, + args: ["--no-sandbox", "--disable-dev-shm-usage"], + }); + const page = await browser.newPage(); + const errors = []; + page.on("pageerror", (e) => errors.push(e.message)); + await page.evaluateOnNewDocument(() => + localStorage.setItem("taler_merchant_lang", "en"), + ); + for (const width of [1440, 390]) + for (const dataset of ["empty-selection", "preselected"]) + for (const section of [1, 2]) + for (const above of [false, true, null]) { + const context = `${width}/${dataset}/section=${section}/${above === null ? "page-bottom" : above ? "above" : "below"}`; + const trigger = `section:nth-child(${section}) button[aria-haspopup="dialog"]`; + await page.setViewport({ width, height: 844 }); + await page.goto( + `http://127.0.0.1:${server.address().port}/index.html#/storybook/ui-token-selector?dataset=${dataset}`, + ); + await page.reload(); + await page.waitForSelector(trigger); + // Give both directions enough room while retaining the real catalogue UI. + if (above === null) { + await page.evaluate(() => + scrollTo(0, document.documentElement.scrollHeight), + ); + } else { + await page.addStyleTag({ + content: "body { padding-top: 600px; padding-bottom: 1000px; }", + }); + await page.$eval( + trigger, + (el, above) => + scrollTo( + 0, + scrollY + + el.getBoundingClientRect().top - + (above ? innerHeight - 100 : 100), + ), + above, + ); + } + await settle(page); + await page.click(trigger); + await settle(page); + const before = await geometry(page); + const triggerBounds = await page.$eval(trigger, (el) => ({ + top: el.getBoundingClientRect().top, + bottom: el.getBoundingClientRect().bottom, + })); + if (above !== null) + assert.ok( + above + ? before.dialog[1] + before.dialog[3] <= triggerBounds.top + : before.dialog[1] >= triggerBounds.bottom, + ); + for (const query of [ + section === 1 ? "drinks" : "cappuccino", + "no-such-product", + "", + ]) { + await search(page, query); + await unchanged(page, before, `${context}/search=${query}`); + } + const rows = await page.$$('[role="option"]'); + for (const row of rows.slice(0, 4)) { + const selected = await row.evaluate( + (el) => el.getAttribute("aria-selected") === "true", + ); + const box = await row.$('input[type="checkbox"]'); + const bounds = await box.boundingBox(); + await page.mouse.click( + bounds.x + bounds.width / 2, + bounds.y + bounds.height / 2, + ); + await unchanged(page, before, `${context}/toggle`); + assert.equal( + await row.evaluate( + (el) => el.getAttribute("aria-selected") === "true", + ), + !selected, + ); + assert.equal(await box.evaluate((el) => el.checked), !selected); + assert.equal( + await page.$$eval('[role="option"]', (items) => items.length), + rows.length, + ); + } + if (section === 2) { + await search(page, ""); + await page.keyboard.press("ArrowUp"); + await unchanged(page, before, `${context}/scroll-results`); + assert.ok( + await page.$eval( + '[role="listbox"]', + (el) => el.parentElement.scrollTop > 0, + ), + ); + } + // Add is never part of the chips' wrapping row, including the first chip. + assert.equal( + await page.$eval(trigger, (el) => { + const chips = el.parentElement.previousElementSibling; + return ( + !chips || + chips.tagName !== "UL" || + el.getBoundingClientRect().top >= + chips.getBoundingClientRect().bottom + ); + }), + true, + ); + await search(page, section === 1 ? "drinks" : "cappuccino"); + await page.keyboard.press("ArrowDown"); + const wasSelected = await page.$eval('[role="option"]', (el) => + el.getAttribute("aria-selected"), + ); + await page.keyboard.press("Enter"); + await unchanged(page, before, `${context}/keyboard`); + assert.notEqual( + await page.$eval('[role="option"]', (el) => + el.getAttribute("aria-selected"), + ), + wasSelected, + ); + await page.keyboard.press("Escape"); + assert.equal(await page.$('[role="dialog"]'), null); + assert.equal( + await page.$eval(trigger, (el) => el === document.activeElement), + true, + ); + await page.click(trigger); + await settle(page); + assert.equal( + await page.$eval('[role="combobox"]', (el) => el.value), + "", + ); + const selectedIds = () => + page.$$eval('[role="option"][aria-selected="true"]', (items) => + items.map((el) => el.textContent), + ); + const selectionBeforeDone = await selectedIds(); + const done = '[role="dialog"] button'; + assert.equal(await page.$eval(done, (el) => el.textContent), "Done"); + if (width === 390) { + await page.click(done); + } else { + await page.keyboard.press("Tab"); + assert.equal( + await page.$eval(done, (el) => el === document.activeElement), + true, + ); + await page.keyboard.press("Enter"); + } + assert.equal(await page.$('[role="dialog"]'), null); + assert.equal( + await page.$eval(trigger, (el) => el === document.activeElement), + true, + ); + await page.click(trigger); + await settle(page); + assert.deepEqual(await selectedIds(), selectionBeforeDone); + await page.focus(done); + await page.keyboard.press("Escape"); + assert.equal(await page.$('[role="dialog"]'), null); + await page.click(trigger); + await settle(page); + await page.mouse.click(width - 2, 2); + assert.equal(await page.$('[role="dialog"]'), null); + console.log(`PASS ${context}`); + } + for (const width of [1440, 390]) { + for (const dataset of ["empty-selection", "empty-catalog"]) { + await page.setViewport({ width, height: 844 }); + await page.goto( + `http://127.0.0.1:${server.address().port}/index.html#/storybook/ui-token-selector?dataset=${dataset}`, + ); + await page.reload(); + const categoryTrigger = + 'section:nth-child(1) button[aria-haspopup="dialog"]'; + await page.waitForSelector(categoryTrigger); + await page.click(categoryTrigger); + await settle(page); + const before = await geometry(page); + await search(page, " Desserts "); + assert.equal( + await page.$eval("[data-create-category]", (el) => el.textContent), + "Create category “Desserts”", + ); + await page.click("[data-create-category]"); + await page.waitForSelector("section:nth-child(1) [data-chip-remove]"); + await unchanged(page, before, `${width}/${dataset}/create-category`); + assert.equal(await page.$eval('[role="combobox"]', (el) => el.value), ""); + assert.match( + await page.$eval( + '[role="option"][aria-selected="true"]', + (el) => el.textContent, + ), + /Desserts/, + ); + await page.click('[role="dialog"] button'); + assert.equal(await page.$('[role="dialog"]'), null); + await page.click('section:nth-child(2) button[aria-haspopup="dialog"]'); + await search(page, "Desserts"); + assert.equal( + await page.$("[data-create-category]"), + null, + "inventory products cannot be created in the selector", + ); + await page.click('[role="dialog"] button'); + } + } + assert.deepEqual(errors, []); + console.log(`PASS ${checks} stable-popover checks`); +} finally { + await browser?.close(); + await new Promise((resolve) => server.close(resolve)); +} diff --git a/packages/taler-merchant-webui/package.json b/packages/taler-merchant-webui/package.json @@ -12,6 +12,10 @@ "compile": "tsc && ./build.mjs", "dev": "./dev.mjs", "test": "./test.mjs", + "test:form-shortcut-browser": "node contrib/qa/form-shortcut-check.mjs", + "test:percentage-editor-browser": "node contrib/qa/percentage-editor-check.mjs", + "test:token-selector-browser": "node contrib/qa/token-selector-check.mjs", + "test:token-layout-browser": "node contrib/qa/token-layout-check.mjs", "test:save-feedback-browser": "node contrib/qa/save-feedback-check.mjs", "test:inventory-template-browser": "node contrib/qa/inventory-template-check.mjs", "test:product-restock-browser": "node contrib/qa/product-restock-check.mjs", @@ -24,8 +28,7 @@ "visual:compare": "pnpm build && node visual/run.mjs compare", "visual:inspect": "node visual/run.mjs inspect", "visual:update": "pnpm build && node visual/run.mjs update", - "pretty": "prettier --write src", - "test:form-shortcut-browser": "node contrib/qa/form-shortcut-check.mjs" + "pretty": "prettier --write src" }, "dependencies": { "@gnu-taler/taler-util": "workspace:*", diff --git a/packages/taler-merchant-webui/visual/README.md b/packages/taler-merchant-webui/visual/README.md @@ -25,3 +25,62 @@ pnpm --filter taler-merchant-webui visual:update -- --reviewed There is no automatic approval. First run `visual:compare`, use `visual:inspect` to review the expected, actual, and diff images, and compare the expected and actual `.aria.yml` files in the same directories. If every difference is intended, run `visual:update -- --reviewed`, review the resulting Git diff, and commit the changed files under `visual/baselines/` with the UI change. The update command refuses to run without `--reviewed`; that flag records a deliberate review, not merely a successful command. Stagefright screenshots, HTML dumps, and traces remain failure diagnostics and are not accepted as goldens. + +To limit comparison or a reviewed update to the token setup wizard, append +`-- --scenario-prefix=token-wizard` (alongside `--reviewed` for updates). The +runner exercises the creation steps without saving a token. The mobile +validation scenario requires its specific expected error; unrelated errors +still fail the capture. +The `token-wizard-review` scenarios cover grouped discount stamp and pass +reviews and free-item eligibility chips on desktop and mobile. Technical +details use a native disclosure. + +To check offer-type switching with the catalogue sidebar and merchant navigation +visible, run `pnpm build` followed by `pnpm test:token-layout-browser` from the +package directory. Set `CHROME_BIN` if Chrome is not at `/usr/bin/google-chrome`. +This browser check compares layout geometry and scroll position in both +directions, including the bottom of the page, saved drafts, keyboard navigation, +resizing, and all supported languages. It complements the screenshot scenarios, +which hide catalogue chrome. +It also verifies that CSS-sticky action bars stay at the same bottom inset +through the final scroll, including validation errors, and leave the final +form content visible. +The same check covers full-column wizard actions with Cancel on the left, +vertical error growth and dismissal without changing width or moving the +floating primary button, full-width mobile actions, and reduced motion. +The glass surface fades away when the bar reaches its normal position. Checks +cover that transition in pages and scrollable dialogs, short and changing forms, +error growth/dismissal, and viewport resizing without changing the bar's size. +Wizard steps, the review, and their action bars share one content width. +Each step has one heading inside its card. The `token-wizard-no-reward` +scenarios cover the short reward option and its explanation after selection. +Step headings use H2, with smaller H3 subsections and form-group legends for +product selectors. The `token-wizard-validity` and +`token-wizard-technical-identifier` scenarios cover optional settings inside +their step's card on desktop and mobile. +The `token-wizard-custom-stamp-count` scenarios show the Custom chip and number +input; `token-wizard-product-error` shows selection errors above the product +selectors, below the purchase-scope choices. + +Run `pnpm test:token-selector-browser` after building to check the product and +category popovers. It covers search, checkbox toggles, keyboard selection and +dismissal, and stable menu geometry above/below the Add row and near the page +bottom, with empty and preselected lists on desktop and mobile. +It also checks Done by mouse and keyboard, focus restoration, and creating and +selecting a category from a search with no matches. Inventory product searches +do not offer creation. The `token-selector-create-category` snapshots cover +that action, and `token-wizard-earning-error` places earning-selection errors +above the product selectors rather than the purchase-scope choice. + +Run `pnpm test:form-shortcut-browser` after building to check Ctrl+Enter in +forms. It covers native validation, disabled and pending actions, focused forms, +modal isolation, textareas, held keys, and the wizard's Next and final Submit +actions, including an open product selector. Set `CHROME_BIN` if needed. + +Run `pnpm test:percentage-editor-browser` after building to check the editable +percentage sentence on desktop and mobile. It covers popover placement, keyboard +editing and dismissal, custom increments, validation, Ctrl+Enter, and saved +rounding settings. The `token-wizard-rounding` visual scenarios show the sentence +and both editors. +This browser check also covers keyboard selection of stamp-count chips and +restoring a custom count after selecting a preset. diff --git a/packages/taler-merchant-webui/visual/baselines/token-editor-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-editor-desktop.aria.yml @@ -0,0 +1,596 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "paragraph" + - role: "heading" + name: "1. Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "button" + name: "🎟️ Discount stamps Customers collect discount stamps in their wallet and exchange them for a reward." + state: "pressed=true" + - role: "button" + name: "📅 Pass Customers keep their pass and can reuse it until it expires." + state: "pressed=false" + - role: "LabelText" + - role: "textbox" + name: "Discount stamp name *" + state: "required=true" + - role: "paragraph" + - role: "LabelText" + - role: "textbox" + name: "Description *" + state: "required=true" + - role: "paragraph" + - role: "heading" + name: "2. Discount stamps and rewards" + - role: "paragraph" + - role: "region" + name: "Customer reward" + - role: "region" + name: "Collecting discount stamps" + - role: "heading" + name: "3. Validity" + - role: "LabelText" + - role: "combobox" + name: "Discount stamp validity period" + state: "expanded=false" + - role: "paragraph" + - role: "generic" + - role: "region" + name: "4. Advanced Options" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "StaticText" + name: "1. Details" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "StaticText" + name: "🎟️" + - role: "generic" + - role: "generic" + - role: "StaticText" + name: "📅" + - role: "generic" + - role: "generic" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "StaticText" + name: "Description" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not configure it." + - role: "StaticText" + name: "2. Discount stamps and rewards" + - role: "StaticText" + name: "Choose how customers collect discount stamps and use their reward." + - role: "heading" + name: "Customer reward" + - role: "paragraph" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "heading" + name: "Collecting discount stamps" + - role: "paragraph" + - role: "group" + name: "Which purchases earn a discount stamp?" + - role: "LabelText" + - role: "combobox" + name: "Currency" + state: "expanded=false" + - role: "spinbutton" + name: "Minimum spend on the selected products (optional)" + state: "required=false" + - role: "paragraph" + - role: "StaticText" + name: "3. Validity" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "MenuListPopup" + - role: "StaticText" + name: "Discount stamps share expiry dates. The time available to use a discount stamp can be shorter than this period." + - role: "LabelText" + - role: "combobox" + name: "Shared expiry dates" + state: "expanded=false" + - role: "paragraph" + - role: "heading" + name: "4. Advanced Options" + - role: "paragraph" + - role: "button" + name: "Show advanced options" + state: "expanded=false" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "InlineTextBox" + name: "1. Details" + - role: "InlineTextBox" + name: "🎟️" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Customers collect discount stamps in their wallet and exchange them for a reward." + - role: "InlineTextBox" + name: "📅" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Customers keep their pass and can reuse it until it expires." + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "InlineTextBox" + name: "Description" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not " + - role: "InlineTextBox" + name: "configure it." + - role: "InlineTextBox" + name: "2. Discount stamps and rewards" + - role: "InlineTextBox" + name: "Choose how customers collect discount stamps and use their reward." + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "Choose the reward and the purchases it applies to." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Minimum spend on the selected products (optional)" + - role: "MenuListPopup" + - role: "generic" + - role: "StaticText" + name: "Other products in the same purchase do not count toward this minimum." + - role: "InlineTextBox" + name: "3. Validity" + - role: "InlineTextBox" + name: "Discount stamp validity period" + - role: "option" + name: "1 Day" + state: "selected=false" + - role: "option" + name: "7 Days" + state: "selected=false" + - role: "option" + name: "30 Days" + state: "selected=true" + - role: "option" + name: "90 Days (Quarter)" + state: "selected=false" + - role: "option" + name: "365 Days (1 Year)" + state: "selected=false" + - role: "InlineTextBox" + name: "Discount stamps share expiry dates. The time available to use a " + - role: "InlineTextBox" + name: "discount stamp can be shorter than this period." + - role: "StaticText" + name: "Shared expiry dates" + - role: "MenuListPopup" + - role: "strong" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Discount stamps issued in the same period expire together. Wider groups help protect customer privacy, but can shorten the time available to use a discount stamp." + - role: "StaticText" + name: "4. Advanced Options" + - role: "StaticText" + name: "Start and end dates, and the technical identifier." + - role: "StaticText" + name: "Show advanced options" + - role: "button" + name: "Cancel" + - role: "button" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Customers collect discount stamps in " + - role: "InlineTextBox" + name: "their wallet and exchange them for a " + - role: "InlineTextBox" + name: "reward." + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Customers keep their pass and can reuse it " + - role: "InlineTextBox" + name: "until it expires." + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "Choose the reward and the purchases it applies to." + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "StaticText" + name: "Which purchases earn a discount stamp?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Minimum spend on the selected " + - role: "InlineTextBox" + name: "products (optional)" + - role: "option" + name: "CHF" + state: "selected=true" + - role: "InlineTextBox" + name: "Other products in the same purchase do not count toward this minimum." + - role: "InlineTextBox" + name: "Shared expiry dates" + - role: "option" + name: "1 minute" + state: "selected=false" + - role: "option" + name: "1 hour" + state: "selected=false" + - role: "option" + name: "1 day" + state: "selected=true" + - role: "option" + name: "7 days (1 week)" + state: "selected=false" + - role: "option" + name: "30 days" + state: "selected=false" + - role: "option" + name: "90 days" + state: "selected=false" + - role: "option" + name: "365 days" + state: "selected=false" + - role: "StaticText" + name: "Shared expiry dates:" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Discount stamps issued in the same period expire together. Wider groups help protect " + - role: "InlineTextBox" + name: "customer privacy, but can shorten the time available to use a discount stamp." + - role: "InlineTextBox" + name: "4. Advanced Options" + - role: "InlineTextBox" + name: "Start and end dates, and the technical identifier." + - role: "InlineTextBox" + name: "Show advanced options" + - role: "StaticText" + name: "Cancel" + - role: "StaticText" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Which purchases earn a discount stamp?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Shared expiry dates:" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "StaticText" + name: "Product categories" + - role: "status" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Product categories" + - role: "status" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Product categories" + - role: "StaticText" + name: "No product categories are available. Create a category or select an individual product." + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "StaticText" + name: "No product categories are available. Create a category or select an individual product." + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "InlineTextBox" + name: "No product categories are available. Create a category or select an individual product." + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. Add a product or select a product category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "No product categories are available. Create a category or select an individual product." + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. Add a product or select a product category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-editor-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-editor-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-editor-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-editor-mobile.aria.yml @@ -0,0 +1,664 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "paragraph" + - role: "heading" + name: "1. Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "button" + name: "🎟️ Discount stamps Customers collect discount stamps in their wallet and exchange them for a reward." + state: "pressed=true" + - role: "button" + name: "📅 Pass Customers keep their pass and can reuse it until it expires." + state: "pressed=false" + - role: "LabelText" + - role: "textbox" + name: "Discount stamp name *" + state: "required=true" + - role: "paragraph" + - role: "LabelText" + - role: "textbox" + name: "Description *" + state: "required=true" + - role: "paragraph" + - role: "heading" + name: "2. Discount stamps and rewards" + - role: "paragraph" + - role: "region" + name: "Customer reward" + - role: "region" + name: "Collecting discount stamps" + - role: "heading" + name: "3. Validity" + - role: "LabelText" + - role: "combobox" + name: "Discount stamp validity period" + state: "expanded=false" + - role: "paragraph" + - role: "generic" + - role: "region" + name: "4. Advanced Options" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "StaticText" + name: "1. Details" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "StaticText" + name: "🎟️" + - role: "generic" + - role: "generic" + - role: "StaticText" + name: "📅" + - role: "generic" + - role: "generic" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "StaticText" + name: "Description" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not configure it." + - role: "StaticText" + name: "2. Discount stamps and rewards" + - role: "StaticText" + name: "Choose how customers collect discount stamps and use their reward." + - role: "heading" + name: "Customer reward" + - role: "paragraph" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "heading" + name: "Collecting discount stamps" + - role: "paragraph" + - role: "group" + name: "Which purchases earn a discount stamp?" + - role: "LabelText" + - role: "combobox" + name: "Currency" + state: "expanded=false" + - role: "spinbutton" + name: "Minimum spend on the selected products (optional)" + state: "required=false" + - role: "paragraph" + - role: "StaticText" + name: "3. Validity" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "MenuListPopup" + - role: "StaticText" + name: "Discount stamps share expiry dates. The time available to use a discount stamp can be shorter than this period." + - role: "LabelText" + - role: "combobox" + name: "Shared expiry dates" + state: "expanded=false" + - role: "paragraph" + - role: "heading" + name: "4. Advanced Options" + - role: "paragraph" + - role: "button" + name: "Show advanced options" + state: "expanded=false" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "InlineTextBox" + name: "1. Details" + - role: "InlineTextBox" + name: "🎟️" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Customers collect discount stamps in their wallet and exchange them for a reward." + - role: "InlineTextBox" + name: "📅" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Customers keep their pass and can reuse it until it expires." + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Customers see this discount stamp name " + - role: "InlineTextBox" + name: "when paying and in their wallets." + - role: "InlineTextBox" + name: "Description" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Shown to customers. The settings below " + - role: "InlineTextBox" + name: "determine the actual reward or access; " + - role: "InlineTextBox" + name: "writing a description does not configure it." + - role: "InlineTextBox" + name: "2. Discount stamps and " + - role: "InlineTextBox" + name: "rewards" + - role: "InlineTextBox" + name: "Choose how customers collect discount " + - role: "InlineTextBox" + name: "stamps and use their reward." + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "Choose the reward and the purchases it applies to." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Minimum spend on the selected products (optional)" + - role: "MenuListPopup" + - role: "generic" + - role: "StaticText" + name: "Other products in the same purchase do not count toward this minimum." + - role: "InlineTextBox" + name: "3. Validity" + - role: "InlineTextBox" + name: "Discount stamp validity period" + - role: "option" + name: "1 Day" + state: "selected=false" + - role: "option" + name: "7 Days" + state: "selected=false" + - role: "option" + name: "30 Days" + state: "selected=true" + - role: "option" + name: "90 Days (Quarter)" + state: "selected=false" + - role: "option" + name: "365 Days (1 Year)" + state: "selected=false" + - role: "InlineTextBox" + name: "Discount stamps share expiry dates. The time " + - role: "InlineTextBox" + name: "available to use a discount stamp can be " + - role: "InlineTextBox" + name: "shorter than this period." + - role: "StaticText" + name: "Shared expiry dates" + - role: "MenuListPopup" + - role: "strong" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Discount stamps issued in the same period expire together. Wider groups help protect customer privacy, but can shorten the time available to use a discount stamp." + - role: "StaticText" + name: "4. Advanced Options" + - role: "StaticText" + name: "Start and end dates, and the technical identifier." + - role: "StaticText" + name: "Show advanced options" + - role: "button" + name: "Cancel" + - role: "button" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Customers collect " + - role: "InlineTextBox" + name: "discount stamps in their " + - role: "InlineTextBox" + name: "wallet and exchange them " + - role: "InlineTextBox" + name: "for a reward." + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Customers keep their pass " + - role: "InlineTextBox" + name: "and can reuse it until it " + - role: "InlineTextBox" + name: "expires." + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "Choose the reward and the purchases it " + - role: "InlineTextBox" + name: "applies to." + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Each qualifying paid purchase earns one " + - role: "InlineTextBox" + name: "discount stamp, regardless of how many " + - role: "InlineTextBox" + name: "eligible items it contains." + - role: "StaticText" + name: "Which purchases earn a discount stamp?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Minimum spend on the selected " + - role: "InlineTextBox" + name: "products (optional)" + - role: "option" + name: "CHF" + state: "selected=true" + - role: "InlineTextBox" + name: "Other products in the same purchase do " + - role: "InlineTextBox" + name: "not count toward this minimum." + - role: "InlineTextBox" + name: "Shared expiry dates" + - role: "option" + name: "1 minute" + state: "selected=false" + - role: "option" + name: "1 hour" + state: "selected=false" + - role: "option" + name: "1 day" + state: "selected=true" + - role: "option" + name: "7 days (1 week)" + state: "selected=false" + - role: "option" + name: "30 days" + state: "selected=false" + - role: "option" + name: "90 days" + state: "selected=false" + - role: "option" + name: "365 days" + state: "selected=false" + - role: "StaticText" + name: "Shared expiry dates:" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamps issued in the same period " + - role: "InlineTextBox" + name: "expire together. Wider groups help " + - role: "InlineTextBox" + name: "protect customer privacy, but can " + - role: "InlineTextBox" + name: "shorten the time available to use a " + - role: "InlineTextBox" + name: "discount stamp." + - role: "InlineTextBox" + name: "4. Advanced " + - role: "InlineTextBox" + name: "Options" + - role: "InlineTextBox" + name: "Start and end dates, and " + - role: "InlineTextBox" + name: "the technical identifier." + - role: "InlineTextBox" + name: "Show " + - role: "InlineTextBox" + name: "advanced " + - role: "InlineTextBox" + name: "options" + - role: "StaticText" + name: "Cancel" + - role: "StaticText" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Which purchases earn a discount " + - role: "InlineTextBox" + name: "stamp?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Shared expiry dates:" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "StaticText" + name: "Product categories" + - role: "status" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Product categories" + - role: "status" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Product categories" + - role: "StaticText" + name: "No product categories are available. Create a category or select an individual product." + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "StaticText" + name: "No product categories are available. Create a category or select an individual product." + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "InlineTextBox" + name: "No product categories are available. " + - role: "InlineTextBox" + name: "Create a category or select an " + - role: "InlineTextBox" + name: "individual product." + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. " + - role: "InlineTextBox" + name: "Add a product or select a product " + - role: "InlineTextBox" + name: "category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "No product categories are available. " + - role: "InlineTextBox" + name: "Create a category or select an " + - role: "InlineTextBox" + name: "individual product." + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. " + - role: "InlineTextBox" + name: "Add a product or select a product " + - role: "InlineTextBox" + name: "category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-editor-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-editor-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-management-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-management-desktop.aria.yml @@ -0,0 +1,167 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Discounts & Passes" + - role: "sectionheader" + - role: "navigation" + - role: "generic" + - role: "table" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Discounts & Passes" + - role: "heading" + name: "Discounts & Passes" + - role: "paragraph" + - role: "button" + name: "+ Create discount stamps or pass" + - role: "button" + name: "All discount stamps and passes (2)" + - role: "button" + name: "Discount stamps" + - role: "button" + name: "Passes" + - role: "searchbox" + name: "Search discount stamps and passes" + - role: "rowgroup" + - role: "row" + - role: "row" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Manage discount stamps and reusable passes." + - role: "StaticText" + name: "+ Create discount stamps or pass" + - role: "StaticText" + name: "All discount stamps and passes (2)" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Passes" + - role: "generic" + - role: "row" + - role: "cell" + name: "Coffee discount stamps coffee-reward Up to CHF 3.00 off. Use 5 discount stamps to claim the reward. Customers earn one discount stamp per qualifying paid purchase · All purchases" + - role: "cell" + name: "Discount stamps" + - role: "cell" + name: "Ends at 00:00 UTC on 2026-12-31" + - role: "cell" + name: "Actions for Coffee discount stamps" + - role: "cell" + name: "Member pass member-pass Access only (no checkout discount)" + - role: "cell" + name: "Pass" + - role: "cell" + name: "No end date" + - role: "cell" + name: "Actions for Member pass" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Manage discount stamps and reusable passes." + - role: "InlineTextBox" + name: "+ Create discount stamps or pass" + - role: "InlineTextBox" + name: "All discount stamps and passes (2)" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Passes" + - role: "columnheader" + name: "Name & ID" + state: "required=false" + - role: "columnheader" + name: "Offer type" + state: "required=false" + - role: "columnheader" + name: "Validity limit" + state: "required=false" + - role: "columnheader" + name: "Actions" + state: "required=false" + - role: "link" + name: "Coffee discount stamps" + - role: "generic" + - role: "generic" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Ends at 00:00 UTC on 2026-12-31" + - role: "button" + name: "Actions for Coffee discount stamps" + state: "expanded=false" + - role: "link" + name: "Member pass" + - role: "generic" + - role: "generic" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "No end date" + - role: "button" + name: "Actions for Member pass" + state: "expanded=false" + - role: "StaticText" + name: "Name & ID" + - role: "StaticText" + name: "Offer type" + - role: "StaticText" + name: "Validity limit" + - role: "StaticText" + name: "Actions" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "StaticText" + name: "coffee-reward" + - role: "StaticText" + name: "Up to CHF 3.00 off. Use 5 discount stamps to claim the reward. Customers earn one discount stamp per qualifying paid purchase · All purchases" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Ends at 00:00 UTC on 2026-12-31" + - role: "StaticText" + name: "Member pass" + - role: "StaticText" + name: "member-pass" + - role: "StaticText" + name: "Access only (no checkout discount)" + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "No end date" + - role: "InlineTextBox" + name: "Name & ID" + - role: "InlineTextBox" + name: "Offer type" + - role: "InlineTextBox" + name: "Validity limit" + - role: "InlineTextBox" + name: "Actions" + - role: "InlineTextBox" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "coffee-reward" + - role: "InlineTextBox" + name: "Up to CHF 3.00 off. Use 5 discount stamps to claim the reward. Customers earn one discount stamp per qualifying paid purchase · All purchases" + - role: "InlineTextBox" + name: "Member pass" + - role: "InlineTextBox" + name: "member-pass" + - role: "InlineTextBox" + name: "Access only (no checkout discount)" diff --git a/packages/taler-merchant-webui/visual/baselines/token-management-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-management-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-management-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-management-mobile.aria.yml @@ -0,0 +1,166 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Discounts & Passes" + - role: "sectionheader" + - role: "navigation" + - role: "generic" + - role: "article" + - role: "article" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Discounts & Passes" + - role: "heading" + name: "Discounts & Passes" + - role: "paragraph" + - role: "button" + name: "+ Create discount stamps or pass" + - role: "button" + name: "All discount stamps and passes (2)" + - role: "button" + name: "Discount stamps" + - role: "button" + name: "Passes" + - role: "searchbox" + name: "Search discount stamps and passes" + - role: "link" + name: "Coffee discount stamps" + - role: "paragraph" + - role: "button" + name: "Actions for Coffee discount stamps" + state: "expanded=false" + - role: "paragraph" + - role: "DescriptionList" + - role: "link" + name: "Member pass" + - role: "paragraph" + - role: "button" + name: "Actions for Member pass" + state: "expanded=false" + - role: "paragraph" + - role: "DescriptionList" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Manage discount stamps and reusable passes." + - role: "StaticText" + name: "+ Create discount stamps or pass" + - role: "StaticText" + name: "All discount stamps and passes (2)" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Passes" + - role: "generic" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "StaticText" + name: "coffee-reward" + - role: "StaticText" + name: "Up to CHF 3.00 off. Use 5 discount stamps to claim the reward. Customers earn one discount stamp per qualifying paid purchase · All purchases" + - role: "term" + name: "Offer type" + - role: "definition" + - role: "term" + name: "Validity limit" + - role: "definition" + - role: "StaticText" + name: "Member pass" + - role: "StaticText" + name: "member-pass" + - role: "StaticText" + name: "Access only (no checkout discount)" + - role: "term" + name: "Offer type" + - role: "definition" + - role: "term" + name: "Validity limit" + - role: "definition" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Manage discount stamps and reusable " + - role: "InlineTextBox" + name: "passes." + - role: "InlineTextBox" + name: "+ Create discount stamps or pass" + - role: "InlineTextBox" + name: "All discount " + - role: "InlineTextBox" + name: "stamps and " + - role: "InlineTextBox" + name: "passes (2)" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamps" + - role: "InlineTextBox" + name: "Passes" + - role: "InlineTextBox" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "coffee-reward" + - role: "InlineTextBox" + name: "Up to CHF 3.00 off. Use 5 discount stamps to " + - role: "InlineTextBox" + name: "claim the reward. Customers earn one " + - role: "InlineTextBox" + name: "discount stamp per qualifying paid purchase " + - role: "InlineTextBox" + name: "· All purchases" + - role: "StaticText" + name: "Offer type" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Validity limit" + - role: "StaticText" + name: "Ends at 00:00 UTC on 2026-12-31" + - role: "InlineTextBox" + name: "Member pass" + - role: "InlineTextBox" + name: "member-pass" + - role: "InlineTextBox" + name: "Access only (no checkout discount)" + - role: "StaticText" + name: "Offer type" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Validity limit" + - role: "StaticText" + name: "No end date" + - role: "InlineTextBox" + name: "Offer type" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Validity limit" + - role: "InlineTextBox" + name: "Ends at 00:00 UTC on " + - role: "InlineTextBox" + name: "2026-12-31" + - role: "InlineTextBox" + name: "Offer type" + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Validity limit" + - role: "InlineTextBox" + name: "No end date" diff --git a/packages/taler-merchant-webui/visual/baselines/token-management-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-management-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-chips-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-chips-desktop.aria.yml @@ -0,0 +1,163 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=true" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=false" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "button" + name: "Remove Cappuccino (cappuccino-small)" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "button" + name: "Remove Seasonal single-origin coffee tasting selection with reusable gift box (coffee-box)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-chips-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-chips-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-chips-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-chips-mobile.aria.yml @@ -0,0 +1,167 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and " + - role: "InlineTextBox" + name: "category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=true" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=false" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "button" + name: "Remove Cappuccino (cappuccino-small)" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "button" + name: "Remove Seasonal single-origin coffee tasting selection with reusable gift box (coffee-box)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting " + - role: "InlineTextBox" + name: "selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-chips-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-chips-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-desktop.aria.yml @@ -0,0 +1,194 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "dialog" + name: "+ Add product category" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=true" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=false" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=true" + - role: "combobox" + name: "Search categories" + state: "required=false, expanded=true" + - role: "generic" + - role: "button" + name: "Done" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "generic" + - role: "listbox" + name: "Search categories" + state: "required=false" + - role: "button" + name: "Create category “Desserts”" + - role: "StaticText" + name: "Done" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "button" + name: "Remove Cappuccino (cappuccino-small)" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "button" + name: "Remove Seasonal single-origin coffee tasting selection with reusable gift box (coffee-box)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "StaticText" + name: "Desserts" + - role: "status" + - role: "StaticText" + name: "Create category “Desserts”" + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "Desserts" + - role: "StaticText" + name: "No matches" + - role: "InlineTextBox" + name: "Create category “Desserts”" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "No matches" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-mobile.aria.yml @@ -0,0 +1,198 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and " + - role: "InlineTextBox" + name: "category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "dialog" + name: "+ Add product category" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=true" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=false" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=true" + - role: "combobox" + name: "Search categories" + state: "required=false, expanded=true" + - role: "generic" + - role: "button" + name: "Done" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "generic" + - role: "listbox" + name: "Search categories" + state: "required=false" + - role: "button" + name: "Create category “Desserts”" + - role: "StaticText" + name: "Done" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "button" + name: "Remove Cappuccino (cappuccino-small)" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "button" + name: "Remove Seasonal single-origin coffee tasting selection with reusable gift box (coffee-box)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "StaticText" + name: "Desserts" + - role: "status" + - role: "StaticText" + name: "Create category “Desserts”" + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting " + - role: "InlineTextBox" + name: "selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "Desserts" + - role: "StaticText" + name: "No matches" + - role: "InlineTextBox" + name: "Create category “Desserts”" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "No matches" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-create-category-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-desktop.aria.yml @@ -0,0 +1,357 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "dialog" + name: "+ Add inventory product" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=true" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=false" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=true" + - role: "combobox" + name: "Search products" + state: "required=false, expanded=true" + - role: "generic" + - role: "button" + name: "Done" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "button" + name: "Remove Cappuccino (cappuccino-small)" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "button" + name: "Remove Seasonal single-origin coffee tasting selection with reusable gift box (coffee-box)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "generic" + - role: "listbox" + name: "Search products" + state: "required=false" + - role: "StaticText" + name: "Done" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "option" + name: "Espresso espresso" + state: "selected=true" + - role: "option" + name: "Cappuccino cappuccino-small" + state: "selected=true" + - role: "option" + name: "Cappuccino cappuccino-large" + state: "selected=false" + - role: "option" + name: "Croissant croissant" + state: "selected=false" + - role: "option" + name: "Coffee mug mug" + state: "selected=false" + - role: "option" + name: "Seasonal single-origin coffee tasting selection with reusable gift box coffee-box" + state: "selected=true" + - role: "option" + name: "Latte cafe-0" + state: "selected=false" + - role: "option" + name: "Mocha cafe-1" + state: "selected=false" + - role: "option" + name: "Americano cafe-2" + state: "selected=false" + - role: "option" + name: "Tea cafe-3" + state: "selected=false" + - role: "option" + name: "Iced coffee cafe-4" + state: "selected=false" + - role: "option" + name: "Hot chocolate cafe-5" + state: "selected=false" + - role: "option" + name: "Cookie cafe-6" + state: "selected=false" + - role: "option" + name: "Brownie cafe-7" + state: "selected=false" + - role: "option" + name: "Baguette cafe-8" + state: "selected=false" + - role: "option" + name: "Lemonade cafe-9" + state: "selected=false" + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-large" + - role: "StaticText" + name: "Croissant" + - role: "StaticText" + name: "croissant" + - role: "StaticText" + name: "Coffee mug" + - role: "StaticText" + name: "mug" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "StaticText" + name: "Latte" + - role: "StaticText" + name: "cafe-0" + - role: "StaticText" + name: "Mocha" + - role: "StaticText" + name: "cafe-1" + - role: "StaticText" + name: "Americano" + - role: "StaticText" + name: "cafe-2" + - role: "StaticText" + name: "Tea" + - role: "StaticText" + name: "cafe-3" + - role: "StaticText" + name: "Iced coffee" + - role: "StaticText" + name: "cafe-4" + - role: "StaticText" + name: "Hot chocolate" + - role: "StaticText" + name: "cafe-5" + - role: "StaticText" + name: "Cookie" + - role: "StaticText" + name: "cafe-6" + - role: "StaticText" + name: "Brownie" + - role: "StaticText" + name: "cafe-7" + - role: "StaticText" + name: "Baguette" + - role: "StaticText" + name: "cafe-8" + - role: "StaticText" + name: "Lemonade" + - role: "StaticText" + name: "cafe-9" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-large" + - role: "InlineTextBox" + name: "Croissant" + - role: "InlineTextBox" + name: "croissant" + - role: "InlineTextBox" + name: "Coffee mug" + - role: "InlineTextBox" + name: "mug" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting " + - role: "InlineTextBox" + name: "selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "InlineTextBox" + name: "Latte" + - role: "InlineTextBox" + name: "cafe-0" + - role: "InlineTextBox" + name: "Mocha" + - role: "InlineTextBox" + name: "cafe-1" + - role: "InlineTextBox" + name: "Americano" + - role: "InlineTextBox" + name: "cafe-2" + - role: "InlineTextBox" + name: "Tea" + - role: "InlineTextBox" + name: "cafe-3" + - role: "InlineTextBox" + name: "Iced coffee" + - role: "InlineTextBox" + name: "cafe-4" + - role: "InlineTextBox" + name: "Hot chocolate" + - role: "InlineTextBox" + name: "cafe-5" + - role: "InlineTextBox" + name: "Cookie" + - role: "InlineTextBox" + name: "cafe-6" + - role: "InlineTextBox" + name: "Brownie" + - role: "InlineTextBox" + name: "cafe-7" + - role: "InlineTextBox" + name: "Baguette" + - role: "InlineTextBox" + name: "cafe-8" + - role: "InlineTextBox" + name: "Lemonade" + - role: "InlineTextBox" + name: "cafe-9" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-mobile.aria.yml @@ -0,0 +1,361 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and " + - role: "InlineTextBox" + name: "category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "dialog" + name: "+ Add inventory product" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=true" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=false" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=true" + - role: "combobox" + name: "Search products" + state: "required=false, expanded=true" + - role: "generic" + - role: "button" + name: "Done" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "button" + name: "Remove Cappuccino (cappuccino-small)" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "button" + name: "Remove Seasonal single-origin coffee tasting selection with reusable gift box (coffee-box)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "generic" + - role: "listbox" + name: "Search products" + state: "required=false" + - role: "StaticText" + name: "Done" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting " + - role: "InlineTextBox" + name: "selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "option" + name: "Espresso espresso" + state: "selected=true" + - role: "option" + name: "Cappuccino cappuccino-small" + state: "selected=true" + - role: "option" + name: "Cappuccino cappuccino-large" + state: "selected=false" + - role: "option" + name: "Croissant croissant" + state: "selected=false" + - role: "option" + name: "Coffee mug mug" + state: "selected=false" + - role: "option" + name: "Seasonal single-origin coffee tasting selection with reusable gift box coffee-box" + state: "selected=true" + - role: "option" + name: "Latte cafe-0" + state: "selected=false" + - role: "option" + name: "Mocha cafe-1" + state: "selected=false" + - role: "option" + name: "Americano cafe-2" + state: "selected=false" + - role: "option" + name: "Tea cafe-3" + state: "selected=false" + - role: "option" + name: "Iced coffee cafe-4" + state: "selected=false" + - role: "option" + name: "Hot chocolate cafe-5" + state: "selected=false" + - role: "option" + name: "Cookie cafe-6" + state: "selected=false" + - role: "option" + name: "Brownie cafe-7" + state: "selected=false" + - role: "option" + name: "Baguette cafe-8" + state: "selected=false" + - role: "option" + name: "Lemonade cafe-9" + state: "selected=false" + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-small" + - role: "StaticText" + name: "Cappuccino" + - role: "StaticText" + name: "cappuccino-large" + - role: "StaticText" + name: "Croissant" + - role: "StaticText" + name: "croissant" + - role: "StaticText" + name: "Coffee mug" + - role: "StaticText" + name: "mug" + - role: "StaticText" + name: "Seasonal single-origin coffee tasting selection with reusable gift box" + - role: "StaticText" + name: "coffee-box" + - role: "StaticText" + name: "Latte" + - role: "StaticText" + name: "cafe-0" + - role: "StaticText" + name: "Mocha" + - role: "StaticText" + name: "cafe-1" + - role: "StaticText" + name: "Americano" + - role: "StaticText" + name: "cafe-2" + - role: "StaticText" + name: "Tea" + - role: "StaticText" + name: "cafe-3" + - role: "StaticText" + name: "Iced coffee" + - role: "StaticText" + name: "cafe-4" + - role: "StaticText" + name: "Hot chocolate" + - role: "StaticText" + name: "cafe-5" + - role: "StaticText" + name: "Cookie" + - role: "StaticText" + name: "cafe-6" + - role: "StaticText" + name: "Brownie" + - role: "StaticText" + name: "cafe-7" + - role: "StaticText" + name: "Baguette" + - role: "StaticText" + name: "cafe-8" + - role: "StaticText" + name: "Lemonade" + - role: "StaticText" + name: "cafe-9" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-small" + - role: "InlineTextBox" + name: "Cappuccino" + - role: "InlineTextBox" + name: "cappuccino-large" + - role: "InlineTextBox" + name: "Croissant" + - role: "InlineTextBox" + name: "croissant" + - role: "InlineTextBox" + name: "Coffee mug" + - role: "InlineTextBox" + name: "mug" + - role: "InlineTextBox" + name: "Seasonal single-origin coffee tasting " + - role: "InlineTextBox" + name: "selection with reusable gift box" + - role: "InlineTextBox" + name: "coffee-box" + - role: "InlineTextBox" + name: "Latte" + - role: "InlineTextBox" + name: "cafe-0" + - role: "InlineTextBox" + name: "Mocha" + - role: "InlineTextBox" + name: "cafe-1" + - role: "InlineTextBox" + name: "Americano" + - role: "InlineTextBox" + name: "cafe-2" + - role: "InlineTextBox" + name: "Tea" + - role: "InlineTextBox" + name: "cafe-3" + - role: "InlineTextBox" + name: "Iced coffee" + - role: "InlineTextBox" + name: "cafe-4" + - role: "InlineTextBox" + name: "Hot chocolate" + - role: "InlineTextBox" + name: "cafe-5" + - role: "InlineTextBox" + name: "Cookie" + - role: "InlineTextBox" + name: "cafe-6" + - role: "InlineTextBox" + name: "Brownie" + - role: "InlineTextBox" + name: "cafe-7" + - role: "InlineTextBox" + name: "Baguette" + - role: "InlineTextBox" + name: "cafe-8" + - role: "InlineTextBox" + name: "Lemonade" + - role: "InlineTextBox" + name: "cafe-9" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-desktop.aria.yml @@ -0,0 +1,152 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=false" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=true" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Retired coffee blend" + - role: "StaticText" + name: "retired" + - role: "StaticText" + name: "Unavailable — remove before saving" + - role: "button" + name: "Remove Retired coffee blend (retired)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Retired coffee blend" + - role: "InlineTextBox" + name: "retired" + - role: "InlineTextBox" + name: "Unavailable — remove before saving" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-mobile.aria.yml @@ -0,0 +1,154 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "UI Components › Product and category multi-select" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "UI Components" + - role: "generic" + - role: "StaticText" + name: "Product and category multi-select" + - role: "StaticText" + name: "Dataset" + - role: "combobox" + name: "Story dataset" + state: "expanded=false" + - role: "heading" + name: "Product categories" + - role: "generic" + - role: "heading" + name: "Individual products" + - role: "generic" + - role: "StaticText" + name: "UI Components" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Product and " + - role: "InlineTextBox" + name: "category multi-select" + - role: "InlineTextBox" + name: "Dataset" + - role: "MenuListPopup" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Selected items: Search categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "list" + name: "Selected items: Search products" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "UI Components" + - role: "InlineTextBox" + name: "›" + - role: "option" + name: "Preselected" + state: "selected=false" + - role: "option" + name: "Empty selection" + state: "selected=false" + - role: "option" + name: "Unavailable selection" + state: "selected=true" + - role: "option" + name: "Loading" + state: "selected=false" + - role: "option" + name: "Empty catalog" + state: "selected=false" + - role: "option" + name: "Load failure" + state: "selected=false" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "listitem" + - role: "listitem" + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "Hot drinks" + - role: "StaticText" + name: "1" + - role: "button" + name: "Remove Hot drinks (1)" + - role: "StaticText" + name: "Pastries" + - role: "StaticText" + name: "2" + - role: "button" + name: "Remove Pastries (2)" + - role: "StaticText" + name: "+ Add product category" + - role: "StaticText" + name: "Espresso" + - role: "StaticText" + name: "espresso" + - role: "button" + name: "Remove Espresso (espresso)" + - role: "StaticText" + name: "Retired coffee blend" + - role: "StaticText" + name: "retired" + - role: "StaticText" + name: "Unavailable — remove before saving" + - role: "button" + name: "Remove Retired coffee blend (retired)" + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "Hot drinks" + - role: "InlineTextBox" + name: "1" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Pastries" + - role: "InlineTextBox" + name: "2" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "Espresso" + - role: "InlineTextBox" + name: "espresso" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "Retired coffee blend" + - role: "InlineTextBox" + name: "retired" + - role: "InlineTextBox" + name: "Unavailable — remove before saving" + - role: "StaticText" + name: "×" + - role: "InlineTextBox" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" + - role: "InlineTextBox" + name: "×" diff --git a/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-selector-unavailable-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-basics-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-basics-desktop.aria.yml @@ -0,0 +1,265 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "group" + name: "What would you like to offer?" + - role: "LabelText" + - role: "textbox" + name: "Discount stamp name *" + state: "required=true" + - role: "StaticText" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "LabelText" + - role: "textbox" + name: "Description *" + state: "required=true" + - role: "paragraph" + - role: "region" + name: "Technical identifier" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "StaticText" + name: "Details" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "Legend" + - role: "LabelText" + name: "Discount stamps" + - role: "LabelText" + name: "Pass" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "InlineTextBox" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "StaticText" + name: "Description" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not configure it." + - role: "heading" + name: "Technical identifier" + - role: "button" + name: "Show advanced options" + state: "expanded=false" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "InlineTextBox" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "radio" + name: "Discount stamps" + state: "checked=true" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Customers collect discount stamps in their wallet and exchange them for a reward." + - role: "radio" + name: "Pass" + state: "checked=false" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Customers keep their pass and can reuse it until it expires." + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Description" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not " + - role: "InlineTextBox" + name: "configure it." + - role: "StaticText" + name: "Technical identifier" + - role: "StaticText" + name: "Show advanced options" + - role: "generic" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Customers collect discount stamps in their " + - role: "InlineTextBox" + name: "wallet and exchange them for a reward." + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Customers keep their pass and can reuse it until " + - role: "InlineTextBox" + name: "it expires." + - role: "InlineTextBox" + name: "Technical identifier" + - role: "InlineTextBox" + name: "Show advanced options" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-basics-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-basics-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-desktop.aria.yml @@ -0,0 +1,342 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "spinbutton" + name: "Number of discount stamps needed" + state: "required=false" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=true" + - role: "generic" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "StaticText" + name: "7" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "7" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-mobile.aria.yml @@ -0,0 +1,352 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "spinbutton" + name: "Number of discount stamps needed" + state: "required=false" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=true" + - role: "generic" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "StaticText" + name: "7" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "7" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-custom-stamp-count-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-desktop.aria.yml @@ -0,0 +1,289 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Collecting discount stamps" + - role: "region" + name: "Collecting discount stamps" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "paragraph" + - role: "group" + name: "Which purchases earn a discount stamp?" + - role: "LabelText" + - role: "combobox" + name: "Currency" + state: "expanded=false" + - role: "spinbutton" + name: "Minimum spend on the selected products (optional)" + state: "required=false" + - role: "paragraph" + - role: "alert" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Minimum spend on the selected products (optional)" + - role: "MenuListPopup" + - role: "generic" + - role: "StaticText" + name: "Other products in the same purchase do not count toward this minimum." + - role: "generic" + - role: "button" + name: "Dismiss error" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it " + - role: "InlineTextBox" + name: "contains." + - role: "StaticText" + name: "Which purchases earn a discount stamp?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "paragraph" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Minimum spend on the selected " + - role: "InlineTextBox" + name: "products (optional)" + - role: "option" + name: "CHF" + state: "selected=true" + - role: "InlineTextBox" + name: "Other products in the same purchase do not count toward this minimum." + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "StaticText" + name: "✕" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Which purchases earn a discount stamp?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Select at least one product category or inventory product." + - role: "InlineTextBox" + name: "✕" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Select at least one product category or inventory product." + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. Add a product or select a product category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-mobile.aria.yml @@ -0,0 +1,315 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Collecting discount stamps" + - role: "region" + name: "Collecting discount stamps" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "paragraph" + - role: "group" + name: "Which purchases earn a discount stamp?" + - role: "LabelText" + - role: "combobox" + name: "Currency" + state: "expanded=false" + - role: "spinbutton" + name: "Minimum spend on the selected products (optional)" + state: "required=false" + - role: "paragraph" + - role: "alert" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Minimum spend on the selected products (optional)" + - role: "MenuListPopup" + - role: "generic" + - role: "StaticText" + name: "Other products in the same purchase do not count toward this minimum." + - role: "generic" + - role: "button" + name: "Dismiss error" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Collecting discount " + - role: "InlineTextBox" + name: "stamps" + - role: "InlineTextBox" + name: "Each qualifying paid purchase earns " + - role: "InlineTextBox" + name: "one discount stamp, regardless of " + - role: "InlineTextBox" + name: "how many eligible items it contains." + - role: "StaticText" + name: "Which purchases earn a discount stamp?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "paragraph" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Minimum spend on the selected " + - role: "InlineTextBox" + name: "products (optional)" + - role: "option" + name: "CHF" + state: "selected=true" + - role: "InlineTextBox" + name: "Other products in the same purchase do " + - role: "InlineTextBox" + name: "not count toward this minimum." + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "StaticText" + name: "✕" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Which purchases earn a discount " + - role: "InlineTextBox" + name: "stamp?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Select at least one product " + - role: "InlineTextBox" + name: "category or inventory product." + - role: "InlineTextBox" + name: "✕" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Select at least one product category " + - role: "InlineTextBox" + name: "or inventory product." + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. " + - role: "InlineTextBox" + name: "Add a product or select a product " + - role: "InlineTextBox" + name: "category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-earning-error-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-desktop.aria.yml @@ -0,0 +1,341 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "group" + name: "Which item is free?" + - role: "Legend" + - role: "generic" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=false" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=true" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "paragraph" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "StaticText" + name: "Which item is free?" + - role: "radio" + name: "Lowest-priced eligible item" + state: "checked=true" + - role: "StaticText" + name: "Lowest-priced eligible item" + - role: "radio" + name: "Highest-priced eligible item" + state: "checked=false" + - role: "StaticText" + name: "Highest-priced eligible item" + - role: "StaticText" + name: "One item from the selected products is free." + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "Which item is free?" + - role: "InlineTextBox" + name: "Lowest-priced eligible item" + - role: "InlineTextBox" + name: "Highest-priced eligible item" + - role: "InlineTextBox" + name: "One item from the selected products is free." + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. Add a product or select a product category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-mobile.aria.yml @@ -0,0 +1,359 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "group" + name: "Which item is free?" + - role: "Legend" + - role: "generic" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=false" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=true" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "paragraph" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "StaticText" + name: "Which item is free?" + - role: "radio" + name: "Lowest-priced eligible item" + state: "checked=true" + - role: "StaticText" + name: "Lowest-priced eligible item" + - role: "radio" + name: "Highest-priced eligible item" + state: "checked=false" + - role: "StaticText" + name: "Highest-priced eligible item" + - role: "StaticText" + name: "One item from the selected products is free." + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "Which item is free?" + - role: "InlineTextBox" + name: "Lowest-priced eligible " + - role: "InlineTextBox" + name: "item" + - role: "InlineTextBox" + name: "Highest-priced eligible " + - role: "InlineTextBox" + name: "item" + - role: "InlineTextBox" + name: "One item from the selected products is " + - role: "InlineTextBox" + name: "free." + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. " + - role: "InlineTextBox" + name: "Add a product or select a product " + - role: "InlineTextBox" + name: "category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-free-item-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-desktop.aria.yml @@ -0,0 +1,219 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "paragraph" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=true" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=false" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "StaticText" + name: "Customers can collect discount stamps, but cannot yet exchange them for a reward at checkout." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "InlineTextBox" + name: "Customers can collect discount stamps, but cannot yet exchange them for a reward at checkout." + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-mobile.aria.yml @@ -0,0 +1,229 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "paragraph" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=true" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=false" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "StaticText" + name: "Customers can collect discount stamps, but cannot yet exchange them for a reward at checkout." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "InlineTextBox" + name: "Customers can collect discount " + - role: "InlineTextBox" + name: "stamps, but cannot yet exchange " + - role: "InlineTextBox" + name: "them for a reward at checkout." + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-no-reward-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-desktop.aria.yml @@ -0,0 +1,391 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "alert" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "Dismiss error" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "paragraph" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "StaticText" + name: "✕" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Select at least one product category or inventory product." + - role: "InlineTextBox" + name: "✕" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Select at least one product category or inventory product." + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. Add a product or select a product category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-mobile.aria.yml @@ -0,0 +1,409 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "alert" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "generic" + - role: "button" + name: "Dismiss error" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "paragraph" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "StaticText" + name: "✕" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "StaticText" + name: "Select at least one product category or inventory product." + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "InlineTextBox" + name: "Select at least one product " + - role: "InlineTextBox" + name: "category or inventory product." + - role: "InlineTextBox" + name: "✕" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Select at least one product category " + - role: "InlineTextBox" + name: "or inventory product." + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. " + - role: "InlineTextBox" + name: "Add a product or select a product " + - role: "InlineTextBox" + name: "category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-error-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-desktop.aria.yml @@ -0,0 +1,272 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Collecting discount stamps" + - role: "region" + name: "Collecting discount stamps" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "paragraph" + - role: "group" + name: "Which purchases earn a discount stamp?" + - role: "LabelText" + - role: "combobox" + name: "Currency" + state: "expanded=false" + - role: "spinbutton" + name: "Minimum spend on the selected products (optional)" + state: "required=false" + - role: "paragraph" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Minimum spend on the selected products (optional)" + - role: "MenuListPopup" + - role: "generic" + - role: "StaticText" + name: "Other products in the same purchase do not count toward this minimum." + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it " + - role: "InlineTextBox" + name: "contains." + - role: "StaticText" + name: "Which purchases earn a discount stamp?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Minimum spend on the selected " + - role: "InlineTextBox" + name: "products (optional)" + - role: "option" + name: "CHF" + state: "selected=true" + - role: "InlineTextBox" + name: "Other products in the same purchase do not count toward this minimum." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Which purchases earn a discount stamp?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. Add a product or select a product category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-mobile.aria.yml @@ -0,0 +1,294 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Collecting discount stamps" + - role: "region" + name: "Collecting discount stamps" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "paragraph" + - role: "group" + name: "Which purchases earn a discount stamp?" + - role: "LabelText" + - role: "combobox" + name: "Currency" + state: "expanded=false" + - role: "spinbutton" + name: "Minimum spend on the selected products (optional)" + state: "required=false" + - role: "paragraph" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Each qualifying paid purchase earns one discount stamp, regardless of how many eligible items it contains." + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "StaticText" + name: "Minimum spend on the selected products (optional)" + - role: "MenuListPopup" + - role: "generic" + - role: "StaticText" + name: "Other products in the same purchase do not count toward this minimum." + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Collecting discount " + - role: "InlineTextBox" + name: "stamps" + - role: "InlineTextBox" + name: "Each qualifying paid purchase earns " + - role: "InlineTextBox" + name: "one discount stamp, regardless of " + - role: "InlineTextBox" + name: "how many eligible items it contains." + - role: "StaticText" + name: "Which purchases earn a discount stamp?" + - role: "radio" + name: "All purchases" + state: "checked=false" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=true" + - role: "StaticText" + name: "Purchases with matching products" + - role: "group" + name: "Product categories" + - role: "group" + name: "Individual products" + - role: "InlineTextBox" + name: "Minimum spend on the selected " + - role: "InlineTextBox" + name: "products (optional)" + - role: "option" + name: "CHF" + state: "selected=true" + - role: "InlineTextBox" + name: "Other products in the same purchase do " + - role: "InlineTextBox" + name: "not count toward this minimum." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Which purchases earn a discount " + - role: "InlineTextBox" + name: "stamp?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "Legend" + - role: "generic" + - role: "Legend" + - role: "generic" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "StaticText" + name: "Product categories" + - role: "generic" + - role: "status" + - role: "StaticText" + name: "Individual products" + - role: "status" + - role: "generic" + - role: "status" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "Product categories" + - role: "button" + name: "+ Add product category" + state: "expanded=false" + - role: "InlineTextBox" + name: "Individual products" + - role: "StaticText" + name: "No inventory products are available. Add a product or select a product category." + - role: "button" + name: "+ Add inventory product" + state: "expanded=false" + - role: "StaticText" + name: "+ Add product category" + - role: "InlineTextBox" + name: "No inventory products are available. " + - role: "InlineTextBox" + name: "Add a product or select a product " + - role: "InlineTextBox" + name: "category." + - role: "StaticText" + name: "+ Add inventory product" + - role: "InlineTextBox" + name: "+ Add product category" + - role: "InlineTextBox" + name: "+ Add inventory product" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-product-scope-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-desktop.aria.yml @@ -0,0 +1,382 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "generic" + name: "Rule summary" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "heading" + name: "Review" + - role: "paragraph" + - role: "region" + name: "Details" + - role: "region" + name: "Collecting discount stamps" + - role: "region" + name: "Customer reward" + - role: "region" + name: "Validity" + - role: "group" + name: "Technical details" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "10% off" + - role: "StaticText" + name: ". Use 5 discount stamps to claim the reward." + - role: "heading" + name: "Details" + - role: "button" + name: "Edit Details" + - role: "DescriptionList" + - role: "heading" + name: "Collecting discount stamps" + - role: "button" + name: "Edit Collecting discount stamps" + - role: "paragraph" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "heading" + name: "Customer reward" + - role: "button" + name: "Edit Customer reward" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "heading" + name: "Validity" + - role: "button" + name: "Edit Validity" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "DisclosureTriangle" + name: "Technical details" + state: "expanded=false" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Create discount stamps" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "10% off" + - role: "InlineTextBox" + name: ". Use 5 discount stamps to claim the reward." + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp name" + - role: "definition" + - role: "term" + name: "Customer description" + - role: "definition" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Edit" + - role: "StaticText" + name: "Customers earn one discount stamp per qualifying paid purchase." + - role: "term" + name: "Applies to" + - role: "definition" + - role: "term" + name: "Minimum purchase total" + - role: "definition" + - role: "StaticText" + name: "Using the reward does not earn another discount stamp." + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Benefit" + - role: "definition" + - role: "term" + name: "Discount stamps needed" + - role: "definition" + - role: "term" + name: "Applies to" + - role: "definition" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp validity period" + - role: "definition" + - role: "term" + name: "Shared expiry dates" + - role: "definition" + - role: "term" + name: "Start and end dates" + - role: "definition" + - role: "StaticText" + name: "Discount stamps issued in the same period expire together, which can shorten their usable time. Individual stamps still expire when no end date is set." + - role: "StaticText" + name: "Technical details" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Create discount stamps" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "StaticText" + name: "Customer description" + - role: "StaticText" + name: "Collect five discount stamps for 10% off your next purchase." + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Edit" + - role: "InlineTextBox" + name: "Customers earn one discount stamp per qualifying paid purchase." + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Minimum purchase total" + - role: "StaticText" + name: "No minimum" + - role: "InlineTextBox" + name: "Using the reward does not earn another discount stamp." + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Benefit" + - role: "StaticText" + name: "10% off" + - role: "StaticText" + name: "Discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "StaticText" + name: "Up to 30 days" + - role: "StaticText" + name: "Shared expiry dates" + - role: "StaticText" + name: "1 day" + - role: "StaticText" + name: "Start and end dates" + - role: "StaticText" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Discount stamps issued in the same period expire together, which can shorten their usable time. " + - role: "InlineTextBox" + name: "Individual stamps still expire when no end date is set." + - role: "InlineTextBox" + name: "Technical details" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "Customer description" + - role: "InlineTextBox" + name: "Collect five discount stamps for 10% off your next purchase." + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Minimum purchase total" + - role: "InlineTextBox" + name: "No minimum" + - role: "InlineTextBox" + name: "Benefit" + - role: "InlineTextBox" + name: "10% off" + - role: "InlineTextBox" + name: "Discount stamps needed" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Discount stamp validity " + - role: "InlineTextBox" + name: "period" + - role: "InlineTextBox" + name: "Up to 30 days" + - role: "InlineTextBox" + name: "Shared expiry dates" + - role: "InlineTextBox" + name: "1 day" + - role: "InlineTextBox" + name: "Start and end dates" + - role: "InlineTextBox" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-desktop.aria.yml @@ -0,0 +1,385 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "generic" + name: "Rule summary" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "heading" + name: "Review" + - role: "paragraph" + - role: "region" + name: "Details" + - role: "region" + name: "Collecting discount stamps" + - role: "region" + name: "Customer reward" + - role: "region" + name: "Validity" + - role: "group" + name: "Technical details" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "Lowest-priced eligible item free" + - role: "StaticText" + name: ". Use 5 discount stamps to claim the reward." + - role: "heading" + name: "Details" + - role: "button" + name: "Edit Details" + - role: "DescriptionList" + - role: "heading" + name: "Collecting discount stamps" + - role: "button" + name: "Edit Collecting discount stamps" + - role: "paragraph" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "heading" + name: "Customer reward" + - role: "button" + name: "Edit Customer reward" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "heading" + name: "Validity" + - role: "button" + name: "Edit Validity" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "DisclosureTriangle" + name: "Technical details" + state: "expanded=false" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Create discount stamps" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Lowest-priced eligible item free" + - role: "InlineTextBox" + name: ". Use 5 discount stamps to claim the reward." + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp name" + - role: "definition" + - role: "term" + name: "Customer description" + - role: "definition" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Edit" + - role: "StaticText" + name: "Customers earn one discount stamp per qualifying paid purchase." + - role: "term" + name: "Applies to" + - role: "definition" + - role: "term" + name: "Minimum purchase total" + - role: "definition" + - role: "StaticText" + name: "Using the reward does not earn another discount stamp." + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Benefit" + - role: "definition" + - role: "term" + name: "Discount stamps needed" + - role: "definition" + - role: "term" + name: "Product categories" + - role: "definition" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp validity period" + - role: "definition" + - role: "term" + name: "Shared expiry dates" + - role: "definition" + - role: "term" + name: "Start and end dates" + - role: "definition" + - role: "StaticText" + name: "Discount stamps issued in the same period expire together, which can shorten their usable time. Individual stamps still expire when no end date is set." + - role: "StaticText" + name: "Technical details" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Create discount stamps" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "StaticText" + name: "Customer description" + - role: "StaticText" + name: "Collect five discount stamps for a free coffee." + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Edit" + - role: "InlineTextBox" + name: "Customers earn one discount stamp per qualifying paid purchase." + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Minimum purchase total" + - role: "StaticText" + name: "No minimum" + - role: "InlineTextBox" + name: "Using the reward does not earn another discount stamp." + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Benefit" + - role: "StaticText" + name: "Lowest-priced eligible item free" + - role: "StaticText" + name: "Discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Product categories" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "StaticText" + name: "Up to 30 days" + - role: "StaticText" + name: "Shared expiry dates" + - role: "StaticText" + name: "1 day" + - role: "StaticText" + name: "Start and end dates" + - role: "StaticText" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Discount stamps issued in the same period expire together, which can shorten their usable time. " + - role: "InlineTextBox" + name: "Individual stamps still expire when no end date is set." + - role: "InlineTextBox" + name: "Technical details" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "Customer description" + - role: "InlineTextBox" + name: "Collect five discount stamps for a free coffee." + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Minimum purchase total" + - role: "InlineTextBox" + name: "No minimum" + - role: "InlineTextBox" + name: "Benefit" + - role: "InlineTextBox" + name: "Lowest-priced eligible item free" + - role: "InlineTextBox" + name: "Discount stamps needed" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "Product categories" + - role: "listitem" + - role: "InlineTextBox" + name: "Discount stamp validity " + - role: "InlineTextBox" + name: "period" + - role: "InlineTextBox" + name: "Up to 30 days" + - role: "InlineTextBox" + name: "Shared expiry dates" + - role: "InlineTextBox" + name: "1 day" + - role: "InlineTextBox" + name: "Start and end dates" + - role: "InlineTextBox" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Cancel" + - role: "StaticText" + name: "Coffee" + - role: "InlineTextBox" + name: "Coffee" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-mobile.aria.yml @@ -0,0 +1,435 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "generic" + name: "Rule summary" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "heading" + name: "Review" + - role: "paragraph" + - role: "region" + name: "Details" + - role: "region" + name: "Collecting discount stamps" + - role: "region" + name: "Customer reward" + - role: "region" + name: "Validity" + - role: "group" + name: "Technical details" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "Lowest-priced eligible item free" + - role: "StaticText" + name: ". Use 5 discount stamps to claim the reward." + - role: "heading" + name: "Details" + - role: "button" + name: "Edit Details" + - role: "DescriptionList" + - role: "heading" + name: "Collecting discount stamps" + - role: "button" + name: "Edit Collecting discount stamps" + - role: "paragraph" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "heading" + name: "Customer reward" + - role: "button" + name: "Edit Customer reward" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "heading" + name: "Validity" + - role: "button" + name: "Edit Validity" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "DisclosureTriangle" + name: "Technical details" + state: "expanded=false" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Create discount stamps" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Lowest-priced eligible item free" + - role: "InlineTextBox" + name: ". Use " + - role: "InlineTextBox" + name: "5 discount stamps to claim the " + - role: "InlineTextBox" + name: "reward." + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp name" + - role: "definition" + - role: "term" + name: "Customer description" + - role: "definition" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Edit" + - role: "StaticText" + name: "Customers earn one discount stamp per qualifying paid purchase." + - role: "term" + name: "Applies to" + - role: "definition" + - role: "term" + name: "Minimum purchase total" + - role: "definition" + - role: "StaticText" + name: "Using the reward does not earn another discount stamp." + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Benefit" + - role: "definition" + - role: "term" + name: "Discount stamps needed" + - role: "definition" + - role: "term" + name: "Product categories" + - role: "definition" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp validity period" + - role: "definition" + - role: "term" + name: "Shared expiry dates" + - role: "definition" + - role: "term" + name: "Start and end dates" + - role: "definition" + - role: "StaticText" + name: "Discount stamps issued in the same period expire together, which can shorten their usable time. Individual stamps still expire when no end date is set." + - role: "StaticText" + name: "Technical details" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Create discount stamps" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "StaticText" + name: "Customer description" + - role: "StaticText" + name: "Collect five discount stamps for a free coffee." + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Edit" + - role: "InlineTextBox" + name: "Customers earn one discount stamp " + - role: "InlineTextBox" + name: "per qualifying paid purchase." + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Minimum purchase total" + - role: "StaticText" + name: "No minimum" + - role: "InlineTextBox" + name: "Using the reward does not earn " + - role: "InlineTextBox" + name: "another discount stamp." + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Benefit" + - role: "StaticText" + name: "Lowest-priced eligible item free" + - role: "StaticText" + name: "Discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "Product categories" + - role: "list" + name: "Product categories" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "StaticText" + name: "Up to 30 days" + - role: "StaticText" + name: "Shared expiry dates" + - role: "StaticText" + name: "1 day" + - role: "StaticText" + name: "Start and end dates" + - role: "StaticText" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Discount stamps issued in the same " + - role: "InlineTextBox" + name: "period expire together, which can " + - role: "InlineTextBox" + name: "shorten their usable time. Individual " + - role: "InlineTextBox" + name: "stamps still expire when no end date " + - role: "InlineTextBox" + name: "is set." + - role: "InlineTextBox" + name: "Technical details" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamp name" + - role: "InlineTextBox" + name: "Coffee discount " + - role: "InlineTextBox" + name: "stamps" + - role: "InlineTextBox" + name: "Customer " + - role: "InlineTextBox" + name: "description" + - role: "InlineTextBox" + name: "Collect five discount " + - role: "InlineTextBox" + name: "stamps for a free " + - role: "InlineTextBox" + name: "coffee." + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Minimum " + - role: "InlineTextBox" + name: "purchase total" + - role: "InlineTextBox" + name: "No minimum" + - role: "InlineTextBox" + name: "Benefit" + - role: "InlineTextBox" + name: "Lowest-priced eligible " + - role: "InlineTextBox" + name: "item free" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamps " + - role: "InlineTextBox" + name: "needed" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "Product " + - role: "InlineTextBox" + name: "categories" + - role: "listitem" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamp validity " + - role: "InlineTextBox" + name: "period" + - role: "InlineTextBox" + name: "Up to 30 days" + - role: "InlineTextBox" + name: "Shared expiry " + - role: "InlineTextBox" + name: "dates" + - role: "InlineTextBox" + name: "1 day" + - role: "InlineTextBox" + name: "Start and end " + - role: "InlineTextBox" + name: "dates" + - role: "InlineTextBox" + name: "Starts now, with no " + - role: "InlineTextBox" + name: "end date" + - role: "InlineTextBox" + name: "Cancel" + - role: "StaticText" + name: "Coffee" + - role: "InlineTextBox" + name: "Coffee" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-free-item-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-mobile.aria.yml @@ -0,0 +1,426 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "generic" + name: "Rule summary" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "heading" + name: "Review" + - role: "paragraph" + - role: "region" + name: "Details" + - role: "region" + name: "Collecting discount stamps" + - role: "region" + name: "Customer reward" + - role: "region" + name: "Validity" + - role: "group" + name: "Technical details" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "10% off" + - role: "StaticText" + name: ". Use 5 discount stamps to claim the reward." + - role: "heading" + name: "Details" + - role: "button" + name: "Edit Details" + - role: "DescriptionList" + - role: "heading" + name: "Collecting discount stamps" + - role: "button" + name: "Edit Collecting discount stamps" + - role: "paragraph" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "heading" + name: "Customer reward" + - role: "button" + name: "Edit Customer reward" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "heading" + name: "Validity" + - role: "button" + name: "Edit Validity" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "DisclosureTriangle" + name: "Technical details" + state: "expanded=false" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Create discount stamps" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "10% off" + - role: "InlineTextBox" + name: ". Use 5 discount stamps to " + - role: "InlineTextBox" + name: "claim the reward." + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp name" + - role: "definition" + - role: "term" + name: "Customer description" + - role: "definition" + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "Edit" + - role: "StaticText" + name: "Customers earn one discount stamp per qualifying paid purchase." + - role: "term" + name: "Applies to" + - role: "definition" + - role: "term" + name: "Minimum purchase total" + - role: "definition" + - role: "StaticText" + name: "Using the reward does not earn another discount stamp." + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Benefit" + - role: "definition" + - role: "term" + name: "Discount stamps needed" + - role: "definition" + - role: "term" + name: "Applies to" + - role: "definition" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Discount stamp validity period" + - role: "definition" + - role: "term" + name: "Shared expiry dates" + - role: "definition" + - role: "term" + name: "Start and end dates" + - role: "definition" + - role: "StaticText" + name: "Discount stamps issued in the same period expire together, which can shorten their usable time. Individual stamps still expire when no end date is set." + - role: "StaticText" + name: "Technical details" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Create discount stamps" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "StaticText" + name: "Customer description" + - role: "StaticText" + name: "Collect five discount stamps for 10% off your next purchase." + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "Edit" + - role: "InlineTextBox" + name: "Customers earn one discount stamp " + - role: "InlineTextBox" + name: "per qualifying paid purchase." + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Minimum purchase total" + - role: "StaticText" + name: "No minimum" + - role: "InlineTextBox" + name: "Using the reward does not earn " + - role: "InlineTextBox" + name: "another discount stamp." + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Benefit" + - role: "StaticText" + name: "10% off" + - role: "StaticText" + name: "Discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "StaticText" + name: "Up to 30 days" + - role: "StaticText" + name: "Shared expiry dates" + - role: "StaticText" + name: "1 day" + - role: "StaticText" + name: "Start and end dates" + - role: "StaticText" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Discount stamps issued in the same " + - role: "InlineTextBox" + name: "period expire together, which can " + - role: "InlineTextBox" + name: "shorten their usable time. Individual " + - role: "InlineTextBox" + name: "stamps still expire when no end date " + - role: "InlineTextBox" + name: "is set." + - role: "InlineTextBox" + name: "Technical details" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Create discount stamps" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamp name" + - role: "InlineTextBox" + name: "Coffee discount " + - role: "InlineTextBox" + name: "stamps" + - role: "InlineTextBox" + name: "Customer " + - role: "InlineTextBox" + name: "description" + - role: "InlineTextBox" + name: "Collect five discount " + - role: "InlineTextBox" + name: "stamps for 10% off " + - role: "InlineTextBox" + name: "your next purchase." + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Minimum " + - role: "InlineTextBox" + name: "purchase total" + - role: "InlineTextBox" + name: "No minimum" + - role: "InlineTextBox" + name: "Benefit" + - role: "InlineTextBox" + name: "10% off" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamps " + - role: "InlineTextBox" + name: "needed" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Discount " + - role: "InlineTextBox" + name: "stamp validity " + - role: "InlineTextBox" + name: "period" + - role: "InlineTextBox" + name: "Up to 30 days" + - role: "InlineTextBox" + name: "Shared expiry " + - role: "InlineTextBox" + name: "dates" + - role: "InlineTextBox" + name: "1 day" + - role: "InlineTextBox" + name: "Start and end " + - role: "InlineTextBox" + name: "dates" + - role: "InlineTextBox" + name: "Starts now, with no " + - role: "InlineTextBox" + name: "end date" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-desktop.aria.yml @@ -0,0 +1,309 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Pass" + - role: "StaticText" + name: "Choose what the pass provides and when it expires." + - role: "navigation" + name: "Setup progress" + - role: "generic" + name: "Rule summary" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Pass" + - role: "InlineTextBox" + name: "Choose what the pass provides and when it expires." + - role: "list" + - role: "heading" + name: "Review" + - role: "paragraph" + - role: "region" + name: "Details" + - role: "region" + name: "Pass benefit" + - role: "region" + name: "Validity" + - role: "group" + name: "Technical details" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Pass" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "10% off" + - role: "heading" + name: "Details" + - role: "button" + name: "Edit Details" + - role: "DescriptionList" + - role: "heading" + name: "Pass benefit" + - role: "button" + name: "Edit Pass benefit" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "heading" + name: "Validity" + - role: "button" + name: "Edit Validity" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "DisclosureTriangle" + name: "Technical details" + state: "expanded=false" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Create pass" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Pass benefit" + - role: "button" + name: "3. Validity" + - role: "button" + name: "4. Review" + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "10% off" + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Pass name" + - role: "definition" + - role: "term" + name: "Customer description" + - role: "definition" + - role: "StaticText" + name: "Pass benefit" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Benefit" + - role: "definition" + - role: "term" + name: "Using the pass" + - role: "definition" + - role: "term" + name: "Applies to" + - role: "definition" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Pass validity period" + - role: "definition" + - role: "term" + name: "Shared expiry dates" + - role: "definition" + - role: "term" + name: "Start and end dates" + - role: "definition" + - role: "StaticText" + name: "Passes issued in the same period expire together, which can shorten their usable time. Individual passes still expire when no end date is set." + - role: "StaticText" + name: "Technical details" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Create pass" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Pass benefit" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Pass name" + - role: "StaticText" + name: "Coffee pass" + - role: "StaticText" + name: "Customer description" + - role: "StaticText" + name: "Save 10% on every purchase." + - role: "InlineTextBox" + name: "Pass benefit" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Benefit" + - role: "StaticText" + name: "10% off" + - role: "StaticText" + name: "Using the pass" + - role: "StaticText" + name: "Keep and reuse the pass until it expires" + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Pass validity period" + - role: "StaticText" + name: "Up to 30 days" + - role: "StaticText" + name: "Shared expiry dates" + - role: "StaticText" + name: "1 day" + - role: "StaticText" + name: "Start and end dates" + - role: "StaticText" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Passes issued in the same period expire together, which can shorten their usable time. Individual " + - role: "InlineTextBox" + name: "passes still expire when no end date is set." + - role: "InlineTextBox" + name: "Technical details" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Create pass" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Pass benefit" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Pass name" + - role: "InlineTextBox" + name: "Coffee pass" + - role: "InlineTextBox" + name: "Customer description" + - role: "InlineTextBox" + name: "Save 10% on every purchase." + - role: "InlineTextBox" + name: "Benefit" + - role: "InlineTextBox" + name: "10% off" + - role: "InlineTextBox" + name: "Using the pass" + - role: "InlineTextBox" + name: "Keep and reuse the pass until it expires" + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Pass validity period" + - role: "InlineTextBox" + name: "Up to 30 days" + - role: "InlineTextBox" + name: "Shared expiry dates" + - role: "InlineTextBox" + name: "1 day" + - role: "InlineTextBox" + name: "Start and end dates" + - role: "InlineTextBox" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-mobile.aria.yml @@ -0,0 +1,331 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Pass" + - role: "StaticText" + name: "Choose what the pass provides and when it expires." + - role: "navigation" + name: "Setup progress" + - role: "generic" + name: "Rule summary" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Pass" + - role: "InlineTextBox" + name: "Choose what the pass provides and when it " + - role: "InlineTextBox" + name: "expires." + - role: "list" + - role: "heading" + name: "Review" + - role: "paragraph" + - role: "region" + name: "Details" + - role: "region" + name: "Pass benefit" + - role: "region" + name: "Validity" + - role: "group" + name: "Technical details" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Pass" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Review" + - role: "StaticText" + name: "10% off" + - role: "heading" + name: "Details" + - role: "button" + name: "Edit Details" + - role: "DescriptionList" + - role: "heading" + name: "Pass benefit" + - role: "button" + name: "Edit Pass benefit" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "heading" + name: "Validity" + - role: "button" + name: "Edit Validity" + - role: "DescriptionList" + - role: "DescriptionList" + - role: "paragraph" + - role: "DisclosureTriangle" + name: "Technical details" + state: "expanded=false" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Create pass" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Pass benefit" + - role: "button" + name: "3. Validity" + - role: "button" + name: "4. Review" + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "10% off" + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Pass name" + - role: "definition" + - role: "term" + name: "Customer description" + - role: "definition" + - role: "StaticText" + name: "Pass benefit" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Benefit" + - role: "definition" + - role: "term" + name: "Using the pass" + - role: "definition" + - role: "term" + name: "Applies to" + - role: "definition" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Edit" + - role: "term" + name: "Pass validity period" + - role: "definition" + - role: "term" + name: "Shared expiry dates" + - role: "definition" + - role: "term" + name: "Start and end dates" + - role: "definition" + - role: "StaticText" + name: "Passes issued in the same period expire together, which can shorten their usable time. Individual passes still expire when no end date is set." + - role: "StaticText" + name: "Technical details" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Create pass" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Pass benefit" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Pass name" + - role: "StaticText" + name: "Coffee pass" + - role: "StaticText" + name: "Customer description" + - role: "StaticText" + name: "Save 10% on every purchase." + - role: "InlineTextBox" + name: "Pass benefit" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Benefit" + - role: "StaticText" + name: "10% off" + - role: "StaticText" + name: "Using the pass" + - role: "StaticText" + name: "Keep and reuse the pass until it expires" + - role: "StaticText" + name: "Applies to" + - role: "StaticText" + name: "All purchases" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Edit" + - role: "StaticText" + name: "Pass validity period" + - role: "StaticText" + name: "Up to 30 days" + - role: "StaticText" + name: "Shared expiry dates" + - role: "StaticText" + name: "1 day" + - role: "StaticText" + name: "Start and end dates" + - role: "StaticText" + name: "Starts now, with no end date" + - role: "InlineTextBox" + name: "Passes issued in the same period " + - role: "InlineTextBox" + name: "expire together, which can shorten " + - role: "InlineTextBox" + name: "their usable time. Individual passes " + - role: "InlineTextBox" + name: "still expire when no end date is set." + - role: "InlineTextBox" + name: "Technical details" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Create pass" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Pass benefit" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Pass name" + - role: "InlineTextBox" + name: "Coffee pass" + - role: "InlineTextBox" + name: "Customer " + - role: "InlineTextBox" + name: "description" + - role: "InlineTextBox" + name: "Save 10% on every " + - role: "InlineTextBox" + name: "purchase." + - role: "InlineTextBox" + name: "Benefit" + - role: "InlineTextBox" + name: "10% off" + - role: "InlineTextBox" + name: "Using the pass" + - role: "InlineTextBox" + name: "Keep and reuse the " + - role: "InlineTextBox" + name: "pass until it expires" + - role: "InlineTextBox" + name: "Applies to" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Pass validity " + - role: "InlineTextBox" + name: "period" + - role: "InlineTextBox" + name: "Up to 30 days" + - role: "InlineTextBox" + name: "Shared expiry " + - role: "InlineTextBox" + name: "dates" + - role: "InlineTextBox" + name: "1 day" + - role: "InlineTextBox" + name: "Start and end " + - role: "InlineTextBox" + name: "dates" + - role: "InlineTextBox" + name: "Starts now, with no " + - role: "InlineTextBox" + name: "end date" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-review-pass-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-desktop.aria.yml @@ -0,0 +1,358 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=true" + - role: "dialog" + name: "Rounding mode" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "group" + name: "Rounding mode" + - role: "button" + name: "Done" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "Legend" + - role: "radio" + name: "Round down" + state: "checked=true" + - role: "radio" + name: "Round to nearest" + state: "checked=false" + - role: "radio" + name: "Round up" + state: "checked=false" + - role: "StaticText" + name: "Done" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "StaticText" + name: "Rounding mode" + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "Rounding mode" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-mobile.aria.yml @@ -0,0 +1,368 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=true" + - role: "dialog" + name: "Rounding mode" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "group" + name: "Rounding mode" + - role: "button" + name: "Done" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "Legend" + - role: "radio" + name: "Round down" + state: "checked=true" + - role: "radio" + name: "Round to nearest" + state: "checked=false" + - role: "radio" + name: "Round up" + state: "checked=false" + - role: "StaticText" + name: "Done" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "StaticText" + name: "Rounding mode" + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "Rounding mode" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-mode-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-desktop.aria.yml @@ -0,0 +1,364 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=true" + - role: "dialog" + name: "Rounding increment" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "LabelText" + - role: "textbox" + name: "Rounding increment" + state: "required=false" + - role: "StaticText" + name: "CHF" + - role: "paragraph" + - role: "button" + name: "Done" + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "StaticText" + name: "Rounding increment" + - role: "generic" + - role: "InlineTextBox" + name: "CHF" + - role: "StaticText" + name: "Currency units, for example 0.01 or 0.05." + - role: "StaticText" + name: "Done" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Rounding increment" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Currency units, for example 0.01 or 0.05." + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "0.01" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-mobile.aria.yml @@ -0,0 +1,374 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=true" + - role: "dialog" + name: "Rounding increment" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "LabelText" + - role: "textbox" + name: "Rounding increment" + state: "required=false" + - role: "StaticText" + name: "CHF" + - role: "paragraph" + - role: "button" + name: "Done" + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "StaticText" + name: "Rounding increment" + - role: "generic" + - role: "InlineTextBox" + name: "CHF" + - role: "StaticText" + name: "Currency units, for example 0.01 or 0.05." + - role: "StaticText" + name: "Done" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" + - role: "InlineTextBox" + name: "Rounding increment" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Currency units, for example 0.01 or 0.05." + - role: "InlineTextBox" + name: "Done" + - role: "InlineTextBox" + name: "0.01" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-precision-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-desktop.aria.yml @@ -0,0 +1,334 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount " + - role: "InlineTextBox" + name: "off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered without " + - role: "InlineTextBox" + name: "selecting products." + - role: "InlineTextBox" + name: "Purchases with matching products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-mobile.aria.yml @@ -0,0 +1,344 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Customer reward" + - role: "region" + name: "Customer reward" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "generic" + - role: "group" + name: "Customer reward" + - role: "group" + name: "Which purchases can use this reward?" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "StaticText" + name: "Customer reward" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "group" + name: "Number of discount stamps needed" + - role: "LabelText" + - role: "textbox" + name: "Discount percentage" + state: "required=false" + - role: "StaticText" + name: "rounding" + - role: "group" + name: "Rounding mode" + - role: "StaticText" + name: "in steps of" + - role: "group" + name: "Rounding increment" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "StaticText" + name: "Customer reward" + - role: "radio" + name: "No reward yet" + state: "checked=false" + - role: "StaticText" + name: "No reward yet" + - role: "radio" + name: "Percentage off" + state: "checked=true" + - role: "StaticText" + name: "Percentage off" + - role: "radio" + name: "Fixed amount off" + state: "checked=false" + - role: "StaticText" + name: "Fixed amount off" + - role: "radio" + name: "Free item" + state: "checked=false" + - role: "StaticText" + name: "Free item" + - role: "Legend" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "LabelText" + - role: "StaticText" + name: "Discount percentage" + - role: "generic" + - role: "InlineTextBox" + name: "rounding" + - role: "button" + name: "Rounding mode: down" + state: "expanded=false" + - role: "InlineTextBox" + name: "in steps of" + - role: "button" + name: "Rounding increment: 0.01" + state: "expanded=false" + - role: "StaticText" + name: "Which purchases can use this reward?" + - role: "radio" + name: "All purchases" + state: "checked=true" + - role: "StaticText" + name: "All purchases" + - role: "StaticText" + name: "Also applies to purchases entered without selecting products." + - role: "radio" + name: "Purchases with matching products" + state: "checked=false" + - role: "StaticText" + name: "Purchases with matching products" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "No reward yet" + - role: "InlineTextBox" + name: "Percentage off" + - role: "InlineTextBox" + name: "Fixed amount off" + - role: "InlineTextBox" + name: "Free item" + - role: "StaticText" + name: "Number of discount stamps needed" + - role: "radio" + name: "5" + state: "checked=true" + - role: "generic" + - role: "radio" + name: "10" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "15" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "20" + state: "checked=false" + - role: "generic" + - role: "radio" + name: "Custom" + state: "checked=false" + - role: "generic" + - role: "InlineTextBox" + name: "Discount percentage" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "down" + - role: "StaticText" + name: "0.01" + - role: "InlineTextBox" + name: "Which purchases can use this " + - role: "InlineTextBox" + name: "reward?" + - role: "InlineTextBox" + name: "All purchases" + - role: "InlineTextBox" + name: "Also applies to purchases entered " + - role: "InlineTextBox" + name: "without selecting products." + - role: "InlineTextBox" + name: "Purchases with matching " + - role: "InlineTextBox" + name: "products" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Number of discount stamps needed" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "10" + - role: "StaticText" + name: "15" + - role: "StaticText" + name: "20" + - role: "StaticText" + name: "Custom" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "down" + - role: "InlineTextBox" + name: "0.01" + - role: "InlineTextBox" + name: "Cancel" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "10" + - role: "InlineTextBox" + name: "15" + - role: "InlineTextBox" + name: "20" + - role: "InlineTextBox" + name: "Custom" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-rounding-sentence-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-desktop.aria.yml @@ -0,0 +1,290 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "group" + name: "What would you like to offer?" + - role: "LabelText" + - role: "textbox" + name: "Discount stamp name *" + state: "required=true" + - role: "StaticText" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "LabelText" + - role: "textbox" + name: "Description *" + state: "required=true" + - role: "paragraph" + - role: "region" + name: "Technical identifier" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "StaticText" + name: "Details" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "Legend" + - role: "LabelText" + name: "Discount stamps" + - role: "LabelText" + name: "Pass" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "InlineTextBox" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "StaticText" + name: "Description" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not configure it." + - role: "heading" + name: "Technical identifier" + - role: "button" + name: "Hide advanced options" + state: "expanded=true" + - role: "generic" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "InlineTextBox" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "radio" + name: "Discount stamps" + state: "checked=true" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Customers collect discount stamps in their wallet and exchange them for a reward." + - role: "radio" + name: "Pass" + state: "checked=false" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Customers keep their pass and can reuse it until it expires." + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "Description" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not " + - role: "InlineTextBox" + name: "configure it." + - role: "StaticText" + name: "Technical identifier" + - role: "StaticText" + name: "Hide advanced options" + - role: "LabelText" + - role: "textbox" + name: "Identifier (ID)" + state: "required=false" + - role: "paragraph" + - role: "generic" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Customers collect discount stamps in their " + - role: "InlineTextBox" + name: "wallet and exchange them for a reward." + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Customers keep their pass and can reuse it until " + - role: "InlineTextBox" + name: "it expires." + - role: "InlineTextBox" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "Technical identifier" + - role: "InlineTextBox" + name: "Hide advanced options" + - role: "StaticText" + name: "Identifier (ID)" + - role: "generic" + - role: "StaticText" + name: "Used by connected software. Keep the suggested value unless your integration needs a specific identifier. Cannot be changed later." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Identifier (ID)" + - role: "StaticText" + name: "token_coffee_discount_stamps" + - role: "InlineTextBox" + name: "Used by connected software. Keep the suggested value unless your integration needs a specific identifier. Cannot be " + - role: "InlineTextBox" + name: "changed later." + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "token_coffee_discount_stamps" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-mobile.aria.yml @@ -0,0 +1,312 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "group" + name: "What would you like to offer?" + - role: "LabelText" + - role: "textbox" + name: "Discount stamp name *" + state: "required=true" + - role: "StaticText" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "LabelText" + - role: "textbox" + name: "Description *" + state: "required=true" + - role: "paragraph" + - role: "region" + name: "Technical identifier" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "StaticText" + name: "Details" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "Legend" + - role: "LabelText" + name: "Discount stamps" + - role: "LabelText" + name: "Pass" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "InlineTextBox" + name: "Customers see this discount stamp name " + - role: "InlineTextBox" + name: "when paying and in their wallets." + - role: "StaticText" + name: "Description" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not configure it." + - role: "heading" + name: "Technical identifier" + - role: "button" + name: "Hide advanced options" + state: "expanded=true" + - role: "generic" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "InlineTextBox" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "radio" + name: "Discount stamps" + state: "checked=true" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Customers collect discount stamps in their wallet and exchange them for a reward." + - role: "radio" + name: "Pass" + state: "checked=false" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Customers keep their pass and can reuse it until it expires." + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "StaticText" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "Description" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Shown to customers. The settings below " + - role: "InlineTextBox" + name: "determine the actual reward or access; " + - role: "InlineTextBox" + name: "writing a description does not configure it." + - role: "StaticText" + name: "Technical identifier" + - role: "StaticText" + name: "Hide advanced options" + - role: "LabelText" + - role: "textbox" + name: "Identifier (ID)" + state: "required=false" + - role: "paragraph" + - role: "generic" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Customers collect discount " + - role: "InlineTextBox" + name: "stamps in their wallet and " + - role: "InlineTextBox" + name: "exchange them for a reward." + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Customers keep their pass and " + - role: "InlineTextBox" + name: "can reuse it until it expires." + - role: "InlineTextBox" + name: "Coffee discount stamps" + - role: "InlineTextBox" + name: "Technical " + - role: "InlineTextBox" + name: "identifier" + - role: "InlineTextBox" + name: "Hide advanced " + - role: "InlineTextBox" + name: "options" + - role: "StaticText" + name: "Identifier (ID)" + - role: "generic" + - role: "StaticText" + name: "Used by connected software. Keep the suggested value unless your integration needs a specific identifier. Cannot be changed later." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Identifier (ID)" + - role: "StaticText" + name: "token_coffee_discount_stamps" + - role: "InlineTextBox" + name: "Used by connected software. Keep the " + - role: "InlineTextBox" + name: "suggested value unless your integration " + - role: "InlineTextBox" + name: "needs a specific identifier. Cannot be " + - role: "InlineTextBox" + name: "changed later." + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "token_coffee_discount_stamps" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-technical-identifier-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-validation-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-validation-mobile.aria.yml @@ -0,0 +1,304 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "group" + name: "What would you like to offer?" + - role: "LabelText" + - role: "textbox" + name: "Discount stamp name *" + state: "required=true" + - role: "paragraph" + - role: "StaticText" + name: "Customers see this discount stamp name when paying and in their wallets." + - role: "LabelText" + - role: "textbox" + name: "Description *" + state: "required=true" + - role: "paragraph" + - role: "region" + name: "Technical identifier" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "StaticText" + name: "Details" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "Legend" + - role: "LabelText" + name: "Discount stamps" + - role: "LabelText" + name: "Pass" + - role: "StaticText" + name: "Discount stamp name" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Enter a name customers will recognize." + - role: "InlineTextBox" + name: "Customers see this discount stamp name " + - role: "InlineTextBox" + name: "when paying and in their wallets." + - role: "StaticText" + name: "Description" + - role: "StaticText" + name: " " + - role: "StaticText" + name: "*" + - role: "generic" + - role: "StaticText" + name: "Shown to customers. The settings below determine the actual reward or access; writing a description does not configure it." + - role: "heading" + name: "Technical identifier" + - role: "button" + name: "Show advanced options" + state: "expanded=false" + - role: "alert" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "InlineTextBox" + name: "Details" + - role: "StaticText" + name: "What would you like to offer?" + - role: "radio" + name: "Discount stamps" + state: "checked=true" + - role: "StaticText" + name: "Discount stamps" + - role: "StaticText" + name: "Customers collect discount stamps in their wallet and exchange them for a reward." + - role: "radio" + name: "Pass" + state: "checked=false" + - role: "StaticText" + name: "Pass" + - role: "StaticText" + name: "Customers keep their pass and can reuse it until it expires." + - role: "InlineTextBox" + name: "Discount stamp name" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Enter a name customers will " + - role: "InlineTextBox" + name: "recognize." + - role: "InlineTextBox" + name: "Description" + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "*" + - role: "InlineTextBox" + name: "Shown to customers. The settings below " + - role: "InlineTextBox" + name: "determine the actual reward or access; " + - role: "InlineTextBox" + name: "writing a description does not configure it." + - role: "StaticText" + name: "Technical identifier" + - role: "StaticText" + name: "Show advanced options" + - role: "generic" + - role: "button" + name: "Dismiss error" + - role: "generic" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "What would you like to offer?" + - role: "InlineTextBox" + name: "Discount stamps" + - role: "InlineTextBox" + name: "Customers collect discount " + - role: "InlineTextBox" + name: "stamps in their wallet and " + - role: "InlineTextBox" + name: "exchange them for a reward." + - role: "InlineTextBox" + name: "Pass" + - role: "InlineTextBox" + name: "Customers keep their pass and " + - role: "InlineTextBox" + name: "can reuse it until it expires." + - role: "InlineTextBox" + name: "Technical " + - role: "InlineTextBox" + name: "identifier" + - role: "InlineTextBox" + name: "Show advanced " + - role: "InlineTextBox" + name: "options" + - role: "StaticText" + name: "Enter a name customers will recognize." + - role: "StaticText" + name: "✕" + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Enter a name customers will " + - role: "InlineTextBox" + name: "recognize." + - role: "InlineTextBox" + name: "✕" + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-validation-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-validation-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-desktop.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-desktop.aria.yml @@ -0,0 +1,241 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Validity" + - role: "LabelText" + - role: "combobox" + name: "Discount stamp validity period" + state: "expanded=false" + - role: "paragraph" + - role: "button" + name: "Shared expiry dates: 1 day" + state: "expanded=false" + - role: "region" + name: "Start and end dates (optional)" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "list" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "MenuListPopup" + - role: "StaticText" + name: "Discount stamps share expiry dates. The time available to use a discount stamp can be shorter than this period." + - role: "StaticText" + name: "Shared expiry dates: 1 day" + - role: "heading" + name: "Start and end dates (optional)" + - role: "generic" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Discount stamp validity period" + - role: "option" + name: "1 Day" + state: "selected=false" + - role: "option" + name: "7 Days" + state: "selected=false" + - role: "option" + name: "30 Days" + state: "selected=true" + - role: "option" + name: "90 Days (Quarter)" + state: "selected=false" + - role: "option" + name: "365 Days (1 Year)" + state: "selected=false" + - role: "InlineTextBox" + name: "Discount stamps share expiry dates. The time available to use a " + - role: "InlineTextBox" + name: "discount stamp can be shorter than this period." + - role: "InlineTextBox" + name: "Shared expiry dates: 1 day" + - role: "StaticText" + name: "Start and end dates (optional)" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Start and end dates (optional)" + - role: "checkbox" + name: "Set a start date" + state: "checked=false" + - role: "StaticText" + name: "Start date" + - role: "StaticText" + name: "Starts now unless you choose a date." + - role: "checkbox" + name: "Set an end date" + state: "checked=false" + - role: "StaticText" + name: "End date" + - role: "StaticText" + name: "By default, there is no end date." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Start date" + - role: "InlineTextBox" + name: "Starts now unless you choose a date." + - role: "InlineTextBox" + name: "End date" + - role: "InlineTextBox" + name: "By default, there is no end date." + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-desktop.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-desktop.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-mobile.aria.yml b/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-mobile.aria.yml @@ -0,0 +1,253 @@ +# Chrome: Google Chrome 151.0.7922.108 +# Locale/timezone/time: pinned per scenario / Europe/Berlin / 2026-08-12T10:00:00.000Z +- role: "RootWebArea" + name: "Taler Merchant Portal" + - role: "generic" + - role: "main" + - role: "heading" + name: "Integration & Advanced › Create Discount Stamps" + - role: "sectionheader" + - role: "form" + - role: "button" + name: "Integration & Advanced" + - role: "generic" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "button" + name: "← Discounts & Passes" + - role: "heading" + name: "Create Discount Stamps" + - role: "StaticText" + name: "Choose which purchases earn discount stamps, the reward customers receive, and when discount stamps expire." + - role: "navigation" + name: "Setup progress" + - role: "heading" + name: "Validity" + - role: "LabelText" + - role: "combobox" + name: "Discount stamp validity period" + state: "expanded=false" + - role: "paragraph" + - role: "button" + name: "Shared expiry dates: 1 day" + state: "expanded=false" + - role: "region" + name: "Start and end dates (optional)" + - role: "generic" + - role: "StaticText" + name: "Integration & Advanced" + - role: "StaticText" + name: "›" + - role: "InlineTextBox" + name: "Create " + - role: "InlineTextBox" + name: "Discount Stamps" + - role: "StaticText" + name: "← " + - role: "StaticText" + name: "Discounts & Passes" + - role: "StaticText" + name: "Create Discount Stamps" + - role: "InlineTextBox" + name: "Choose which purchases earn discount " + - role: "InlineTextBox" + name: "stamps, the reward customers receive, and " + - role: "InlineTextBox" + name: "when discount stamps expire." + - role: "list" + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "Discount stamp validity period" + - role: "MenuListPopup" + - role: "StaticText" + name: "Discount stamps share expiry dates. The time available to use a discount stamp can be shorter than this period." + - role: "StaticText" + name: "Shared expiry dates: 1 day" + - role: "heading" + name: "Start and end dates (optional)" + - role: "generic" + - role: "generic" + - role: "InlineTextBox" + name: "Integration & Advanced" + - role: "InlineTextBox" + name: "›" + - role: "InlineTextBox" + name: "← " + - role: "InlineTextBox" + name: "Discounts & Passes" + - role: "InlineTextBox" + name: "Create Discount " + - role: "InlineTextBox" + name: "Stamps" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "listitem" + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "Discount stamp validity period" + - role: "option" + name: "1 Day" + state: "selected=false" + - role: "option" + name: "7 Days" + state: "selected=false" + - role: "option" + name: "30 Days" + state: "selected=true" + - role: "option" + name: "90 Days (Quarter)" + state: "selected=false" + - role: "option" + name: "365 Days (1 Year)" + state: "selected=false" + - role: "InlineTextBox" + name: "Discount stamps share expiry dates. The time " + - role: "InlineTextBox" + name: "available to use a discount stamp can be " + - role: "InlineTextBox" + name: "shorter than this period." + - role: "InlineTextBox" + name: "Shared expiry dates: 1 day" + - role: "StaticText" + name: "Start and end dates (optional)" + - role: "LabelText" + - role: "LabelText" + - role: "generic" + - role: "button" + name: "Back" + - role: "button" + name: "Continue" + - role: "button" + name: "1. Details" + - role: "button" + name: "2. Collecting discount stamps" + - role: "button" + name: "3. Customer reward" + - role: "button" + name: "4. Validity" + - role: "button" + name: "5. Review" + - role: "InlineTextBox" + name: "Start and end dates (optional)" + - role: "checkbox" + name: "Set a start date" + state: "checked=false" + - role: "StaticText" + name: "Start date" + - role: "StaticText" + name: "Starts now unless you choose a date." + - role: "checkbox" + name: "Set an end date" + state: "checked=false" + - role: "StaticText" + name: "End date" + - role: "StaticText" + name: "By default, there is no end date." + - role: "button" + name: "Cancel" + - role: "StaticText" + name: "Back" + - role: "StaticText" + name: "Continue" + - role: "StaticText" + name: "1" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Details" + - role: "StaticText" + name: "2" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Collecting discount stamps" + - role: "StaticText" + name: "3" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Customer reward" + - role: "StaticText" + name: "4" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Validity" + - role: "StaticText" + name: "5" + - role: "StaticText" + name: "." + - role: "StaticText" + name: " " + - role: "StaticText" + name: "Review" + - role: "InlineTextBox" + name: "Start date" + - role: "InlineTextBox" + name: "Starts now unless you choose a " + - role: "InlineTextBox" + name: "date." + - role: "InlineTextBox" + name: "End date" + - role: "InlineTextBox" + name: "By default, there is no end date." + - role: "StaticText" + name: "Cancel" + - role: "InlineTextBox" + name: "Back" + - role: "InlineTextBox" + name: "Continue" + - role: "InlineTextBox" + name: "1" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Details" + - role: "InlineTextBox" + name: "2" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Collecting discount stamps" + - role: "InlineTextBox" + name: "3" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Customer reward" + - role: "InlineTextBox" + name: "4" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Validity" + - role: "InlineTextBox" + name: "5" + - role: "InlineTextBox" + name: "." + - role: "InlineTextBox" + name: " " + - role: "InlineTextBox" + name: "Review" + - role: "InlineTextBox" + name: "Cancel" diff --git a/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-mobile.webp b/packages/taler-merchant-webui/visual/baselines/token-wizard-validity-mobile.webp Binary files differ. diff --git a/packages/taler-merchant-webui/visual/run.mjs b/packages/taler-merchant-webui/visual/run.mjs @@ -9,9 +9,18 @@ import { chromeVersion, fixedTime, fontFamily, - scenarios, + scenarios as allScenarios, } from "./scenarios.mjs"; +const scenarioPrefix = process.argv + .find((arg) => arg.startsWith("--scenario-prefix=")) + ?.split("=", 2)[1]; +const scenarios = scenarioPrefix + ? allScenarios.filter((scenario) => scenario.id.startsWith(scenarioPrefix)) + : allScenarios; +if (scenarios.length === 0) + throw new Error("No visual scenarios matched the prefix"); + const here = path.dirname(new URL(import.meta.url).pathname); const pkg = path.dirname(here); const expectedDir = path.join(here, "baselines"); @@ -194,9 +203,12 @@ async function captureScenario(scenario, page) { scenario.locale, fixedTime, ); - await page.goto(`${origin}/index.html#/storybook/${scenario.story}`, { - waitUntil: "networkidle0", - }); + await page.goto( + `${origin}/index.html#/storybook/${scenario.story}${scenario.dataset ? `?dataset=${encodeURIComponent(scenario.dataset)}` : ""}`, + { + waitUntil: "networkidle0", + }, + ); await page.addStyleTag({ content: ` *, *::before, *::after { @@ -236,6 +248,32 @@ async function captureScenario(scenario, page) { } } } + for (const action of scenario.actions ?? []) { + await page.waitForSelector(action.selector); + if (action.value !== undefined) { + await page.$eval( + action.selector, + (element, value) => { + element.value = value; + element.dispatchEvent(new Event("input", { bubbles: true })); + element.dispatchEvent(new Event("change", { bubbles: true })); + }, + action.value, + ); + } else { + await page.$eval(action.selector, (element) => + element.scrollIntoView({ block: "center" }), + ); + await page.click(action.selector); + } + // Allow Preact's scheduled render and focus effects to finish before the next action. + await page.evaluate( + () => + new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(resolve)), + ), + ); + } if (scenario.focus) { await page.$eval(scenario.focus, (element) => element.scrollIntoView({ block: "start" }), @@ -253,7 +291,17 @@ async function captureScenario(scenario, page) { }) .map((item) => item.textContent?.trim()), ); - if (banners.length) + if ( + scenario.expectedError && + !banners.some((banner) => banner?.includes(scenario.expectedError)) + ) + throw new Error(`${scenario.id}: expected validation error was not shown`); + if ( + banners.some( + (banner) => + !scenario.expectedError || !banner?.includes(scenario.expectedError), + ) + ) throw new Error( `${scenario.id}: unexpected error banner: ${banners.join(" | ")}`, ); diff --git a/packages/taler-merchant-webui/visual/scenarios.mjs b/packages/taler-merchant-webui/visual/scenarios.mjs @@ -2,7 +2,310 @@ export const chromeVersion = "Google Chrome 151.0.7922.108"; export const fixedTime = "2026-08-12T10:00:00.000Z"; export const fontFamily = "DejaVu Sans"; +const tokenReviewActions = [ + { selector: "#sub_name_input", value: "Coffee discount stamps" }, + { + selector: "#sub_desc_input", + value: "Collect five discount stamps for 10% off your next purchase.", + }, + { selector: 'form button[type="submit"]' }, + { + selector: + '[aria-labelledby="earning_rules_heading"] [aria-label="All purchases"]', + }, + { selector: 'form button[type="submit"]' }, + { selector: "#sub_discount_percentage", value: "10" }, + { selector: 'label:has(> input[name="stamp_count"][value="5"])' }, + { + selector: + '[aria-labelledby="redemption_rules_heading"] [aria-label="All purchases"]', + }, + { selector: 'form button[type="submit"]' }, + { selector: 'form button[type="submit"]' }, +]; + export const scenarios = [ + ...["desktop", "mobile"].flatMap((size) => [ + { + id: `token-selector-create-category-${size}`, + story: "ui-token-selector", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1100 : 844, + actions: [ + { selector: 'section:nth-child(1) button[aria-haspopup="dialog"]' }, + { selector: '[role="combobox"]', value: "Desserts" }, + ], + }, + { + id: `token-wizard-earning-error-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + ...tokenReviewActions.slice(0, 3), + { selector: 'form button[type="submit"]' }, + ], + expectedError: + "Select at least one product category or inventory product.", + focus: size === "mobile" ? '[data-field="issuance-products"]' : undefined, + }, + ]), + ...["desktop", "mobile"].flatMap((size) => [ + { + id: `token-wizard-validity-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: 1100, + actions: tokenReviewActions.slice(0, 9), + focus: "#token-step-heading", + }, + { + id: `token-wizard-technical-identifier-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: 1100, + actions: [ + tokenReviewActions[0], + { selector: 'button[aria-controls="token-advanced-options"]' }, + ], + focus: size === "mobile" ? "#token-advanced-heading" : undefined, + }, + ]), + ...["desktop", "mobile"].flatMap((size) => + ["sentence", "mode", "precision"].map((editor) => ({ + id: `token-wizard-rounding-${editor}-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + ...tokenReviewActions.slice(0, 8), + ...(editor === "sentence" + ? [] + : [ + { + selector: + editor === "mode" + ? '[data-percentage-editor] button[aria-label^="Rounding mode:"]' + : '[data-percentage-editor] button[aria-label^="Rounding increment:"]', + }, + ]), + ], + focus: + size === "mobile" && editor === "sentence" + ? "[data-percentage-editor]" + : undefined, + })), + ), + ...["desktop", "mobile"].flatMap((size) => [ + { + id: `token-wizard-custom-stamp-count-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + ...tokenReviewActions.slice(0, 8), + { selector: 'label:has(> input[name="stamp_count"][value="custom"])' }, + { selector: "#sub_required_tokens", value: "7" }, + ], + focus: + size === "mobile" ? '[data-field="sub_required_tokens"]' : undefined, + }, + { + id: `token-wizard-product-error-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + ...tokenReviewActions.slice(0, 7), + { selector: 'input[name="token-redemption-scope"][value="selected"]' }, + { selector: 'form button[type="submit"]' }, + ], + expectedError: + "Select at least one product category or inventory product.", + focus: + size === "mobile" ? '[data-field="redemption-products"]' : undefined, + }, + ]), + ...["desktop", "mobile"].map((size) => ({ + id: `token-wizard-no-reward-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1000 : 844, + actions: [ + ...tokenReviewActions.slice(0, 5), + { selector: 'input[name="discount_type"][value="none"]' }, + ], + focus: + size === "mobile" + ? 'label:has(> input[name="discount_type"][value="none"])' + : undefined, + })), + ...["desktop", "mobile"].map((size) => ({ + id: `token-wizard-free-item-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + ...tokenReviewActions.slice(0, 5), + { selector: 'input[name="discount_type"][value="free_item"]' }, + { selector: 'label:has(> input[name="stamp_count"][value="5"])' }, + ], + focus: + size === "mobile" + ? 'label:has(> input[name="discount_type"][value="free_item"])' + : undefined, + })), + ...["desktop", "mobile"].map((size) => ({ + id: `token-wizard-product-scope-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1100 : 844, + actions: [ + ...tokenReviewActions.slice(0, 3), + { selector: 'input[name="token-issuance-scope"][value="selected"]' }, + ], + })), + ...["desktop", "mobile"].flatMap((size) => [ + { + id: `token-selector-${size}`, + story: "ui-token-selector", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1100 : 844, + actions: [ + { selector: 'section:nth-child(2) button[aria-haspopup="dialog"]' }, + ], + }, + { + id: `token-selector-chips-${size}`, + story: "ui-token-selector", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1100 : 844, + }, + { + id: `token-selector-unavailable-${size}`, + story: "ui-token-selector", + dataset: "unavailable", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1100 : 844, + }, + ]), + { + id: "token-management-desktop", + story: "integration-rewards-populated", + locale: "en-US", + width: 1440, + height: 1000, + }, + { + id: "token-management-mobile", + story: "integration-rewards-populated", + locale: "en-US", + width: 390, + height: 844, + }, + { + id: "token-editor-desktop", + story: "integration-create-subscription", + locale: "en-US", + width: 1440, + height: 1100, + }, + { + id: "token-editor-mobile", + story: "integration-create-subscription", + locale: "en-US", + width: 390, + height: 844, + }, + { + id: "token-wizard-basics-desktop", + story: "integration-token-wizard", + locale: "en-US", + width: 1440, + height: 1000, + }, + { + id: "token-wizard-validation-mobile", + expectedError: "Enter a name customers will recognize.", + story: "integration-token-wizard", + locale: "en-US", + width: 390, + height: 844, + actions: [{ selector: 'form button[type="submit"]' }], + }, + { + id: "token-wizard-review-desktop", + story: "integration-token-wizard", + locale: "en-US", + width: 1440, + height: 1300, + actions: tokenReviewActions, + }, + { + id: "token-wizard-review-mobile", + story: "integration-token-wizard", + locale: "en-US", + width: 390, + height: 844, + actions: tokenReviewActions, + focus: "#token-step-heading", + }, + ...["desktop", "mobile"].flatMap((size) => [ + { + id: `token-wizard-review-free-item-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + tokenReviewActions[0], + { + selector: "#sub_desc_input", + value: "Collect five discount stamps for a free coffee.", + }, + ...tokenReviewActions.slice(2, 5), + { selector: 'input[name="discount_type"][value="free_item"]' }, + { selector: 'label:has(> input[name="stamp_count"][value="5"])' }, + { selector: 'button[aria-haspopup="dialog"]' }, + { selector: '[role="option"]' }, + { selector: "#token-step-heading" }, + { selector: 'form button[type="submit"]' }, + { selector: 'form button[type="submit"]' }, + ], + focus: size === "mobile" ? "#token-review-benefit" : undefined, + }, + { + id: `token-wizard-review-pass-${size}`, + story: "integration-token-wizard", + locale: "en-US", + width: size === "desktop" ? 1440 : 390, + height: size === "desktop" ? 1300 : 844, + actions: [ + { selector: 'input[name="token-kind"][value="subscription"]' }, + { selector: "#sub_name_input", value: "Coffee pass" }, + { selector: "#sub_desc_input", value: "Save 10% on every purchase." }, + { selector: 'form button[type="submit"]' }, + { selector: "#sub_discount_percentage", value: "10" }, + { selector: 'input[name="token-redemption-scope"][value="any"]' }, + { selector: 'form button[type="submit"]' }, + { selector: 'form button[type="submit"]' }, + ], + focus: size === "mobile" ? "#token-review-benefit" : undefined, + }, + ]), { id: "signup-desktop", story: "auth-signup",