/* Shared opt-in form composition; field and button skins remain canonical. */
.twoip-form-shell {
  --twoip-form-gap: 24px;
  width: 100%;
  min-width: 0;
}
.twoip-form-stack { display: grid; gap: var(--twoip-form-gap, 24px); min-width: 0; }
.twoip-form-stack > .twoip-form-group { padding-block:0; }
.twoip-form-stack > .twoip-form-group,
.twoip-form-stack .twoip-form-fields > .twoip-current-grid > .twoip-form-group { margin: 0; }
.twoip-form-stack > p { margin: 0; color: var(--twoip-on-surface-variant); }
.twoip-form-fields { row-gap: var(--twoip-form-gap, 24px); }
.twoip-form-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 12px; }
.twoip-form-links { text-align: center; }
.twoip-form-heading { margin-block: 0 24px; padding: 0; border: 0; }
body .t3-mainbody .t3-content .twoip-form-heading .page-title { display: flex; align-items: center; justify-content: center; gap: 12px; margin: 0; font-size: 28px; line-height: 1.25; }
.twoip-form-heading-icon { display: grid; place-items: center; flex: 0 0 44px; width: 44px; height: 44px; border-radius: var(--twoip-radius-full); color: var(--twoip-primary); background: var(--twoip-primary-container); }
.twoip-form-heading-icon .twoip-icon { position: static; margin: 0; font-size: 20px; line-height: 1; color: currentColor; }
/* Joomla owns the visibility/strength logic and the existing inner input-group. */
.password-group { min-width: 0; }
body .twoip-form-group .password-group > .input-group { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 12px; width: 100%; }
.password-group > .input-group > :is(.form-control,.twoip-input-field) { grid-column: 1 / -1; width: 100%; min-width: 0; }
.password-group .login-remember { justify-self: end; margin: 0; }
.password-group .login-remember label { display: inline-flex; align-items: center; min-height: 44px; margin: 0; padding: 0; font: inherit; color: var(--twoip-on-surface); }
.input-password-toggle .icon-fw { display: inline-grid; place-items: center; width: 20px; height: 20px; flex: 0 0 20px; color: currentColor; }
.input-password-toggle .icon-fw::before { font-family: "Font Awesome 7 Free"; font-style: normal; font-weight: 900; line-height: 1; }
.input-password-toggle .icon-eye::before { content: "\f06e"; }
.input-password-toggle .icon-eye-slash::before { content: "\f070"; }
.password-group meter { display: block; width: 100%; height: 8px; margin-block: 8px; border: 0; border-radius: var(--twoip-radius-full); background: var(--twoip-surface-container-high); }
.password-group meter::-webkit-meter-bar { border: 0; border-radius: var(--twoip-radius-full); background: var(--twoip-surface-container-high); box-shadow: none; }
.password-group meter::-webkit-meter-optimum-value { background: var(--twoip-success); border-radius: var(--twoip-radius-full); }
.password-group meter::-webkit-meter-suboptimum-value { background: var(--twoip-warning); border-radius: var(--twoip-radius-full); }
.password-group meter::-webkit-meter-even-less-good-value { background: var(--twoip-error); border-radius: var(--twoip-radius-full); }
.password-group meter::-moz-meter-bar { background: var(--twoip-success); border-radius: var(--twoip-radius-full); }
.twoip-password-rules, .password-group output { display: block; margin-block: 6px 0; font-size: 14px; line-height: 1.4; color: var(--twoip-on-surface-variant); }
.password-group:has(meter[value="100"]) output { color: var(--twoip-success); }
.password-group:has(meter:not([value="100"]):not([value="0"])) output { color: var(--twoip-warning); }
.twoip-form-captcha { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; }
body .twoip-form-captcha label.twoip-control-label { position: static; margin: 0; font-size: 14px; line-height: 1.4; color: var(--twoip-on-surface-variant); }
/* CAPTCHA provider output is centered across its allocated full-width form section.
 * Published intrinsic widget dimensions reserve loading geometry, never scale the iframe. */
.twoip-captcha-control { display:grid; grid-template-columns:minmax(0,1fr); justify-items:center; align-items:start; inline-size:100%; min-inline-size:0; margin:0; padding:0; }
.twoip-captcha-control > .cf-turnstile { margin:0; flex:none; }
.twoip-captcha-control > .cf-turnstile:is([data-size="normal"],[data-size="flexible"]) { min-block-size:65px; }
.twoip-captcha-control > .cf-turnstile[data-size="normal"] { inline-size:300px; }
.twoip-captcha-control > .cf-turnstile[data-size="compact"] { inline-size:150px; min-block-size:140px; }
.twoip-captcha-control > .cf-turnstile[data-size="flexible"] { inline-size:100%; min-inline-size:300px; }
@media (max-width: 480px) {
 body .t3-mainbody .t3-content .twoip-form-heading .page-title { font-size: 24px; }
 .password-group .login-remember { grid-column: 1 / -1; justify-self: start; }
}
/* CAPTCHA groups span a grid's full form width, rather than an unlabelled input column. */
body .twoip-form-captcha:has(> .twoip-captcha-control) { grid-column:1 / -1; inline-size:100%; }

