diff --git a/css/site-theme.css b/css/site-theme.css
index 1abbadc8a..48b59c9c2 100644
--- a/css/site-theme.css
+++ b/css/site-theme.css
@@ -209,3 +209,815 @@
padding-inline: var(--utrecht-button-padding-inline-start, 1.25em)
var(--utrecht-button-padding-inline-end, 1.25em);
}
+
+/*
+ * ============================================================================
+ * THE CHROME THE SCHOOL DESIGNS DRAW (site-chrome-follows-the-design).
+ *
+ * Everything below reads tokens only. The theme app's public bridge hands the
+ * site these, from whatever set the portal uses (thematiq
+ * brand-motif-on-portals):
+ *
+ * --cn-brand-stripe-* the motif: three bands or an image, and its
+ * inverse for a dark band. Unset for a set
+ * without a stripe: then nothing is drawn.
+ * --thematiq-accent-* the accent (current menu item, badges)
+ * --thematiq-badge-* a count badge
+ * --thematiq-logo-text-font-size 0 when the logo carries the name
+ * --thematiq-footer-legal-background-color the footer's bottom band
+ * --thematiq-hero-* a light hero, when the set draws one
+ *
+ * and site.php names the set's light logo (--nldesign-logo-inverse-url) and
+ * its emblem (--nldesign-emblem-url) as absolute addresses.
+ * ============================================================================
+ */
+
+/*
+ * THE MOTIF UNDER THE HEADER AND OVER THE FOOTER (G-01).
+ *
+ * Drawn as a pseudo-element, so the header and footer markup of every portal
+ * stays as it was and the motif costs the site's entry nothing. The height is
+ * the set's stripe height, and 0 for a set that declares no stripe: such a
+ * portal draws nothing here.
+ *
+ * Under the header the motif is the image when the set names one, else one
+ * line in the stripe's first colour: Zuiddrecht's header carries a solid red
+ * line (canvas v13), its three bands sit on the footer.
+ */
+.pq-site .pq-site__header .ac-header__navigation-secondary,
+.pq-site .pq-site__header .ac-header__navigation-main:only-child,
+.pq-site .ac-footer .pq-footer__band--content {
+ position: relative;
+}
+
+.pq-site .pq-site__header .ac-header__navigation-secondary::after,
+.pq-site
+ .pq-site__header:not(:has(.ac-header__navigation-secondary))
+ .ac-header__navigation-main::after {
+ content: '';
+ position: absolute;
+ inset-inline: 0;
+ inset-block-start: 100%;
+ z-index: 1;
+ block-size: var(--cn-brand-stripe-height, 0);
+ pointer-events: none;
+ background-image: var(
+ --cn-brand-stripe-image,
+ linear-gradient(
+ var(--cn-brand-stripe-color-1),
+ var(--cn-brand-stripe-color-1)
+ )
+ );
+ background-repeat: repeat-x;
+ background-size: auto 100%;
+}
+
+/* The motif hangs below the menu bar; the breadcrumb starts under it. */
+.pq-site .pq-site__header .ac-header__navigation-breadcrumb {
+ padding-block-start: var(--cn-brand-stripe-height, 0);
+}
+
+.pq-site .ac-footer .pq-footer__band--content::before {
+ --pq-stripe-first: var(--cn-brand-stripe-ratio-1, 1);
+ --pq-stripe-second: var(--cn-brand-stripe-ratio-2, 1);
+ --pq-stripe-total: calc(
+ var(--pq-stripe-first) + var(--pq-stripe-second) +
+ var(--cn-brand-stripe-ratio-3, 1)
+ );
+ --pq-stripe-stop-1: calc(var(--pq-stripe-first) / var(--pq-stripe-total) * 100%);
+ --pq-stripe-stop-2: calc(
+ (var(--pq-stripe-first) + var(--pq-stripe-second)) / var(--pq-stripe-total) *
+ 100%
+ );
+ content: '';
+ position: absolute;
+ inset-inline: 0;
+ inset-block-start: 0;
+ block-size: var(--cn-brand-stripe-height, 0);
+ pointer-events: none;
+ background-image: var(
+ --cn-brand-stripe-image-inverse,
+ linear-gradient(
+ to right,
+ var(--cn-brand-stripe-color-1) 0 var(--pq-stripe-stop-1),
+ var(--cn-brand-stripe-color-2) var(--pq-stripe-stop-1)
+ var(--pq-stripe-stop-2),
+ var(--cn-brand-stripe-color-3) var(--pq-stripe-stop-2) 100%
+ )
+ );
+ background-repeat: repeat-x;
+ background-size: auto 100%;
+}
+
+/*
+ * THE LOGO. A wordmark set (the logo carries the name) keeps the portal's
+ * title for screen readers only; the logo sits at the start of its box, so a
+ * wide wordmark lines up with the content column under it.
+ */
+.pq-site .ac-header__logo .logo-text {
+ font-size: var(
+ --thematiq-logo-text-font-size,
+ var(--tilburg-typography-font-size-3xl)
+ );
+}
+
+.pq-site .ac-footer__logo > .con-logo-container + span,
+.pq-site .ac-footer__logo > .con-logo-container + span > span {
+ font-size: var(--thematiq-logo-text-font-size, inherit);
+}
+
+/* With a wordmark the name block folds to nothing (0 times its size); a
+ * set without the token keeps it, 100 times its size being no limit. */
+.pq-site .ac-footer__logo > .con-logo-container + span {
+ max-block-size: calc(var(--thematiq-logo-text-font-size, 100) * 1em);
+ overflow: hidden;
+}
+
+.pq-site .con-logo-container.header,
+.pq-site .con-logo-container.footer {
+ background-position: 0 50%;
+}
+
+/*
+ * THE DESIGNED HEADER (G-02, G-03, G-07): logo, search, one way to the own
+ * area on a white bar, the menu on a bar under it, both on the content
+ * column. Only a portal that declares `headerSearch` or `accountLabel`.
+ */
+.pq-site .pq-site__header--designed .ac-header__navigation-main {
+ --navigation-bar-height: 96px;
+ border-block-end: 1px solid
+ var(--nldesign-color-border, var(--tilburg-line-border-color));
+ padding-inline: max(16px, calc((100% - 1232px) / 2));
+}
+
+.pq-site .pq-site__header--designed .ac-header__right-section {
+ margin-inline-end: 0;
+}
+
+.pq-site .pq-site__header--designed .ac-header__navigation-secondary .container {
+ max-inline-size: 1232px;
+ margin-inline: auto;
+ padding-inline: 16px;
+}
+
+.pq-site .pq-site__header--designed .ac-c-navigation__link-container {
+ position: relative;
+ padding-block: 14px;
+ padding-inline: 14px;
+}
+
+.pq-site .pq-site__header--designed .ac-c-navigation__label {
+ color: var(--nldesign-color-text, var(--tilburg-document-color));
+ font-size: 1.0625rem;
+ font-weight: 500;
+}
+
+/* The page on screen: bold, with a bar in the accent under it (in the
+ * primary for a set without an accent). */
+.pq-site .ac-header .ac-c-navigation__link-container[aria-current='page'] {
+ background-color: transparent;
+}
+
+.pq-site
+ .ac-header
+ .ac-c-navigation__link-container[aria-current='page']
+ .ac-c-navigation__label {
+ font-weight: 700;
+}
+
+.pq-site .ac-header .ac-c-navigation__link-container[aria-current='page']::after {
+ content: '';
+ position: absolute;
+ inset-inline: 0;
+ inset-block-end: 0;
+ block-size: 4px;
+ background-color: var(--thematiq-accent-color, var(--nldesign-color-primary));
+}
+
+.pq-site .ac-header .ac-c-navigation__li {
+ position: relative;
+}
+
+.pq-header-tools {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.pq-header-tools__search {
+ position: relative;
+ display: flex;
+}
+
+.pq-header-tools__input.utrecht-textbox {
+ inline-size: 240px;
+ block-size: 46px;
+ padding-inline: 16px 46px;
+ border: 1px solid
+ var(--nldesign-color-border-dark, var(--utrecht-textbox-border-color));
+ border-radius: var(
+ --nldesign-website-border-radius,
+ var(--utrecht-textbox-border-radius, 4px)
+ );
+ background-color: var(
+ --nldesign-color-background,
+ var(--utrecht-textbox-background-color)
+ );
+ color: var(--nldesign-color-text, var(--utrecht-textbox-color));
+ font: inherit;
+}
+
+.pq-header-tools__submit {
+ position: absolute;
+ inset-block: 0;
+ inset-inline-end: 0;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ inline-size: 46px;
+ padding: 0;
+ border: 0;
+ background: transparent;
+ color: var(--nldesign-color-primary, currentcolor);
+}
+
+.pq-header-tools svg {
+ inline-size: 20px;
+ block-size: 20px;
+ flex: none;
+}
+
+.pq-header-tools__account.utrecht-button-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ min-block-size: 46px;
+ padding-inline: 20px;
+ border-radius: var(
+ --nldesign-website-border-radius,
+ var(--utrecht-button-border-radius, 4px)
+ );
+ text-decoration: none;
+}
+
+.pq-header-tools__chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ min-block-size: 46px;
+ padding-block: 4px;
+ padding-inline: 4px 16px;
+ border: 1px solid var(--nldesign-color-border, var(--tilburg-line-border-color));
+ border-radius: var(--nldesign-website-border-radius-large, 999px);
+ color: var(--nldesign-color-text, var(--tilburg-document-color));
+ text-decoration: none;
+}
+
+.pq-header-tools__chip:hover {
+ background-color: var(
+ --nldesign-color-background-hover,
+ var(--tilburg-color-gray-100)
+ );
+}
+
+.pq-header-tools__initials {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ inline-size: 36px;
+ block-size: 36px;
+ border-radius: var(--nldesign-website-border-radius, 50%);
+ background-color: var(
+ --nldesign-color-primary-light,
+ var(--tilburg-color-blue-100)
+ );
+ color: var(--nldesign-color-primary-hover, var(--nldesign-color-primary));
+ font-size: 0.8125rem;
+ font-weight: 700;
+}
+
+.pq-header-tools__who {
+ display: flex;
+ flex-direction: column;
+ line-height: 1.25;
+}
+
+.pq-header-tools__name {
+ font-weight: 700;
+}
+
+.pq-header-tools__subline {
+ color: var(--nldesign-color-text-muted, var(--tilburg-document-subtle-color));
+ font-size: 0.8125rem;
+}
+
+.pq-header-tools__signout {
+ padding: 0;
+ border: 0;
+ background: transparent;
+ color: var(--nldesign-color-link, var(--utrecht-link-color));
+ font: inherit;
+ font-weight: 700;
+ text-decoration: underline;
+ text-underline-offset: 3px;
+}
+
+.pq-header-tools__menu {
+ display: none;
+ align-items: center;
+ gap: 8px;
+ min-block-size: 44px;
+ padding-inline: 12px;
+ border: 1px solid var(--nldesign-color-border-dark, currentcolor);
+ border-radius: var(--nldesign-website-border-radius, 4px);
+ background: transparent;
+ color: var(--nldesign-color-text, currentcolor);
+ font: inherit;
+ font-weight: 600;
+}
+
+/*
+ * ON A PHONE (G-07): logo and one menu button. The button opens the menu bar
+ * and the search box; the person chip shrinks to its initials.
+ */
+@media (max-width: 767px) {
+ .pq-site .pq-site__header--designed .ac-header__navigation-main {
+ --navigation-bar-height: 72px;
+ flex-wrap: wrap;
+ row-gap: 8px;
+ padding-block: 12px;
+ }
+
+ .pq-site .pq-site__header--designed .ac-header__right-section {
+ margin-inline: 0;
+ }
+
+ .pq-header-tools {
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ }
+
+ .pq-header-tools__menu {
+ display: inline-flex;
+ }
+
+ .pq-header-tools__search {
+ display: none;
+ order: 3;
+ inline-size: 100%;
+ }
+
+ .pq-header-tools__search--open {
+ display: flex;
+ }
+
+ .pq-header-tools__search .pq-header-tools__input.utrecht-textbox {
+ inline-size: 100%;
+ }
+
+ .pq-header-tools__who {
+ position: absolute;
+ inline-size: 1px;
+ block-size: 1px;
+ overflow: hidden;
+ clip-path: inset(50%);
+ white-space: nowrap;
+ }
+
+ .pq-header-tools__chip {
+ padding-inline-end: 4px;
+ }
+
+ .pq-site .pq-site__header--designed .ac-header__navigation-secondary {
+ display: none;
+ }
+
+ /* The menu bar folds away, so the motif runs under the masthead. */
+ .pq-site .pq-site__header--designed .ac-header__navigation-main {
+ position: relative;
+ }
+
+ .pq-site
+ .pq-site__header--designed:not(:has(.pq-site__nav--open))
+ .ac-header__navigation-main::after {
+ content: '';
+ position: absolute;
+ inset-inline: 0;
+ inset-block-start: 100%;
+ z-index: 1;
+ block-size: var(--cn-brand-stripe-height, 0);
+ pointer-events: none;
+ background-image: var(
+ --cn-brand-stripe-image,
+ linear-gradient(
+ var(--cn-brand-stripe-color-1),
+ var(--cn-brand-stripe-color-1)
+ )
+ );
+ background-repeat: repeat-x;
+ background-size: auto 100%;
+ }
+
+ .pq-site
+ .pq-site__header--designed
+ .ac-header__navigation-secondary.pq-site__nav--open {
+ display: block;
+ }
+
+ .pq-site .pq-site__header--designed .pq-site__nav--open .ac-c-navigation__ul {
+ flex-direction: column;
+ align-items: stretch;
+ }
+}
+
+/* The new chrome speaks the set's own face, not the vendored Roboto. */
+.pq-site .pq-header-tools,
+.pq-site .pq-signin,
+.pq-site .pq-site__footer {
+ font-family: var(--nldesign-body-font-family, inherit);
+}
+
+/*
+ * THE DESIGNED FOOTER (G-04): brand column first with its button, the
+ * contact column, the menus; the bottom band one step darker than the footer.
+ */
+.ac-footer section.pq-footer__band--designed.pq-footer__band .container {
+ grid-template-columns: minmax(0, 2fr) repeat(3, minmax(0, 1fr));
+ column-gap: 48px;
+}
+
+@media screen and (max-width: 1024px) {
+ .ac-footer section.pq-footer__band--designed.pq-footer__band .container {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media screen and (max-width: 768px) {
+ .ac-footer section.pq-footer__band--designed.pq-footer__band .container {
+ grid-template-columns: minmax(0, 1fr);
+ }
+}
+
+.pq-site .pq-footer__band--designed .ac-footer__logo {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0;
+}
+
+.ac-footer section.pq-footer__band--designed.pq-footer__band ul {
+ padding-inline-start: 0;
+ list-style: none;
+}
+
+.ac-footer section.pq-footer__band--designed.pq-footer__band ul li {
+ padding-inline-start: 0;
+}
+
+.pq-site .pq-footer__band--designed .ac-footer__menu-title {
+ margin-block-end: var(--tilburg-space-block-mouse, 16px);
+ font-size: 1.125rem;
+}
+
+.pq-site .ac-footer .ac-footer__logo .con-logo-container.footer {
+ margin-block-end: var(--tilburg-space-block-rabbit, 24px);
+}
+
+.pq-site .ac-footer .pq-footer__description {
+ max-inline-size: 26em;
+ margin-block-end: var(--tilburg-space-block-rabbit, 24px);
+ line-height: 1.6;
+}
+
+.pq-site .ac-footer .pq-footer__cta.utrecht-button-link {
+ display: inline-flex;
+ align-items: center;
+ min-block-size: 48px;
+ padding-inline: 20px;
+ border: 2px solid currentcolor;
+ border-radius: var(
+ --nldesign-website-border-radius,
+ var(--utrecht-button-border-radius, 4px)
+ );
+ background-color: transparent;
+ color: var(--tilburg-footer-color, inherit);
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.pq-site .ac-footer .pq-footer__cta.utrecht-button-link:hover {
+ background-color: var(--tilburg-footer-color, currentcolor);
+ color: var(--tilburg-footer-background-color, inherit);
+}
+
+.pq-site .ac-footer .pq-footer__contact p {
+ margin-block-end: var(--tilburg-space-block-snail, 12px);
+}
+
+.pq-site .ac-footer .pq-footer__contact a,
+.pq-site .ac-footer .ac-footer__link {
+ text-decoration: underline;
+ text-underline-offset: 3px;
+}
+
+.pq-site .ac-footer section.pq-footer__band--legal.pq-footer__band {
+ background-color: var(
+ --thematiq-footer-legal-background-color,
+ var(--tilburg-color-blue-500)
+ );
+}
+
+/*
+ * THE HERO (G-08): a light ground and dark type when the set draws its hero
+ * that way, and the set's emblem large and faint at the end of the band.
+ */
+.pq-site .ac-hero {
+ position: relative;
+ overflow: hidden;
+ background-color: var(
+ --thematiq-hero-background-color,
+ var(--tilburg-color-blue-500)
+ );
+}
+
+.pq-site .ac-hero::after {
+ content: '';
+ position: absolute;
+ inset-block: 8%;
+ inset-inline-end: max(16px, calc((100% - 1232px) / 2));
+ inline-size: min(36%, 420px);
+ pointer-events: none;
+ background-image: var(--thematiq-hero-decoration-image, none);
+ background-position: 100% 50%;
+ background-repeat: no-repeat;
+ background-size: contain;
+ opacity: 0.16;
+}
+
+.pq-site .ac-hero > * {
+ position: relative;
+ z-index: 1;
+}
+
+.pq-site .ac-hero .ac-hero__title,
+.pq-site .ac-hero .ac-hero__subtitle {
+ color: var(--nldesign-hero-title-color, var(--utrecht-document-inverse-color));
+}
+
+.pq-site .ac-hero .ac-hero__subtitle {
+ color: var(--nldesign-hero-body-color, var(--utrecht-document-inverse-color));
+}
+
+.pq-site .ac-hero .pq-hero__action {
+ border-radius: var(--nldesign-website-border-radius, 0);
+}
+
+.pq-site .ac-hero .pq-hero__action:first-child {
+ border-color: var(--thematiq-hero-action-background-color, currentcolor);
+ background-color: var(--thematiq-hero-action-background-color, transparent);
+ color: var(
+ --thematiq-hero-action-color,
+ var(--nldesign-hero-title-color, var(--utrecht-document-inverse-color))
+ );
+}
+
+/*
+ * THE SIGN-IN PAGE AS ROLE CARDS (G-18).
+ */
+.pq-signin {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ gap: 56px;
+ padding-block: 40px 64px;
+}
+
+.pq-signin--with-panel {
+ grid-template-columns: minmax(0, 1fr) minmax(0, 520px);
+ align-items: start;
+}
+
+.pq-signin__title.utrecht-heading-1 {
+ margin-block-end: 16px;
+ overflow-wrap: anywhere;
+}
+
+.pq-signin__main {
+ min-inline-size: 0;
+}
+
+.pq-signin__intro.utrecht-paragraph {
+ max-inline-size: 46em;
+ margin-block-end: 32px;
+ font-size: 1.25rem;
+ line-height: 1.6;
+}
+
+.pq-signin__cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr));
+ gap: 24px;
+ max-inline-size: 1000px;
+ margin: 0 0 32px;
+ padding: 0;
+ list-style: none;
+}
+
+.pq-signin__card {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ padding: 28px;
+ border: 1px solid var(--nldesign-color-border, var(--tilburg-line-border-color));
+ border-radius: var(--nldesign-website-border-radius-large, 8px);
+ background-color: var(--nldesign-color-background, var(--tilburg-color-white));
+}
+
+.pq-signin__card-head {
+ display: flex;
+ align-items: flex-start;
+ gap: 16px;
+}
+
+.pq-signin__card-title.utrecht-heading-3 {
+ margin: 0;
+ line-height: 1.25;
+}
+
+.pq-signin__card-text.utrecht-paragraph {
+ margin-block-start: 6px;
+}
+
+.pq-signin__mark {
+ display: inline-flex;
+ flex: none;
+ align-items: center;
+ justify-content: center;
+ inline-size: 56px;
+ block-size: 56px;
+ border-radius: var(--nldesign-website-border-radius, 8px);
+ background-color: var(
+ --nldesign-color-primary-light,
+ var(--tilburg-color-blue-100)
+ );
+ color: var(--nldesign-color-primary, currentcolor);
+ font-size: 0.9375rem;
+ font-weight: 700;
+}
+
+.pq-signin__mark svg {
+ inline-size: 28px;
+ block-size: 28px;
+}
+
+.pq-signin__mark--digid,
+.pq-signin__mark--eherkenning,
+.pq-signin__mark--eidas {
+ background-color: var(--nldesign-color-text, CanvasText);
+ color: var(--nldesign-color-background, Canvas);
+}
+
+.pq-signin__button.utrecht-button-link {
+ display: flex;
+ align-self: stretch;
+ inline-size: 100%;
+ max-inline-size: none;
+ align-items: center;
+ justify-content: center;
+ min-block-size: 52px;
+ border-radius: var(
+ --nldesign-website-border-radius,
+ var(--utrecht-button-border-radius, 4px)
+ );
+ font-size: 1.0625rem;
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.pq-signin__button.utrecht-button-link--secondary-action {
+ border: 2px solid var(--nldesign-color-primary, currentcolor);
+}
+
+.pq-signin__hint {
+ margin: 0;
+ color: var(--nldesign-color-text-muted, var(--tilburg-document-subtle-color));
+ font-size: 0.9375rem;
+}
+
+.pq-signin__notice {
+ display: flex;
+ gap: 12px;
+ max-inline-size: 1000px;
+ margin-block-end: 32px;
+ padding: 20px 24px;
+ border: 1px solid
+ var(--nldesign-color-primary-light-hover, var(--nldesign-color-border));
+ border-radius: var(--nldesign-website-border-radius, 4px);
+ background-color: var(
+ --nldesign-color-primary-light,
+ var(--tilburg-color-blue-100)
+ );
+ line-height: 1.6;
+}
+
+.pq-signin__notice svg {
+ flex: none;
+ inline-size: 22px;
+ block-size: 22px;
+ margin-block-start: 2px;
+}
+
+.pq-signin__notice-title {
+ font-weight: 700;
+}
+
+.pq-signin__panel {
+ position: relative;
+ overflow: hidden;
+ padding: 48px 36px 72px;
+ border-radius: var(--nldesign-website-border-radius-large, 8px);
+ background-color: var(
+ --nldesign-color-footer-background,
+ var(--nldesign-color-primary-hover)
+ );
+ color: var(--nldesign-color-footer-text, var(--nldesign-color-primary-text));
+}
+
+/* The motif along the panel's top, its emblem large and faint at the foot. */
+.pq-signin__panel::before {
+ content: '';
+ position: absolute;
+ inset-inline: 0;
+ inset-block-start: 0;
+ block-size: var(--cn-brand-stripe-height, 0);
+ background-image: var(--cn-brand-stripe-image-inverse, none);
+ background-repeat: repeat-x;
+ background-size: auto 100%;
+}
+
+.pq-signin__panel::after {
+ content: '';
+ position: absolute;
+ inset-inline-end: -20px;
+ inset-block-end: -20px;
+ inline-size: 240px;
+ block-size: 240px;
+ pointer-events: none;
+ background-image: var(--nldesign-emblem-url, none);
+ background-repeat: no-repeat;
+ background-size: contain;
+ opacity: 0.12;
+}
+
+.pq-signin__panel-title.utrecht-heading-3 {
+ margin-block-end: 24px;
+ color: inherit;
+}
+
+.pq-signin__points {
+ position: relative;
+ z-index: 1;
+ display: grid;
+ gap: 20px;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.pq-signin__point {
+ display: flex;
+ gap: 16px;
+}
+
+.pq-signin__point-mark {
+ display: inline-flex;
+ flex: none;
+ align-items: center;
+ justify-content: center;
+ inline-size: 36px;
+ block-size: 36px;
+ border-radius: 50%;
+ background-color: var(--thematiq-accent-light-color, transparent);
+ color: var(--thematiq-accent-text-color, currentcolor);
+}
+
+.pq-signin__point-mark svg {
+ inline-size: 18px;
+ block-size: 18px;
+}
+
+.pq-signin__point-title {
+ display: block;
+ font-weight: 700;
+ font-size: 1.125rem;
+}
+
+.pq-signin__point-text {
+ display: block;
+ opacity: 0.9;
+}
+
+@media (max-width: 1023px) {
+ .pq-signin--with-panel {
+ grid-template-columns: minmax(0, 1fr);
+ }
+}
diff --git a/l10n/en.js b/l10n/en.js
index 71030a8b6..e5f9ff4ce 100644
--- a/l10n/en.js
+++ b/l10n/en.js
@@ -2094,7 +2094,125 @@ OC.L10N.register(
"Where a submission goes. `case` creates an object in caseRegister and caseSchema. `wooRequest` hands it to opencatalogi's Woo intake, which mints the request reference and starts the statutory term; the form's fields are then named after the request's own fields (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Without opencatalogi a `wooRequest` submission is marked failed.": "Where a submission goes. `case` creates an object in caseRegister and caseSchema. `wooRequest` hands it to opencatalogi's Woo intake, which mints the request reference and starts the statutory term; the form's fields are then named after the request's own fields (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Without opencatalogi a `wooRequest` submission is marked failed.",
"The reference the receiving app minted, such as a Woo request's `WOO-2026-1A2B3C`. Set only once the submission is registered.": "The reference the receiving app minted, such as a Woo request's `WOO-2026-1A2B3C`. Set only once the submission is registered.",
"Due at": "Due at",
- "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started."
+ "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.",
+ "A box under the cards, for example what to do the first time.": "A box under the cards, for example what to do the first time.",
+ "A column of contact details beside the footer text: an address, a phone number, an e-mail address. A line with a link is shown as a link.": "A column of contact details beside the footer text: an address, a phone number, an e-mail address. A line with a link is shown as a link.",
+ "A line under the cards for staff, with a link to where they sign in.": "A line under the cards for staff, with a link to where they sign in.",
+ "A panel beside the cards with what the visitor finds after signing in.": "A panel beside the cards with what the visitor finds after signing in.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. Off unless switched on.": "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. Off unless switched on.",
+ "A short line under the button, such as what you need to sign in.": "A short line under the button, such as what you need to sign in.",
+ "Button text": "Button text",
+ "Button to the own area": "Button to the own area",
+ "Card heading": "Card heading",
+ "Card text": "Card text",
+ "Column heading": "Column heading",
+ "Contact column": "Contact column",
+ "Footer button": "Footer button",
+ "Hint": "Hint",
+ "Hint in the box": "Hint in the box",
+ "Introduction": "Introduction",
+ "Lines": "Lines",
+ "Link for staff": "Link for staff",
+ "One button under the footer text, such as a link to the contact page. Left out when it has no label or no destination.": "One button under the footer text, such as a link to the contact page. Left out when it has no label or no destination.",
+ "One line more about it.": "One line more about it.",
+ "One or two sentences under the heading: who signs in how.": "One or two sentences under the heading: who signs in how.",
+ "Points": "Points",
+ "Search in the header": "Search in the header",
+ "Search page": "Search page",
+ "Show the search box": "Show the search box",
+ "Side panel": "Side panel",
+ "Sign-in cards": "Sign-in cards",
+ "Sign-in page": "Sign-in page",
+ "The heading above the lines, such as Contact.": "The heading above the lines, such as Contact.",
+ "The heading of the box.": "The heading of the box.",
+ "The heading of the panel.": "The heading of the panel.",
+ "The lines of the column, in order.": "The lines of the column, in order.",
+ "The name of an icon for the card. DigiD and eHerkenning show their own mark.": "The name of an icon for the card. DigiD and eHerkenning show their own mark.",
+ "The name of an icon for the point.": "The name of an icon for the point.",
+ "The page heading, such as Inloggen bij Mijn Wilgenboom. Empty shows Welkom.": "The page heading, such as Inloggen bij Mijn Wilgenboom. Empty shows Welkom.",
+ "The page of this portal that shows the results, such as /zoeken. Empty or not a page of this portal means /zoeken.": "The page of this portal that shows the results, such as /zoeken. Empty or not a page of this portal means /zoeken.",
+ "The point in a few words.": "The point in a few words.",
+ "The points in the panel.": "The points in the panel.",
+ "The sentence before the link, such as Werkt u bij De Wilgenboom?": "The sentence before the link, such as Werkt u bij De Wilgenboom?",
+ "The short text in the empty box, which is also its name for screen readers. Empty shows \"Zoeken\".": "The short text in the empty box, which is also its name for screen readers. Empty shows \"Zoeken\".",
+ "The text around the sign-in cards. Every part is optional.": "The text around the sign-in cards. Every part is optional.",
+ "The text of one button in the header that opens the visitor's own area, where they choose how to sign in. Empty shows a link for each way to sign in instead.": "The text of one button in the header that opens the visitor's own area, where they choose how to sign in. Empty shows a link for each way to sign in instead.",
+ "The text of the box.": "The text of the box.",
+ "The text of the card for each way to sign in on the sign-in page, keyed by mode (digid, nextcloud, eherkenning, oidc, local, eidas). A mode without a card shows one plain button.": "The text of the card for each way to sign in on the sign-in page, keyed by mode (digid, nextcloud, eherkenning, oidc, local, eidas). A mode without a card shows one plain button.",
+ "The text of the link.": "The text of the link.",
+ "The text of the sign-in button. Empty shows the standard text for this way in.": "The text of the sign-in button. Empty shows the standard text for this way in.",
+ "What the line says.": "What the line says.",
+ "What the visitor can do after signing in this way.": "What the visitor can do after signing in this way.",
+ "Where the line links to: a page of this portal, or a web, mail or phone address. Empty shows plain text.": "Where the line links to: a page of this portal, or a web, mail or phone address. Empty shows plain text.",
+ "Where the link goes.": "Where the link goes.",
+ "Where the link goes: a page of this portal such as /contact, or a full web, mail or phone address.": "Where the link goes: a page of this portal such as /contact, or a full web, mail or phone address.",
+ "Whether the header shows the search box.": "Whether the header shows the search box.",
+ "Who this way in is for, such as Ik ben leerling.": "Who this way in is for, such as Ik ben leerling.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. A portal that declares it shows it, unless it switches it off.": "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. A portal that declares it shows it, unless it switches it off.",
+ "False hides a declared search box. Empty shows it.": "False hides a declared search box. Empty shows it.",
+ "Name for screen readers": "Name for screen readers",
+ "What a screen reader calls the box, such as Zoeken op de website. Empty uses the hint.": "What a screen reader calls the box, such as Zoeken op de website. Empty uses the hint.",
+ "On a collection block: cards, dated rows, bars or mark chips instead of a table; on tasks the highlight card; on kpi one segmented bar; on calendar date tiles (site-school-blocks).": "On a collection block: cards, dated rows, bars or mark chips instead of a table; on tasks the highlight card; on kpi one segmented bar; on calendar date tiles (site-school-blocks).",
+ "On a greeting: whether today's date shows; on unless false.": "On a greeting: whether today's date shows; on unless false.",
+ "On a segmented kpi: a fixed whole.": "On a segmented kpi: a fixed whole.",
+ "On a segmented kpi: the field with the whole.": "On a segmented kpi: the field with the whole.",
+ "On a segmented kpi: the unit after the figure.": "On a segmented kpi: the unit after the figure.",
+ "On a segmented kpi: up to five parts, each field, label and tone.": "On a segmented kpi: up to five parts, each field, label and tone.",
+ "On bars and chips: the label of each row.": "On bars and chips: the label of each row.",
+ "On bars: the figure a full bar stands for.": "On bars: the figure a full bar stands for.",
+ "On bars: the figure of each row.": "On bars: the figure of each row.",
+ "On bars: the grey head line, from the first row.": "On bars: the grey head line, from the first row.",
+ "On bars: the small heading above the note.": "On bars: the small heading above the note.",
+ "On cards and highlight tasks: the fields of the second line.": "On cards and highlight tasks: the fields of the second line.",
+ "On cards: the coming-up part.": "On cards: the coming-up part.",
+ "On cards: the first letter of the title in a circle.": "On cards: the first letter of the title in a circle.",
+ "On cards: the small heading above the coming-up part.": "On cards: the small heading above the coming-up part.",
+ "On cards: the text beside the status; on bars: the note under the bars, from the first row.": "On cards: the text beside the status; on bars: the note under the bars, from the first row.",
+ "On chips: a mark below this is marked as below the pass mark.": "On chips: a mark below this is marked as below the pass mark.",
+ "On chips: the average of each row.": "On chips: the average of each row.",
+ "On chips: the list of marks of each row.": "On chips: the list of marks of each row.",
+ "On highlight tasks: the small uppercase label.": "On highlight tasks: the small uppercase label.",
+ "On highlight tasks: the words on the button.": "On highlight tasks: the words on the button.",
+ "On rows and cards: the field shown as a status pill.": "On rows and cards: the field shown as a status pill.",
+ "On rows and cards: the tone of each status value (neutral, success, warning, error).": "On rows and cards: the tone of each status value (neutral, success, warning, error).",
+ "On rows: the field drawn as a date tile.": "On rows: the field drawn as a date tile.",
+ "On rows: the line shown in quotes.": "On rows: the line shown in quotes.",
+ "On rows: the line under the status pill.": "On rows: the line under the status pill.",
+ "On rows: the second line.": "On rows: the second line.",
+ "On the website": "On the website",
+ "The field with the date or moment before which a row is not shown, in a list, an inbox or a read by id, on the server clock (site-school-blocks).": "The field with the date or moment before which a row is not shown, in a list, an inbox or a read by id, on the server clock (site-school-blocks).",
+ "The slug of the portal whose public website shows this item when `public` is on. Empty means no website shows it.": "The slug of the portal whose public website shows this item when `public` is on. Empty means no website shows it.",
+ "The words the public website shows beside the date to say who the item is for, such as 'groep 7' or 'hele school'. Written by staff, because the site never reads the school app's groups for a visitor who is not signed in. Empty shows nothing.": "The words the public website shows beside the date to say who the item is for, such as 'groep 7' or 'hele school'. Written by staff, because the site never reads the school app's groups for a visitor who is not signed in. Empty shows nothing.",
+ "Visible from field": "Visible from field",
+ "Website": "Website",
+ "Whether the item also shows on the public website of `portal`, for visitors who are not signed in. Off by default: a news item is for its audience only until staff turn this on. An item that targets single children never shows publicly, whatever this says (PublicNewsReader).": "Whether the item also shows on the public website of `portal`, for visitors who are not signed in. Off by default: a news item is for its audience only until staff turn this on. An item that targets single children never shows publicly, whatever this says (PublicNewsReader).",
+ "Who it is for, on the website": "Who it is for, on the website",
+ "avatar": "avatar",
+ "averageField": "averageField",
+ "buttonLabel": "buttonLabel",
+ "captionField": "captionField",
+ "dateField": "dateField",
+ "eyebrow": "eyebrow",
+ "labelField": "labelField",
+ "lowBelow": "lowBelow",
+ "max": "max",
+ "noteField": "noteField",
+ "noteLabel": "noteLabel",
+ "quoteField": "quoteField",
+ "segments": "segments",
+ "showDate": "showDate",
+ "soonField": "soonField",
+ "soonLabel": "soonLabel",
+ "statusField": "statusField",
+ "statusNoteField": "statusNoteField",
+ "statusTones": "statusTones",
+ "subtitleField": "subtitleField",
+ "subtitleFields": "subtitleFields",
+ "target": "target",
+ "totalField": "totalField",
+ "unit": "unit",
+ "valueField": "valueField",
+ "valuesField": "valuesField"
},
"nplurals=2; plural=(n != 1);"
)
diff --git a/l10n/en.json b/l10n/en.json
index e073e1ea0..7306e2460 100644
--- a/l10n/en.json
+++ b/l10n/en.json
@@ -2105,7 +2105,125 @@
"Where a submission goes. `case` creates an object in caseRegister and caseSchema. `wooRequest` hands it to opencatalogi's Woo intake, which mints the request reference and starts the statutory term; the form's fields are then named after the request's own fields (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Without opencatalogi a `wooRequest` submission is marked failed.": "Where a submission goes. `case` creates an object in caseRegister and caseSchema. `wooRequest` hands it to opencatalogi's Woo intake, which mints the request reference and starts the statutory term; the form's fields are then named after the request's own fields (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Without opencatalogi a `wooRequest` submission is marked failed.",
"The reference the receiving app minted, such as a Woo request's `WOO-2026-1A2B3C`. Set only once the submission is registered.": "The reference the receiving app minted, such as a Woo request's `WOO-2026-1A2B3C`. Set only once the submission is registered.",
"Due at": "Due at",
- "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started."
+ "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.",
+ "A box under the cards, for example what to do the first time.": "A box under the cards, for example what to do the first time.",
+ "A column of contact details beside the footer text: an address, a phone number, an e-mail address. A line with a link is shown as a link.": "A column of contact details beside the footer text: an address, a phone number, an e-mail address. A line with a link is shown as a link.",
+ "A line under the cards for staff, with a link to where they sign in.": "A line under the cards for staff, with a link to where they sign in.",
+ "A panel beside the cards with what the visitor finds after signing in.": "A panel beside the cards with what the visitor finds after signing in.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. Off unless switched on.": "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. Off unless switched on.",
+ "A short line under the button, such as what you need to sign in.": "A short line under the button, such as what you need to sign in.",
+ "Button text": "Button text",
+ "Button to the own area": "Button to the own area",
+ "Card heading": "Card heading",
+ "Card text": "Card text",
+ "Column heading": "Column heading",
+ "Contact column": "Contact column",
+ "Footer button": "Footer button",
+ "Hint": "Hint",
+ "Hint in the box": "Hint in the box",
+ "Introduction": "Introduction",
+ "Lines": "Lines",
+ "Link for staff": "Link for staff",
+ "One button under the footer text, such as a link to the contact page. Left out when it has no label or no destination.": "One button under the footer text, such as a link to the contact page. Left out when it has no label or no destination.",
+ "One line more about it.": "One line more about it.",
+ "One or two sentences under the heading: who signs in how.": "One or two sentences under the heading: who signs in how.",
+ "Points": "Points",
+ "Search in the header": "Search in the header",
+ "Search page": "Search page",
+ "Show the search box": "Show the search box",
+ "Side panel": "Side panel",
+ "Sign-in cards": "Sign-in cards",
+ "Sign-in page": "Sign-in page",
+ "The heading above the lines, such as Contact.": "The heading above the lines, such as Contact.",
+ "The heading of the box.": "The heading of the box.",
+ "The heading of the panel.": "The heading of the panel.",
+ "The lines of the column, in order.": "The lines of the column, in order.",
+ "The name of an icon for the card. DigiD and eHerkenning show their own mark.": "The name of an icon for the card. DigiD and eHerkenning show their own mark.",
+ "The name of an icon for the point.": "The name of an icon for the point.",
+ "The page heading, such as Inloggen bij Mijn Wilgenboom. Empty shows Welkom.": "The page heading, such as Inloggen bij Mijn Wilgenboom. Empty shows Welkom.",
+ "The page of this portal that shows the results, such as /zoeken. Empty or not a page of this portal means /zoeken.": "The page of this portal that shows the results, such as /zoeken. Empty or not a page of this portal means /zoeken.",
+ "The point in a few words.": "The point in a few words.",
+ "The points in the panel.": "The points in the panel.",
+ "The sentence before the link, such as Werkt u bij De Wilgenboom?": "The sentence before the link, such as Werkt u bij De Wilgenboom?",
+ "The short text in the empty box, which is also its name for screen readers. Empty shows \"Zoeken\".": "The short text in the empty box, which is also its name for screen readers. Empty shows \"Zoeken\".",
+ "The text around the sign-in cards. Every part is optional.": "The text around the sign-in cards. Every part is optional.",
+ "The text of one button in the header that opens the visitor's own area, where they choose how to sign in. Empty shows a link for each way to sign in instead.": "The text of one button in the header that opens the visitor's own area, where they choose how to sign in. Empty shows a link for each way to sign in instead.",
+ "The text of the box.": "The text of the box.",
+ "The text of the card for each way to sign in on the sign-in page, keyed by mode (digid, nextcloud, eherkenning, oidc, local, eidas). A mode without a card shows one plain button.": "The text of the card for each way to sign in on the sign-in page, keyed by mode (digid, nextcloud, eherkenning, oidc, local, eidas). A mode without a card shows one plain button.",
+ "The text of the link.": "The text of the link.",
+ "The text of the sign-in button. Empty shows the standard text for this way in.": "The text of the sign-in button. Empty shows the standard text for this way in.",
+ "What the line says.": "What the line says.",
+ "What the visitor can do after signing in this way.": "What the visitor can do after signing in this way.",
+ "Where the line links to: a page of this portal, or a web, mail or phone address. Empty shows plain text.": "Where the line links to: a page of this portal, or a web, mail or phone address. Empty shows plain text.",
+ "Where the link goes.": "Where the link goes.",
+ "Where the link goes: a page of this portal such as /contact, or a full web, mail or phone address.": "Where the link goes: a page of this portal such as /contact, or a full web, mail or phone address.",
+ "Whether the header shows the search box.": "Whether the header shows the search box.",
+ "Who this way in is for, such as Ik ben leerling.": "Who this way in is for, such as Ik ben leerling.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. A portal that declares it shows it, unless it switches it off.": "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. A portal that declares it shows it, unless it switches it off.",
+ "False hides a declared search box. Empty shows it.": "False hides a declared search box. Empty shows it.",
+ "Name for screen readers": "Name for screen readers",
+ "What a screen reader calls the box, such as Zoeken op de website. Empty uses the hint.": "What a screen reader calls the box, such as Zoeken op de website. Empty uses the hint.",
+ "On a collection block: cards, dated rows, bars or mark chips instead of a table; on tasks the highlight card; on kpi one segmented bar; on calendar date tiles (site-school-blocks).": "On a collection block: cards, dated rows, bars or mark chips instead of a table; on tasks the highlight card; on kpi one segmented bar; on calendar date tiles (site-school-blocks).",
+ "On a greeting: whether today's date shows; on unless false.": "On a greeting: whether today's date shows; on unless false.",
+ "On a segmented kpi: a fixed whole.": "On a segmented kpi: a fixed whole.",
+ "On a segmented kpi: the field with the whole.": "On a segmented kpi: the field with the whole.",
+ "On a segmented kpi: the unit after the figure.": "On a segmented kpi: the unit after the figure.",
+ "On a segmented kpi: up to five parts, each field, label and tone.": "On a segmented kpi: up to five parts, each field, label and tone.",
+ "On bars and chips: the label of each row.": "On bars and chips: the label of each row.",
+ "On bars: the figure a full bar stands for.": "On bars: the figure a full bar stands for.",
+ "On bars: the figure of each row.": "On bars: the figure of each row.",
+ "On bars: the grey head line, from the first row.": "On bars: the grey head line, from the first row.",
+ "On bars: the small heading above the note.": "On bars: the small heading above the note.",
+ "On cards and highlight tasks: the fields of the second line.": "On cards and highlight tasks: the fields of the second line.",
+ "On cards: the coming-up part.": "On cards: the coming-up part.",
+ "On cards: the first letter of the title in a circle.": "On cards: the first letter of the title in a circle.",
+ "On cards: the small heading above the coming-up part.": "On cards: the small heading above the coming-up part.",
+ "On cards: the text beside the status; on bars: the note under the bars, from the first row.": "On cards: the text beside the status; on bars: the note under the bars, from the first row.",
+ "On chips: a mark below this is marked as below the pass mark.": "On chips: a mark below this is marked as below the pass mark.",
+ "On chips: the average of each row.": "On chips: the average of each row.",
+ "On chips: the list of marks of each row.": "On chips: the list of marks of each row.",
+ "On highlight tasks: the small uppercase label.": "On highlight tasks: the small uppercase label.",
+ "On highlight tasks: the words on the button.": "On highlight tasks: the words on the button.",
+ "On rows and cards: the field shown as a status pill.": "On rows and cards: the field shown as a status pill.",
+ "On rows and cards: the tone of each status value (neutral, success, warning, error).": "On rows and cards: the tone of each status value (neutral, success, warning, error).",
+ "On rows: the field drawn as a date tile.": "On rows: the field drawn as a date tile.",
+ "On rows: the line shown in quotes.": "On rows: the line shown in quotes.",
+ "On rows: the line under the status pill.": "On rows: the line under the status pill.",
+ "On rows: the second line.": "On rows: the second line.",
+ "On the website": "On the website",
+ "The field with the date or moment before which a row is not shown, in a list, an inbox or a read by id, on the server clock (site-school-blocks).": "The field with the date or moment before which a row is not shown, in a list, an inbox or a read by id, on the server clock (site-school-blocks).",
+ "The slug of the portal whose public website shows this item when `public` is on. Empty means no website shows it.": "The slug of the portal whose public website shows this item when `public` is on. Empty means no website shows it.",
+ "The words the public website shows beside the date to say who the item is for, such as 'groep 7' or 'hele school'. Written by staff, because the site never reads the school app's groups for a visitor who is not signed in. Empty shows nothing.": "The words the public website shows beside the date to say who the item is for, such as 'groep 7' or 'hele school'. Written by staff, because the site never reads the school app's groups for a visitor who is not signed in. Empty shows nothing.",
+ "Visible from field": "Visible from field",
+ "Website": "Website",
+ "Whether the item also shows on the public website of `portal`, for visitors who are not signed in. Off by default: a news item is for its audience only until staff turn this on. An item that targets single children never shows publicly, whatever this says (PublicNewsReader).": "Whether the item also shows on the public website of `portal`, for visitors who are not signed in. Off by default: a news item is for its audience only until staff turn this on. An item that targets single children never shows publicly, whatever this says (PublicNewsReader).",
+ "Who it is for, on the website": "Who it is for, on the website",
+ "avatar": "avatar",
+ "averageField": "averageField",
+ "buttonLabel": "buttonLabel",
+ "captionField": "captionField",
+ "dateField": "dateField",
+ "eyebrow": "eyebrow",
+ "labelField": "labelField",
+ "lowBelow": "lowBelow",
+ "max": "max",
+ "noteField": "noteField",
+ "noteLabel": "noteLabel",
+ "quoteField": "quoteField",
+ "segments": "segments",
+ "showDate": "showDate",
+ "soonField": "soonField",
+ "soonLabel": "soonLabel",
+ "statusField": "statusField",
+ "statusNoteField": "statusNoteField",
+ "statusTones": "statusTones",
+ "subtitleField": "subtitleField",
+ "subtitleFields": "subtitleFields",
+ "target": "target",
+ "totalField": "totalField",
+ "unit": "unit",
+ "valueField": "valueField",
+ "valuesField": "valuesField"
},
"plurals": "",
"pluralForm": "nplurals=2; plural=(n != 1);"
diff --git a/l10n/nl.js b/l10n/nl.js
index abf54e280..34707c013 100644
--- a/l10n/nl.js
+++ b/l10n/nl.js
@@ -2159,7 +2159,125 @@ OC.L10N.register(
"Where a submission goes. `case` creates an object in caseRegister and caseSchema. `wooRequest` hands it to opencatalogi's Woo intake, which mints the request reference and starts the statutory term; the form's fields are then named after the request's own fields (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Without opencatalogi a `wooRequest` submission is marked failed.": "Waar een inzending heen gaat. `case` maakt een object in caseRegister en caseSchema. `wooRequest` geeft haar aan de Woo-intake van opencatalogi, die het kenmerk van het verzoek uitgeeft en de wettelijke termijn start; de velden van het formulier heten dan zoals de velden van het verzoek (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Zonder opencatalogi wordt een `wooRequest`-inzending als mislukt gemarkeerd.",
"The reference the receiving app minted, such as a Woo request's `WOO-2026-1A2B3C`. Set only once the submission is registered.": "Het kenmerk dat de ontvangende app uitgaf, zoals `WOO-2026-1A2B3C` van een Woo-verzoek. Alleen gezet zodra de inzending is geregistreerd.",
"Due at": "Uiterste datum",
- "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "De wettelijke uiterste datum die de ontvangende app startte, zoals de beslistermijn van een Woo-verzoek. Alleen gezet als er een termijn loopt, zodat de statuspagina nooit een termijn noemt die niemand startte."
+ "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "De wettelijke uiterste datum die de ontvangende app startte, zoals de beslistermijn van een Woo-verzoek. Alleen gezet als er een termijn loopt, zodat de statuspagina nooit een termijn noemt die niemand startte.",
+ "A box under the cards, for example what to do the first time.": "Een vak onder de kaarten, bijvoorbeeld wat u de eerste keer doet.",
+ "A column of contact details beside the footer text: an address, a phone number, an e-mail address. A line with a link is shown as a link.": "Een kolom met contactgegevens naast de tekst in de voettekst: een adres, een telefoonnummer, een e-mailadres. Een regel met een link wordt als link getoond.",
+ "A line under the cards for staff, with a link to where they sign in.": "Een regel onder de kaarten voor medewerkers, met een link naar de plek waar zij inloggen.",
+ "A panel beside the cards with what the visitor finds after signing in.": "Een vak naast de kaarten met wat de bezoeker vindt na het inloggen.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. Off unless switched on.": "Een zoekvak in de kop, op elke pagina. Het opent de zoekpagina van het portaal met wat de bezoeker typte. Uit tot u het aanzet.",
+ "A short line under the button, such as what you need to sign in.": "Een korte regel onder de knop, bijvoorbeeld wat u nodig heeft om in te loggen.",
+ "Button text": "Tekst op de knop",
+ "Button to the own area": "Knop naar de eigen omgeving",
+ "Card heading": "Kop van de kaart",
+ "Card text": "Tekst van de kaart",
+ "Column heading": "Kop van de kolom",
+ "Contact column": "Kolom met contactgegevens",
+ "Footer button": "Knop in de voettekst",
+ "Hint": "Hint",
+ "Hint in the box": "Hint in het vak",
+ "Introduction": "Inleiding",
+ "Lines": "Regels",
+ "Link for staff": "Link voor medewerkers",
+ "One button under the footer text, such as a link to the contact page. Left out when it has no label or no destination.": "Eén knop onder de tekst in de voettekst, bijvoorbeeld naar de contactpagina. Weggelaten als de tekst of de bestemming ontbreekt.",
+ "One line more about it.": "Eén regel meer erover.",
+ "One or two sentences under the heading: who signs in how.": "Een of twee zinnen onder de kop: wie logt hoe in.",
+ "Points": "Punten",
+ "Search in the header": "Zoeken in de kop",
+ "Search page": "Zoekpagina",
+ "Show the search box": "Zoekvak tonen",
+ "Side panel": "Zijvak",
+ "Sign-in cards": "Inlogkaarten",
+ "Sign-in page": "Inlogpagina",
+ "The heading above the lines, such as Contact.": "De kop boven de regels, bijvoorbeeld Contact.",
+ "The heading of the box.": "De kop van het vak.",
+ "The heading of the panel.": "De kop van het vak.",
+ "The lines of the column, in order.": "De regels van de kolom, op volgorde.",
+ "The name of an icon for the card. DigiD and eHerkenning show their own mark.": "De naam van een pictogram voor de kaart. DigiD en eHerkenning tonen hun eigen logo.",
+ "The name of an icon for the point.": "De naam van een pictogram voor het punt.",
+ "The page heading, such as Inloggen bij Mijn Wilgenboom. Empty shows Welkom.": "De kop van de pagina, bijvoorbeeld Inloggen bij Mijn Wilgenboom. Leeg toont Welkom.",
+ "The page of this portal that shows the results, such as /zoeken. Empty or not a page of this portal means /zoeken.": "De pagina van dit portaal die de resultaten toont, bijvoorbeeld /zoeken. Leeg of geen pagina van dit portaal betekent /zoeken.",
+ "The point in a few words.": "Het punt in een paar woorden.",
+ "The points in the panel.": "De punten in het vak.",
+ "The sentence before the link, such as Werkt u bij De Wilgenboom?": "De zin voor de link, bijvoorbeeld Werkt u bij De Wilgenboom?",
+ "The short text in the empty box, which is also its name for screen readers. Empty shows \"Zoeken\".": "De korte tekst in het lege vak, die ook de naam voor schermlezers is. Leeg toont \"Zoeken\".",
+ "The text around the sign-in cards. Every part is optional.": "De tekst rond de inlogkaarten. Elk deel mag leeg blijven.",
+ "The text of one button in the header that opens the visitor's own area, where they choose how to sign in. Empty shows a link for each way to sign in instead.": "De tekst van één knop in de kop die de eigen omgeving van de bezoeker opent, waar die kiest hoe hij inlogt. Leeg toont in plaats daarvan een link voor elke manier van inloggen.",
+ "The text of the box.": "De tekst van het vak.",
+ "The text of the card for each way to sign in on the sign-in page, keyed by mode (digid, nextcloud, eherkenning, oidc, local, eidas). A mode without a card shows one plain button.": "De tekst van de kaart voor elke manier van inloggen op de inlogpagina, per manier (digid, nextcloud, eherkenning, oidc, local, eidas). Een manier zonder kaart toont één gewone knop.",
+ "The text of the link.": "De tekst van de link.",
+ "The text of the sign-in button. Empty shows the standard text for this way in.": "De tekst van de inlogknop. Leeg toont de gewone tekst voor deze manier van inloggen.",
+ "What the line says.": "Wat de regel zegt.",
+ "What the visitor can do after signing in this way.": "Wat de bezoeker kan doen na het inloggen op deze manier.",
+ "Where the line links to: a page of this portal, or a web, mail or phone address. Empty shows plain text.": "Waar de regel naar linkt: een pagina van dit portaal, of een web-, mail- of telefoonadres. Leeg toont gewone tekst.",
+ "Where the link goes.": "Waar de link naartoe gaat.",
+ "Where the link goes: a page of this portal such as /contact, or a full web, mail or phone address.": "Waar de link naartoe gaat: een pagina van dit portaal zoals /contact, of een volledig web-, mail- of telefoonadres.",
+ "Whether the header shows the search box.": "Of de kop het zoekvak toont.",
+ "Who this way in is for, such as Ik ben leerling.": "Voor wie deze manier van inloggen is, bijvoorbeeld Ik ben leerling.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. A portal that declares it shows it, unless it switches it off.": "Een zoekvak in de kop, op elke pagina. Het opent de zoekpagina van het portaal met wat de bezoeker typte. Een portaal dat het opgeeft toont het, tenzij het uit staat.",
+ "False hides a declared search box. Empty shows it.": "Uit verbergt een opgegeven zoekvak. Leeg toont het.",
+ "Name for screen readers": "Naam voor schermlezers",
+ "What a screen reader calls the box, such as Zoeken op de website. Empty uses the hint.": "Hoe een schermlezer het vak noemt, bijvoorbeeld Zoeken op de website. Leeg gebruikt de hint.",
+ "On a collection block: cards, dated rows, bars or mark chips instead of a table; on tasks the highlight card; on kpi one segmented bar; on calendar date tiles (site-school-blocks).": "Op een lijstblok: kaarten, rijen met datum, balken of cijferlabels in plaats van een tabel; bij taken de uitgelichte kaart; bij kerncijfers één verdeelde balk; bij de kalender datumtegels (site-school-blocks).",
+ "On a greeting: whether today's date shows; on unless false.": "Bij een begroeting: of de datum van vandaag zichtbaar is; aan tenzij uit.",
+ "On a segmented kpi: a fixed whole.": "Bij een verdeeld kerncijfer: een vast totaal.",
+ "On a segmented kpi: the field with the whole.": "Bij een verdeeld kerncijfer: het veld met het totaal.",
+ "On a segmented kpi: the unit after the figure.": "Bij een verdeeld kerncijfer: de eenheid na het getal.",
+ "On a segmented kpi: up to five parts, each field, label and tone.": "Bij een verdeeld kerncijfer: hoogstens vijf delen, elk met veld, label en toon.",
+ "On bars and chips: the label of each row.": "Bij balken en cijferlabels: het label van elke rij.",
+ "On bars: the figure a full bar stands for.": "Bij balken: het getal dat een volle balk betekent.",
+ "On bars: the figure of each row.": "Bij balken: het getal van elke rij.",
+ "On bars: the grey head line, from the first row.": "Bij balken: de grijze kopregel, uit de eerste rij.",
+ "On bars: the small heading above the note.": "Bij balken: de kleine kop boven de notitie.",
+ "On cards and highlight tasks: the fields of the second line.": "Bij kaarten en uitgelichte taken: de velden van de tweede regel.",
+ "On cards: the coming-up part.": "Bij kaarten: het deel dat binnenkort komt.",
+ "On cards: the first letter of the title in a circle.": "Bij kaarten: de eerste letter van de titel in een cirkel.",
+ "On cards: the small heading above the coming-up part.": "Bij kaarten: de kleine kop boven het deel dat binnenkort komt.",
+ "On cards: the text beside the status; on bars: the note under the bars, from the first row.": "Bij kaarten: de tekst naast de status; bij balken: de notitie onder de balken, uit de eerste rij.",
+ "On chips: a mark below this is marked as below the pass mark.": "Bij cijferlabels: een cijfer hieronder krijgt het teken onvoldoende.",
+ "On chips: the average of each row.": "Bij cijferlabels: het gemiddelde van elke rij.",
+ "On chips: the list of marks of each row.": "Bij cijferlabels: de lijst met cijfers van elke rij.",
+ "On highlight tasks: the small uppercase label.": "Bij uitgelichte taken: het kleine label in hoofdletters.",
+ "On highlight tasks: the words on the button.": "Bij uitgelichte taken: de tekst op de knop.",
+ "On rows and cards: the field shown as a status pill.": "Bij rijen en kaarten: het veld dat als statuslabel verschijnt.",
+ "On rows and cards: the tone of each status value (neutral, success, warning, error).": "Bij rijen en kaarten: de toon van elke statuswaarde (neutraal, gelukt, waarschuwing, fout).",
+ "On rows: the field drawn as a date tile.": "Bij rijen: het veld dat als datumtegel verschijnt.",
+ "On rows: the line shown in quotes.": "Bij rijen: de regel tussen aanhalingstekens.",
+ "On rows: the line under the status pill.": "Bij rijen: de regel onder het statuslabel.",
+ "On rows: the second line.": "Bij rijen: de tweede regel.",
+ "On the website": "Op de website",
+ "The field with the date or moment before which a row is not shown, in a list, an inbox or a read by id, on the server clock (site-school-blocks).": "Het veld met de datum of het moment waarvoor een rij niet zichtbaar is, in een lijst, een postvak of een opvraging per id, volgens de klok van de server (site-school-blocks).",
+ "The slug of the portal whose public website shows this item when `public` is on. Empty means no website shows it.": "De slug van het portaal waarvan de openbare website dit bericht toont als `public` aan staat. Leeg betekent dat geen website het toont.",
+ "The words the public website shows beside the date to say who the item is for, such as 'groep 7' or 'hele school'. Written by staff, because the site never reads the school app's groups for a visitor who is not signed in. Empty shows nothing.": "De woorden die de openbare website naast de datum toont om te zeggen voor wie het bericht is, zoals 'groep 7' of 'hele school'. Geschreven door medewerkers, omdat de site de groepen van de school niet leest voor een bezoeker die niet is ingelogd. Leeg toont niets.",
+ "Visible from field": "Veld zichtbaar vanaf",
+ "Website": "Website",
+ "Whether the item also shows on the public website of `portal`, for visitors who are not signed in. Off by default: a news item is for its audience only until staff turn this on. An item that targets single children never shows publicly, whatever this says (PublicNewsReader).": "Of het bericht ook op de openbare website van `portal` staat, voor bezoekers die niet zijn ingelogd. Standaard uit: een bericht is alleen voor de eigen doelgroep tot medewerkers dit aanzetten. Een bericht voor losse kinderen staat nooit openbaar, wat hier ook staat (PublicNewsReader).",
+ "Who it is for, on the website": "Voor wie, op de website",
+ "avatar": "letter in een cirkel",
+ "averageField": "veld met het gemiddelde",
+ "buttonLabel": "tekst op de knop",
+ "captionField": "veld met de kopregel",
+ "dateField": "veld met de datum",
+ "eyebrow": "label boven de titel",
+ "labelField": "veld met het label",
+ "lowBelow": "onvoldoende onder",
+ "max": "maximum",
+ "noteField": "veld met de notitie",
+ "noteLabel": "kop boven de notitie",
+ "quoteField": "veld met het citaat",
+ "segments": "delen",
+ "showDate": "datum tonen",
+ "soonField": "veld met wat binnenkort komt",
+ "soonLabel": "kop boven wat binnenkort komt",
+ "statusField": "veld met de status",
+ "statusNoteField": "veld met de statusnotitie",
+ "statusTones": "tonen per status",
+ "subtitleField": "veld met de tweede regel",
+ "subtitleFields": "velden van de tweede regel",
+ "target": "doel",
+ "totalField": "veld met het totaal",
+ "unit": "eenheid",
+ "valueField": "veld met de waarde",
+ "valuesField": "veld met de waarden"
},
"nplurals=2; plural=(n != 1);"
)
diff --git a/l10n/nl.json b/l10n/nl.json
index b5bc6674e..6f6cf7337 100644
--- a/l10n/nl.json
+++ b/l10n/nl.json
@@ -2170,7 +2170,125 @@
"Where a submission goes. `case` creates an object in caseRegister and caseSchema. `wooRequest` hands it to opencatalogi's Woo intake, which mints the request reference and starts the statutory term; the form's fields are then named after the request's own fields (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Without opencatalogi a `wooRequest` submission is marked failed.": "Waar een inzending heen gaat. `case` maakt een object in caseRegister en caseSchema. `wooRequest` geeft haar aan de Woo-intake van opencatalogi, die het kenmerk van het verzoek uitgeeft en de wettelijke termijn start; de velden van het formulier heten dan zoals de velden van het verzoek (`requestedInformation`, `requesterName`, `requesterEmail`, `requesterPhone`, `requesterAddress`). Zonder opencatalogi wordt een `wooRequest`-inzending als mislukt gemarkeerd.",
"The reference the receiving app minted, such as a Woo request's `WOO-2026-1A2B3C`. Set only once the submission is registered.": "Het kenmerk dat de ontvangende app uitgaf, zoals `WOO-2026-1A2B3C` van een Woo-verzoek. Alleen gezet zodra de inzending is geregistreerd.",
"Due at": "Uiterste datum",
- "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "De wettelijke uiterste datum die de ontvangende app startte, zoals de beslistermijn van een Woo-verzoek. Alleen gezet als er een termijn loopt, zodat de statuspagina nooit een termijn noemt die niemand startte."
+ "The statutory due date the receiving app armed, such as a Woo request's decision term. Set only when a term runs, so the reference page never quotes a deadline nobody started.": "De wettelijke uiterste datum die de ontvangende app startte, zoals de beslistermijn van een Woo-verzoek. Alleen gezet als er een termijn loopt, zodat de statuspagina nooit een termijn noemt die niemand startte.",
+ "A box under the cards, for example what to do the first time.": "Een vak onder de kaarten, bijvoorbeeld wat u de eerste keer doet.",
+ "A column of contact details beside the footer text: an address, a phone number, an e-mail address. A line with a link is shown as a link.": "Een kolom met contactgegevens naast de tekst in de voettekst: een adres, een telefoonnummer, een e-mailadres. Een regel met een link wordt als link getoond.",
+ "A line under the cards for staff, with a link to where they sign in.": "Een regel onder de kaarten voor medewerkers, met een link naar de plek waar zij inloggen.",
+ "A panel beside the cards with what the visitor finds after signing in.": "Een vak naast de kaarten met wat de bezoeker vindt na het inloggen.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. Off unless switched on.": "Een zoekvak in de kop, op elke pagina. Het opent de zoekpagina van het portaal met wat de bezoeker typte. Uit tot u het aanzet.",
+ "A short line under the button, such as what you need to sign in.": "Een korte regel onder de knop, bijvoorbeeld wat u nodig heeft om in te loggen.",
+ "Button text": "Tekst op de knop",
+ "Button to the own area": "Knop naar de eigen omgeving",
+ "Card heading": "Kop van de kaart",
+ "Card text": "Tekst van de kaart",
+ "Column heading": "Kop van de kolom",
+ "Contact column": "Kolom met contactgegevens",
+ "Footer button": "Knop in de voettekst",
+ "Hint": "Hint",
+ "Hint in the box": "Hint in het vak",
+ "Introduction": "Inleiding",
+ "Lines": "Regels",
+ "Link for staff": "Link voor medewerkers",
+ "One button under the footer text, such as a link to the contact page. Left out when it has no label or no destination.": "Eén knop onder de tekst in de voettekst, bijvoorbeeld naar de contactpagina. Weggelaten als de tekst of de bestemming ontbreekt.",
+ "One line more about it.": "Eén regel meer erover.",
+ "One or two sentences under the heading: who signs in how.": "Een of twee zinnen onder de kop: wie logt hoe in.",
+ "Points": "Punten",
+ "Search in the header": "Zoeken in de kop",
+ "Search page": "Zoekpagina",
+ "Show the search box": "Zoekvak tonen",
+ "Side panel": "Zijvak",
+ "Sign-in cards": "Inlogkaarten",
+ "Sign-in page": "Inlogpagina",
+ "The heading above the lines, such as Contact.": "De kop boven de regels, bijvoorbeeld Contact.",
+ "The heading of the box.": "De kop van het vak.",
+ "The heading of the panel.": "De kop van het vak.",
+ "The lines of the column, in order.": "De regels van de kolom, op volgorde.",
+ "The name of an icon for the card. DigiD and eHerkenning show their own mark.": "De naam van een pictogram voor de kaart. DigiD en eHerkenning tonen hun eigen logo.",
+ "The name of an icon for the point.": "De naam van een pictogram voor het punt.",
+ "The page heading, such as Inloggen bij Mijn Wilgenboom. Empty shows Welkom.": "De kop van de pagina, bijvoorbeeld Inloggen bij Mijn Wilgenboom. Leeg toont Welkom.",
+ "The page of this portal that shows the results, such as /zoeken. Empty or not a page of this portal means /zoeken.": "De pagina van dit portaal die de resultaten toont, bijvoorbeeld /zoeken. Leeg of geen pagina van dit portaal betekent /zoeken.",
+ "The point in a few words.": "Het punt in een paar woorden.",
+ "The points in the panel.": "De punten in het vak.",
+ "The sentence before the link, such as Werkt u bij De Wilgenboom?": "De zin voor de link, bijvoorbeeld Werkt u bij De Wilgenboom?",
+ "The short text in the empty box, which is also its name for screen readers. Empty shows \"Zoeken\".": "De korte tekst in het lege vak, die ook de naam voor schermlezers is. Leeg toont \"Zoeken\".",
+ "The text around the sign-in cards. Every part is optional.": "De tekst rond de inlogkaarten. Elk deel mag leeg blijven.",
+ "The text of one button in the header that opens the visitor's own area, where they choose how to sign in. Empty shows a link for each way to sign in instead.": "De tekst van één knop in de kop die de eigen omgeving van de bezoeker opent, waar die kiest hoe hij inlogt. Leeg toont in plaats daarvan een link voor elke manier van inloggen.",
+ "The text of the box.": "De tekst van het vak.",
+ "The text of the card for each way to sign in on the sign-in page, keyed by mode (digid, nextcloud, eherkenning, oidc, local, eidas). A mode without a card shows one plain button.": "De tekst van de kaart voor elke manier van inloggen op de inlogpagina, per manier (digid, nextcloud, eherkenning, oidc, local, eidas). Een manier zonder kaart toont één gewone knop.",
+ "The text of the link.": "De tekst van de link.",
+ "The text of the sign-in button. Empty shows the standard text for this way in.": "De tekst van de inlogknop. Leeg toont de gewone tekst voor deze manier van inloggen.",
+ "What the line says.": "Wat de regel zegt.",
+ "What the visitor can do after signing in this way.": "Wat de bezoeker kan doen na het inloggen op deze manier.",
+ "Where the line links to: a page of this portal, or a web, mail or phone address. Empty shows plain text.": "Waar de regel naar linkt: een pagina van dit portaal, of een web-, mail- of telefoonadres. Leeg toont gewone tekst.",
+ "Where the link goes.": "Waar de link naartoe gaat.",
+ "Where the link goes: a page of this portal such as /contact, or a full web, mail or phone address.": "Waar de link naartoe gaat: een pagina van dit portaal zoals /contact, of een volledig web-, mail- of telefoonadres.",
+ "Whether the header shows the search box.": "Of de kop het zoekvak toont.",
+ "Who this way in is for, such as Ik ben leerling.": "Voor wie deze manier van inloggen is, bijvoorbeeld Ik ben leerling.",
+ "A search box in the header, on every page. It opens the portal's search page with what the visitor typed. A portal that declares it shows it, unless it switches it off.": "Een zoekvak in de kop, op elke pagina. Het opent de zoekpagina van het portaal met wat de bezoeker typte. Een portaal dat het opgeeft toont het, tenzij het uit staat.",
+ "False hides a declared search box. Empty shows it.": "Uit verbergt een opgegeven zoekvak. Leeg toont het.",
+ "Name for screen readers": "Naam voor schermlezers",
+ "What a screen reader calls the box, such as Zoeken op de website. Empty uses the hint.": "Hoe een schermlezer het vak noemt, bijvoorbeeld Zoeken op de website. Leeg gebruikt de hint.",
+ "On a collection block: cards, dated rows, bars or mark chips instead of a table; on tasks the highlight card; on kpi one segmented bar; on calendar date tiles (site-school-blocks).": "Op een lijstblok: kaarten, rijen met datum, balken of cijferlabels in plaats van een tabel; bij taken de uitgelichte kaart; bij kerncijfers één verdeelde balk; bij de kalender datumtegels (site-school-blocks).",
+ "On a greeting: whether today's date shows; on unless false.": "Bij een begroeting: of de datum van vandaag zichtbaar is; aan tenzij uit.",
+ "On a segmented kpi: a fixed whole.": "Bij een verdeeld kerncijfer: een vast totaal.",
+ "On a segmented kpi: the field with the whole.": "Bij een verdeeld kerncijfer: het veld met het totaal.",
+ "On a segmented kpi: the unit after the figure.": "Bij een verdeeld kerncijfer: de eenheid na het getal.",
+ "On a segmented kpi: up to five parts, each field, label and tone.": "Bij een verdeeld kerncijfer: hoogstens vijf delen, elk met veld, label en toon.",
+ "On bars and chips: the label of each row.": "Bij balken en cijferlabels: het label van elke rij.",
+ "On bars: the figure a full bar stands for.": "Bij balken: het getal dat een volle balk betekent.",
+ "On bars: the figure of each row.": "Bij balken: het getal van elke rij.",
+ "On bars: the grey head line, from the first row.": "Bij balken: de grijze kopregel, uit de eerste rij.",
+ "On bars: the small heading above the note.": "Bij balken: de kleine kop boven de notitie.",
+ "On cards and highlight tasks: the fields of the second line.": "Bij kaarten en uitgelichte taken: de velden van de tweede regel.",
+ "On cards: the coming-up part.": "Bij kaarten: het deel dat binnenkort komt.",
+ "On cards: the first letter of the title in a circle.": "Bij kaarten: de eerste letter van de titel in een cirkel.",
+ "On cards: the small heading above the coming-up part.": "Bij kaarten: de kleine kop boven het deel dat binnenkort komt.",
+ "On cards: the text beside the status; on bars: the note under the bars, from the first row.": "Bij kaarten: de tekst naast de status; bij balken: de notitie onder de balken, uit de eerste rij.",
+ "On chips: a mark below this is marked as below the pass mark.": "Bij cijferlabels: een cijfer hieronder krijgt het teken onvoldoende.",
+ "On chips: the average of each row.": "Bij cijferlabels: het gemiddelde van elke rij.",
+ "On chips: the list of marks of each row.": "Bij cijferlabels: de lijst met cijfers van elke rij.",
+ "On highlight tasks: the small uppercase label.": "Bij uitgelichte taken: het kleine label in hoofdletters.",
+ "On highlight tasks: the words on the button.": "Bij uitgelichte taken: de tekst op de knop.",
+ "On rows and cards: the field shown as a status pill.": "Bij rijen en kaarten: het veld dat als statuslabel verschijnt.",
+ "On rows and cards: the tone of each status value (neutral, success, warning, error).": "Bij rijen en kaarten: de toon van elke statuswaarde (neutraal, gelukt, waarschuwing, fout).",
+ "On rows: the field drawn as a date tile.": "Bij rijen: het veld dat als datumtegel verschijnt.",
+ "On rows: the line shown in quotes.": "Bij rijen: de regel tussen aanhalingstekens.",
+ "On rows: the line under the status pill.": "Bij rijen: de regel onder het statuslabel.",
+ "On rows: the second line.": "Bij rijen: de tweede regel.",
+ "On the website": "Op de website",
+ "The field with the date or moment before which a row is not shown, in a list, an inbox or a read by id, on the server clock (site-school-blocks).": "Het veld met de datum of het moment waarvoor een rij niet zichtbaar is, in een lijst, een postvak of een opvraging per id, volgens de klok van de server (site-school-blocks).",
+ "The slug of the portal whose public website shows this item when `public` is on. Empty means no website shows it.": "De slug van het portaal waarvan de openbare website dit bericht toont als `public` aan staat. Leeg betekent dat geen website het toont.",
+ "The words the public website shows beside the date to say who the item is for, such as 'groep 7' or 'hele school'. Written by staff, because the site never reads the school app's groups for a visitor who is not signed in. Empty shows nothing.": "De woorden die de openbare website naast de datum toont om te zeggen voor wie het bericht is, zoals 'groep 7' of 'hele school'. Geschreven door medewerkers, omdat de site de groepen van de school niet leest voor een bezoeker die niet is ingelogd. Leeg toont niets.",
+ "Visible from field": "Veld zichtbaar vanaf",
+ "Website": "Website",
+ "Whether the item also shows on the public website of `portal`, for visitors who are not signed in. Off by default: a news item is for its audience only until staff turn this on. An item that targets single children never shows publicly, whatever this says (PublicNewsReader).": "Of het bericht ook op de openbare website van `portal` staat, voor bezoekers die niet zijn ingelogd. Standaard uit: een bericht is alleen voor de eigen doelgroep tot medewerkers dit aanzetten. Een bericht voor losse kinderen staat nooit openbaar, wat hier ook staat (PublicNewsReader).",
+ "Who it is for, on the website": "Voor wie, op de website",
+ "avatar": "letter in een cirkel",
+ "averageField": "veld met het gemiddelde",
+ "buttonLabel": "tekst op de knop",
+ "captionField": "veld met de kopregel",
+ "dateField": "veld met de datum",
+ "eyebrow": "label boven de titel",
+ "labelField": "veld met het label",
+ "lowBelow": "onvoldoende onder",
+ "max": "maximum",
+ "noteField": "veld met de notitie",
+ "noteLabel": "kop boven de notitie",
+ "quoteField": "veld met het citaat",
+ "segments": "delen",
+ "showDate": "datum tonen",
+ "soonField": "veld met wat binnenkort komt",
+ "soonLabel": "kop boven wat binnenkort komt",
+ "statusField": "veld met de status",
+ "statusNoteField": "veld met de statusnotitie",
+ "statusTones": "tonen per status",
+ "subtitleField": "veld met de tweede regel",
+ "subtitleFields": "velden van de tweede regel",
+ "target": "doel",
+ "totalField": "veld met het totaal",
+ "unit": "eenheid",
+ "valueField": "veld met de waarde",
+ "valuesField": "veld met de waarden"
},
"plurals": "",
"pluralForm": "nplurals=2; plural=(n != 1);"
diff --git a/lib/Controller/PortalPageController.php b/lib/Controller/PortalPageController.php
index 3f6bf794d..225728d88 100644
--- a/lib/Controller/PortalPageController.php
+++ b/lib/Controller/PortalPageController.php
@@ -535,13 +535,15 @@ private function siteThemeStylesheet(): string {
* an unthemed portal would quietly restyle a page that must render
* unstyled, and an unthemed page names no bundled family.
*
- * @return array{bridge: string, fonts: string} Paths relative to the theme app's `css/`.
+ * @return array{bridge: string, fonts: string, logoInverse: string, emblem: string} The stylesheets
+ * (relative to the theme app's `css/`) and the two logo variants (absolute).
*
* @spec openspec/changes/site-links-the-theme-bridge/specs/portaliq-cms/spec.md#requirement-the-site-must-link-the-theme-apps-public-bridge-before-a-resolved-token-set-req-stb-001
* @spec openspec/changes/site-links-the-theme-bridge/specs/portaliq-cms/spec.md#requirement-the-site-must-link-the-faces-the-theme-app-bundles-req-stb-002
+ * @spec openspec/changes/site-chrome-follows-the-design/specs/site-chrome/spec.md#requirement-the-footer-must-carry-the-motif-the-light-logo-and-the-brand-column-first
*/
private function siteThemeAppSheets(): array {
- $none = ['bridge' => '', 'fonts' => ''];
+ $none = ['bridge' => '', 'fonts' => '', 'logoInverse' => '', 'emblem' => ''];
if ($this->siteThemeStylesheet() === '') {
return $none;
}
@@ -551,6 +553,10 @@ private function siteThemeAppSheets(): array {
return [
'bridge' => (string)($shipped['bridge'] ?? ''),
'fonts' => (string)($shipped['fonts'] ?? ''),
+ // The set's light logo for the dark footer and its emblem for
+ // a watermark, absolute, or '' (site-chrome-follows-the-design).
+ 'logoInverse' => $this->siteThemeLogoUrl(variant: 'dark'),
+ 'emblem' => $this->siteThemeLogoUrl(variant: 'emblem'),
];
} catch (\Throwable) {
return $none;
@@ -576,11 +582,19 @@ private function siteThemeAppSheets(): array {
* So the resolution happens here, where the theme app's real path is
* known, and the template emits the result after the token stylesheets.
*
+ * With a `$variant` it is that variant of the set's logo
+ * (site-chrome-follows-the-design): `dark`, the light logo for the dark
+ * footer band, or `emblem`, the mark for a watermark; '' when the set
+ * ships none.
+ *
+ * @param string $variant '' for the logo, else `dark` or `emblem`.
+ *
* @return string An absolute URL, or '' when there is no logo to serve.
*
* @spec openspec/specs/portaliq-cms/spec.md#requirement-a-portals-theme-must-change-what-a-visitor-sees
+ * @spec openspec/changes/site-chrome-follows-the-design/specs/site-chrome/spec.md#requirement-the-footer-must-carry-the-motif-the-light-logo-and-the-brand-column-first
*/
- private function siteThemeLogoUrl(): string {
+ private function siteThemeLogoUrl(string $variant=''): string {
$stylesheet = $this->siteThemeStylesheet();
if ($stylesheet === '') {
return '';
@@ -593,7 +607,8 @@ private function siteThemeLogoUrl(): string {
}
try {
- $relative = $this->themeResolver->logoFileFor(theme: $theme);
+ $relative = $this->themeResolver->logoFileFor(theme: $theme, variant: $variant);
+
if ($relative === null) {
return '';
}
diff --git a/lib/Service/Cms/PortalShell.php b/lib/Service/Cms/PortalShell.php
index b54e86014..8e91c42ce 100644
--- a/lib/Service/Cms/PortalShell.php
+++ b/lib/Service/Cms/PortalShell.php
@@ -39,13 +39,16 @@ class PortalShell {
*/
public const HEADER_VARIANTS = ['double', 'single'];
+
/**
* Constructor.
*
- * @param PortalRegionResolver $regions The closed list of regions.
+ * @param PortalRegionResolver $regions The closed list of regions.
+ * @param PortalSignInText $signInText The sign-in page's text.
*/
public function __construct(
private readonly PortalRegionResolver $regions=new PortalRegionResolver(),
+ private readonly PortalSignInText $signInText=new PortalSignInText(),
) {
}//end __construct()
@@ -54,19 +57,57 @@ public function __construct(
*
* @param array
- {{ t('Log in to view your information.') }} -
-
- {{
+
+
+ {{ t('Log in to view your information.') }}
+
+ {{
+ t(
+ 'No login method is configured for this organisation yet.',
+ )
+ }}
+
+ {{ t('Welcome') }}
+
+
+
+