<workflowRun _class='org.jenkinsci.plugins.workflow.job.WorkflowRun'><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>13</buildNumber><marked><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><branch><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><branch><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><branch><SHA1>595e2c473bdb201384ea147d00098a5c8786b811</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'><environment><GIT_SHA>595e2c4</GIT_SHA><RELEASE_DIR>/var/www/blut24.com/web/releases/13-595e2c4</RELEASE_DIR><RELEASE_ID>13-595e2c4</RELEASE_ID></environment></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.younex.de/job/blut24-landing/13/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/job/blut24-landing/changes</changesUrl><displayUrl>https://jenkins.younex.de/job/blut24-landing/13/</displayUrl><testsUrl>https://jenkins.younex.de/job/blut24-landing/13/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Checkout</restartableStage><restartableStage>Guard: main only</restartableStage><restartableStage>Ship source to target</restartableStage><restartableStage>Build, health-check and swap</restartableStage><restartableStage>Smoke test</restartableStage></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'><node _class='org.jenkinsci.plugins.workflow.graph.FlowStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.graph.FlowEndNode'></node></action><action></action><action></action><action></action><building>false</building><displayName>#13 595e2c4</displayName><duration>26227</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #13 595e2c4</fullDisplayName><id>13</id><keepLog>false</keepLog><number>13</number><queueId>5469</queueId><result>SUCCESS</result><timestamp>1785239626779</timestamp><url>https://jenkins.younex.de/job/blut24-landing/13/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/LangFlag.vue</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>app/locales/de.ts</affectedPath><affectedPath>app/components/RegistrationDialog.vue</affectedPath><affectedPath>app/components/SiteHeader.vue</affectedPath><affectedPath>app/locales/en.ts</affectedPath><commitId>595e2c473bdb201384ea147d00098a5c8786b811</commitId><timestamp>1785239613000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Language switch becomes a borderless flag menu; free-of-charge block moves into the dialog

The switch showed both languages permanently inside a bordered group, spending
header width and visual weight on a control almost nobody touches. It is now a
borderless trigger carrying only the CURRENT language — flag, code and a caret —
that opens a small menu with the alternatives and a tick against the active one.
Chrome appears only on hover, focus or open.

Still two real buttons, so the site-wide focus ring and keyboard operation are
unchanged; aria-haspopup/aria-expanded describe the menu and each entry carries
aria-current. The menu closes on outside click, on Escape and after choosing, and
both listeners are attached only while it is open and removed on unmount.

Flags moved into their own LangFlag component: the Union Jack needs a clipPath and
the glyph now renders up to three times on one page, so a shared literal id would
have made every instance clip against the first one's rect. Drawn as SVG rather
than flag emoji, which do not render as flags on Windows at all.

The free-of-charge block moves out of the hero and into the foot of the
registration dialog, after the form — the cost question is what someone asks once
they have seen how much they are being asked for. Its copy moved from hero.* to
dialog.* to match. The dialog's header subtitle said the same thing directly under
a heading that already reads "Kostenlos … registrieren", so it is dropped rather
than repeated twice in one panel.