/* Shared horizontal modal forms: fields own content, the form owns rhythm. */
body .modal .modal-body > .twoip-form-horizontal { display:grid; gap:var(--twoip-service-form-control-gap); margin:0; min-inline-size:0; }
body .modal .modal-body > .twoip-form-horizontal > .twoip-form-group { margin:0; padding-block:0; min-block-size:0; }
body .modal .modal-body > .twoip-form-horizontal .form-control { margin-block:0; }
body .modal .modal-body > .twoip-form-horizontal label.twoip-control-label { margin-block:0; }
body .modal .modal-body:has(> .twoip-form-horizontal) { padding-block-end:0; }
body .modal .modal-body:has(> .twoip-form-horizontal) + .modal-footer { padding-block-start:var(--twoip-service-form-section-gap); }

/* CRUD pairs reuse the action group; only their section separation is added. */
.twoip-crud-actions { margin-block-start:var(--twoip-service-form-section-gap); }

.twoip-form-actions[hidden] { display:none; }

/* Shared property editor rows and seven-day timetable. */
.twoip-form-properties > div > .row.twoip-form-group { align-items:start; }
.twoip-form-properties .twoip-control-label { padding-block:var(--twoip-service-form-control-gap); }
.twoip-working-hours { border:0; margin:0; min-inline-size:0; }
.twoip-hours-row { display:grid; grid-template-columns:minmax(80px,1fr) minmax(0,3fr); align-items:center; gap:var(--twoip-service-form-control-gap); padding-block:8px; border-bottom:1px solid var(--twoip-outline-variant); }
.twoip-hours-row label,.twoip-hours-all { display:flex; align-items:center; gap:8px; min-height:44px; margin:0; }
.twoip-hours-times { display:grid; grid-template-columns:minmax(0,1fr) auto minmax(0,1fr); align-items:center; gap:8px; min-width:0; }
.twoip-hours-times input { min-width:0; width:100%; }
.twoip-hours-times[hidden],.twoip-working-hours [hidden] { display:none; }
.twoip-hours-row [data-hours-off] { grid-column:2; font-size:14px; color:var(--twoip-on-surface-variant); }
@media(max-width:767px){
 .twoip-form-properties .twoip-control-label { padding-block:0; }
 .twoip-hours-row { grid-template-columns:minmax(0,1fr); gap:8px; }
 .twoip-hours-row [data-hours-off] { grid-column:1; }
}
.twoip-form-properties > div:first-child { display:grid; gap:var(--twoip-service-form-control-gap); }
.twoip-form-properties > div:first-child > .twoip-form-group { margin:0; padding-block:0; }

/* Shared body-link/action contract; component indicators and Material buttons retain their owners. */
button.twoip-inline-link { appearance:none; background:transparent; padding:0 0 1px; border-radius:0; box-shadow:none; }
body :is(.t3-mainbody .t3-content,.modal,.t3-footnav,.t3-sl-helper-wrap,.article-content,.tagssimilar,.t3-footer .email,.t3-sl-totop .advertising .mediakit) .twoip-inline-link { color:var(--twoip-link-text); }
body :is(.t3-mainbody .t3-content,.modal,.t3-footnav,.t3-sl-helper-wrap,.article-content,.tagssimilar,.t3-footer .email,.t3-sl-totop .advertising .mediakit) .twoip-inline-link:is(:hover,:focus-visible) { color:var(--twoip-inline-hover); border-bottom-color:var(--twoip-inline-hover); }
body :is(.t3-mainbody .t3-content,.modal,.t3-footnav,.t3-sl-helper-wrap,.article-content,.tagssimilar,.t3-footer .email,.t3-sl-totop .advertising .mediakit) .twoip-inline-link:active { color:var(--twoip-inline-pressed); border-bottom-color:var(--twoip-inline-pressed); }
body .btn .twoip-inline-label { border-bottom:0; text-decoration:none; }
/* Legacy footer columns are presentation wrappers, not separate action rows. */
body .modal .modal-footer > .twoip-current-grid:has(> .btn):not(:has(input:not([type="hidden"]),select,textarea)) { display:contents; }
.twoip-form-actions--end { justify-content:flex-end; }
body .modal-dialog-centered.modal-dialog-scrollable .modal-content { max-block-size:90dvh; }
body :is(.t3-mainbody .t3-content,.modal) textarea.form-control.twoip-form-textarea--compact { block-size:200px; min-block-size:180px; resize:vertical; }

/* Pressed state wins over the shared body hover specificity. */
body :is(.t3-mainbody .t3-content,.modal,.t3-footnav,.t3-sl-helper-wrap,.article-content,.tagssimilar,.t3-footer .email,.t3-sl-totop .advertising .mediakit) .twoip-inline-link:active { color:var(--twoip-inline-pressed); border-bottom-color:var(--twoip-inline-pressed); }