Hero grid switched from items-center to items-start, so the "Blutkonserven-Plattform"
eyebrow and the top edge of the stock-matrix card now share a top line.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 13:53:33 +0200</date><id>595e2c473bdb201384ea147d00098a5c8786b811</id><msg>Language switch becomes a borderless flag menu; free-of-charge block moves into the dialog</msg><path><editType>add</editType><file>app/components/LangFlag.vue</file></path><path><editType>edit</editType><file>app/locales/de.ts</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>app/locales/en.ts</file></path><path><editType>edit</editType><file>app/components/RegistrationDialog.vue</file></path><path><editType>edit</editType><file>app/components/SiteHeader.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit><inProgress>false</inProgress><nextBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>14</buildNumber><marked><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><branch><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><branch><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><branch><SHA1>49c9f2a18725f35f7caed718f3cd9669ca7b5048</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#14 49c9f2a</displayName><duration>27282</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #14 49c9f2a</fullDisplayName><id>14</id><keepLog>false</keepLog><number>14</number><queueId>5471</queueId><result>SUCCESS</result><timestamp>1785247787466</timestamp><url>https://jenkins.younex.de/job/blut24-landing/14/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.env.example</affectedPath><affectedPath>server/utils/mail.ts</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><affectedPath>server/api/registration/submit.post.ts</affectedPath><affectedPath>server/api/registration/confirm.post.ts</affectedPath><affectedPath>app/components/SectionRegistration.vue</affectedPath><affectedPath>README.md</affectedPath><affectedPath>app/locales/en.ts</affectedPath><affectedPath>server/utils/registrationTypes.ts</affectedPath><affectedPath>app/locales/de.ts</affectedPath><affectedPath>scripts/test-registration.mjs</affectedPath><affectedPath>server/utils/registrationValidation.ts</affectedPath><affectedPath>app/composables/useRegistrationDialog.ts</affectedPath><affectedPath>server/utils/registrationDb.ts</affectedPath><affectedPath>server/utils/erpOnboarding.ts</affectedPath><affectedPath>app/components/RegistrationForm.vue</affectedPath><affectedPath>server/utils/i18n.ts</affectedPath><commitId>49c9f2a18725f35f7caed718f3cd9669ca7b5048</commitId><timestamp>1785247772000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Fixes
</comment><date>2026-07-28 16:09:32 +0200</date><id>49c9f2a18725f35f7caed718f3cd9669ca7b5048</id><msg>Fixes</msg><path><editType>edit</editType><file>server/api/registration/confirm.post.ts</file></path><path><editType>edit</editType><file>server/utils/erpOnboarding.ts</file></path><path><editType>edit</editType><file>app/components/RegistrationForm.vue</file></path><path><editType>edit</editType><file>app/locales/de.ts</file></path><path><editType>edit</editType><file>.env.example</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>README.md</file></path><path><editType>add</editType><file>server/utils/registrationTypes.ts</file></path><path><editType>edit</editType><file>server/utils/registrationDb.ts</file></path><path><editType>edit</editType><file>scripts/test-registration.mjs</file></path><path><editType>edit</editType><file>server/api/registration/submit.post.ts</file></path><path><editType>edit</editType><file>app/composables/useRegistrationDialog.ts</file></path><path><editType>edit</editType><file>app/locales/en.ts</file></path><path><editType>edit</editType><file>server/utils/i18n.ts</file></path><path><editType>edit</editType><file>server/utils/registrationValidation.ts</file></path><path><editType>edit</editType><file>server/utils/mail.ts</file></path><path><editType>edit</editType><file>app/components/SectionRegistration.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>15</number><url>https://jenkins.younex.de/job/blut24-landing/15/</url></nextBuild><previousBuild><number>13</number><url>https://jenkins.younex.de/job/blut24-landing/13/</url></previousBuild></nextBuild><previousBuild><action _class='hudson.model.CauseAction'><cause _class='com.cloudbees.jenkins.GitHubPushCause'><shortDescription>Started by GitHub push by younex1</shortDescription></cause></action><action></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>12</buildNumber><marked><SHA1>992a7b175443cc5ffeadaac8c785d913ecc1b57d</SHA1><branch><SHA1>992a7b175443cc5ffeadaac8c785d913ecc1b57d</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>992a7b175443cc5ffeadaac8c785d913ecc1b57d</SHA1><branch><SHA1>992a7b175443cc5ffeadaac8c785d913ecc1b57d</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>992a7b175443cc5ffeadaac8c785d913ecc1b57d</SHA1><branch><SHA1>992a7b175443cc5ffeadaac8c785d913ecc1b57d</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/blut24-landing.git</remoteUrl><scmName></scmName></action><action></action><action _class='org.jenkinsci.plugins.workflow.cps.EnvActionImpl'></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#12 992a7b1</displayName><duration>27710</duration><estimatedDuration>28038</estimatedDuration><fullDisplayName>blut24-landing #12 992a7b1</fullDisplayName><id>12</id><keepLog>false</keepLog><number>12</number><queueId>5466</queueId><result>SUCCESS</result><timestamp>1785238671688</timestamp><url>https://jenkins.younex.de/job/blut24-landing/12/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/SiteHeader.vue</affectedPath><affectedPath>app/assets/css/main.css</affectedPath><affectedPath>app/components/SectionHero.vue</affectedPath><commitId>992a7b175443cc5ffeadaac8c785d913ecc1b57d</commitId><timestamp>1785238658000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Flag-led language switch; move the free-of-charge message under the stock matrix

The language toggle filled its active half with --color-blood-700 — the same red as
the primary "Registrieren" button — so two red elements sat side by side in the
header and the switch competed with the one action that matters. It is now
flag-led: the flag carries the meaning, selection is shown by saturation plus a
neutral tinted background, and red goes back to belonging to the CTA alone.

The DE/EN code stays beside each flag deliberately. A flag denotes a country
rather than a language, and the Union Jack for "English" is a convention rather
than a fact, so the text is what actually disambiguates; both buttons keep their
aria-label and gain a title.

The free-of-charge block moves out of the hero's left column to sit under the
stock matrix, so the reader meets it right after seeing what the product does
rather than beside the headline. Recoloured red to green: red is the blood and
brand colour and made a reassurance read like an alert. Green is the conventional
"no cost" signal and nothing else on the page uses it, so it stands out without
competing. Added as contrast-checked --color-free-* tokens rather than stock
emerald, matching how the rest of the palette is defined.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</comment><date>2026-07-28 13:37:38 +0200</date><id>992a7b175443cc5ffeadaac8c785d913ecc1b57d</id><msg>Flag-led language switch; move the free-of-charge message under the stock matrix</msg><path><editType>edit</editType><file>app/components/SiteHeader.vue</file></path><path><editType>edit</editType><file>app/components/SectionHero.vue</file></path><path><editType>edit</editType><file>app/assets/css/main.css</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit><inProgress>false</inProgress><nextBuild><number>13</number><url>https://jenkins.younex.de/job/blut24-landing/13/</url></nextBuild><previousBuild><number>11</number><url>https://jenkins.younex.de/job/blut24-landing/11/</url></previousBuild></previousBuild></workflowRun>