forked from fa/breadcrumb-the-shire
Replace the single tenant avatar with a pair of theme-scoped brand logos.
Render only the theme-matching <img> server-side and swap src on theme
toggle via a JS hook — no reload, no double request, no CSS tricks.
Tenant logos
- TenantLogoService (ImageUploadTrait) with theme whitelist and per-theme
storage storage/tenants/{uuid}/logo/{light|dark}/, SIZES 128/256/512
- Public serving endpoint auth/tenant-logo-file so login can show the
logo pre-auth; matching authenticated admin preview endpoint
- appTenantLogoUrl(?size, ?theme) with 4-step fallback cascade; PDF +
mail always request 'light'
- Admin tenant edit: avatar block replaced by "Tenant logos" details
block inside the Master-data tab, two side-by-side slots via Pico
.grid with the core app-file-upload partial
- Policy rename ABILITY_ADMIN_TENANTS_AVATAR_VIEW -> LOGO_VIEW, action
routes logo / logo-delete / logo-file with theme body/query param
- API endpoint path kept (backward compat), internals on new service
- CLI tenant:logo-migrate-avatars moves legacy avatar/ -> logo/light/
idempotently (--dry-run, --yes, --cleanup)
- i18n "Tenant image" removed, 12 new keys synced across de/en
File upload component
- Full-width preview + filename/actions below (3D stack layout)
- Fixed 16:9 aspect ratio with 1rem inner padding for consistent
preview size across any logo aspect
- Transparency checker pattern as background so black logos stay
visible on dark mode and white logos on light mode
- form="" + deleteFormId support so the partial works with barrier
forms inside another form
Buttons
- width:100% dropped from button[type="submit"]; scoped back via
.login-main for the auth-flow primary CTA
- .outline base rule now tints background via color-mix of --app-color
so secondary/primary/danger outlines all gain a subtle surface
- .outline.secondary restyled Stripe-style in both themes: solid white
chip with soft shadow in light, solid elevated dark chip with white
text in dark; neutral border replaces role-colored border
- .app-action-success/.app-action-danger outlines get color-mix bg +
theme-aware outline-text tokens for stronger contrast
- Filled .primary/.app-action-success/.app-action-danger get raised
box-shadow (inset highlight + drop) — opt-in via class so chrome
buttons stay flat
- Dropped the legacy .secondary utility that was clobbering the
custom-property cascade with a hardcoded muted color
Theme swap
- Logo img carries data-src-light + data-src-dark; theme-toggle JS
swaps src when data-theme changes, keeping the topbar/login logo in
sync without a page reload
Quality gates: PHPUnit (2045), PHPStan L5, CS-Fixer, docs link/drift,
codex skills sync — all green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3046 lines
75 KiB
CSS
3046 lines
75 KiB
CSS
@charset "UTF-8";
|
||
|
||
@layer layout {
|
||
a {
|
||
--app-text-decoration: underline;
|
||
}
|
||
|
||
a.contrast,
|
||
a.secondary {
|
||
--app-text-decoration: underline;
|
||
}
|
||
|
||
small {
|
||
--app-font-size: 0.875em;
|
||
line-height: var(--leading-loose);
|
||
}
|
||
|
||
div#debugger-bar {
|
||
display: none;
|
||
}
|
||
|
||
@media (min-width: 768px) {
|
||
.app-container.is-sidebar-hidden .app-sidebar {
|
||
display: none;
|
||
}
|
||
|
||
.sidebar-hidden .app-sidebar {
|
||
display: none;
|
||
}
|
||
}
|
||
|
||
h1,
|
||
h2,
|
||
h3,
|
||
h4,
|
||
h5,
|
||
h6 {
|
||
--app-font-weight: var(--font-bold);
|
||
}
|
||
|
||
h1 {
|
||
--app-font-size: var(--text-page-title);
|
||
--app-line-height: var(--leading-tight);
|
||
--app-typography-spacing-top: 3rem;
|
||
}
|
||
|
||
h2 {
|
||
--app-font-size: var(--text-title);
|
||
--app-line-height: var(--leading-tight);
|
||
--app-typography-spacing-top: 2.625rem;
|
||
}
|
||
|
||
h3 {
|
||
--app-font-size: var(--text-lg);
|
||
--app-line-height: var(--leading-tight);
|
||
--app-typography-spacing-top: 2.25rem;
|
||
}
|
||
|
||
h4 {
|
||
--app-font-size: var(--text-base);
|
||
--app-line-height: var(--leading-tight);
|
||
--app-typography-spacing-top: 1.874rem;
|
||
}
|
||
|
||
h5 {
|
||
--app-font-size: var(--text-sm);
|
||
--app-line-height: var(--leading-tight);
|
||
--app-typography-spacing-top: 1.6875rem;
|
||
}
|
||
|
||
h6 {
|
||
--app-font-size: var(--text-sm);
|
||
--app-line-height: var(--leading-tight);
|
||
--app-typography-spacing-top: 1.5rem;
|
||
}
|
||
|
||
tfoot td,
|
||
tfoot th,
|
||
thead td,
|
||
thead th {
|
||
--app-font-weight: var(--font-semibold);
|
||
--app-border-width: 2px;
|
||
}
|
||
|
||
code,
|
||
kbd,
|
||
pre,
|
||
samp {
|
||
--app-font-family: var(--app-font-family-monospace);
|
||
}
|
||
|
||
kbd {
|
||
--app-font-weight: var(--font-bold);
|
||
}
|
||
|
||
:where(select, textarea),
|
||
input:not(
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="file"]
|
||
) {
|
||
--app-outline-width: 0.0625rem;
|
||
}
|
||
|
||
[type="checkbox"],
|
||
[type="radio"] {
|
||
--app-border-width: 0.125rem;
|
||
}
|
||
|
||
[type="checkbox"][role="switch"] {
|
||
--app-border-width: 0.1875rem;
|
||
}
|
||
|
||
details.dropdown summary:not([role="button"]) {
|
||
--app-outline-width: 0.0625rem;
|
||
}
|
||
|
||
nav details.dropdown summary:focus-visible {
|
||
--app-outline-width: 0.125rem;
|
||
}
|
||
|
||
[role="search"] {
|
||
--app-border-radius: 5rem;
|
||
}
|
||
|
||
[role="group"]:has(
|
||
button.secondary:focus,
|
||
[type="submit"].secondary:focus,
|
||
[type="button"].secondary:focus,
|
||
[role="button"].secondary:focus
|
||
),
|
||
[role="search"]:has(
|
||
button.secondary:focus,
|
||
[type="submit"].secondary:focus,
|
||
[type="button"].secondary:focus,
|
||
[role="button"].secondary:focus
|
||
) {
|
||
--app-group-box-shadow-focus-with-button: 0 0 0 var(--app-outline-width)
|
||
var(--app-secondary-focus);
|
||
}
|
||
|
||
[role="group"]:has(
|
||
button.contrast:focus,
|
||
[type="submit"].contrast:focus,
|
||
[type="button"].contrast:focus,
|
||
[role="button"].contrast:focus
|
||
),
|
||
[role="search"]:has(
|
||
button.contrast:focus,
|
||
[type="submit"].contrast:focus,
|
||
[type="button"].contrast:focus,
|
||
[role="button"].contrast:focus
|
||
) {
|
||
--app-group-box-shadow-focus-with-button: 0 0 0 var(--app-outline-width)
|
||
var(--app-contrast-focus);
|
||
}
|
||
|
||
[role="group"] [role="button"],
|
||
[role="group"] [type="button"],
|
||
[role="group"] [type="submit"],
|
||
[role="group"] button,
|
||
[role="search"] [role="button"],
|
||
[role="search"] [type="button"],
|
||
[role="search"] [type="submit"],
|
||
[role="search"] button {
|
||
--app-form-element-spacing-horizontal: 2rem;
|
||
}
|
||
|
||
[role="group"] form:last-child button {
|
||
border-top-left-radius: 0;
|
||
border-bottom-left-radius: 0;
|
||
}
|
||
|
||
table td [role="group"] {
|
||
margin: 0;
|
||
}
|
||
|
||
th {
|
||
text-transform: uppercase;
|
||
font-size: var(--text-xs);
|
||
letter-spacing: var(--tracking-wide);
|
||
border-top: 1px solid var(--app-border);
|
||
}
|
||
|
||
table td .grid-actions button,
|
||
table td .grid-actions [role="button"] {
|
||
padding: 4px 10px;
|
||
color: var(--app-muted-color);
|
||
border: 1px solid var(--app-border);
|
||
font-size: var(--text-sm);
|
||
background: var(--app-form-element-background-color);
|
||
box-shadow: var(--app-group-box-shadow);
|
||
}
|
||
|
||
table td .grid-actions button:has(i),
|
||
table td .grid-actions [role="button"]:has(i) {
|
||
max-width: 42px;
|
||
}
|
||
|
||
table td .grid-actions button:hover,
|
||
table td .grid-actions [role="button"]:hover {
|
||
color: var(--app-contrast);
|
||
}
|
||
|
||
details summary[role="button"]:not(.outline)::after {
|
||
filter: brightness(0) invert(1);
|
||
}
|
||
|
||
[aria-busy="true"]:not(input, select, textarea):is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[role="button"]
|
||
):not(.outline)::before {
|
||
filter: brightness(0) invert(1);
|
||
}
|
||
|
||
@media only screen and (prefers-color-scheme: dark) {
|
||
:host(:not([data-theme]))
|
||
details
|
||
summary[role="button"].contrast:not(.outline)::after,
|
||
:root:not([data-theme])
|
||
details
|
||
summary[role="button"].contrast:not(.outline)::after {
|
||
filter: brightness(0);
|
||
}
|
||
|
||
:host(:not([data-theme]))
|
||
[aria-busy="true"]:not(input, select, textarea).contrast:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[role="button"]
|
||
):not(.outline)::before,
|
||
:root:not([data-theme])
|
||
[aria-busy="true"]:not(input, select, textarea).contrast:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[role="button"]
|
||
):not(.outline)::before {
|
||
filter: brightness(0);
|
||
}
|
||
}
|
||
|
||
[data-theme="dark"]
|
||
details
|
||
summary[role="button"].contrast:not(.outline)::after {
|
||
filter: brightness(0);
|
||
}
|
||
|
||
[data-theme="dark"]
|
||
[aria-busy="true"]:not(input, select, textarea).contrast:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[role="button"]
|
||
):not(.outline)::before {
|
||
filter: brightness(0);
|
||
}
|
||
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
progress {
|
||
accent-color: var(--app-primary);
|
||
}
|
||
|
||
*,
|
||
::after,
|
||
::before {
|
||
box-sizing: border-box;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
::after,
|
||
::before {
|
||
text-decoration: inherit;
|
||
vertical-align: inherit;
|
||
}
|
||
|
||
:where(:host),
|
||
:where(:root) {
|
||
-webkit-tap-highlight-color: transparent;
|
||
-webkit-text-size-adjust: 100%;
|
||
-moz-text-size-adjust: 100%;
|
||
text-size-adjust: 100%;
|
||
background-color: var(--app-background-color);
|
||
color: var(--app-color);
|
||
font-weight: var(--app-font-weight);
|
||
font-size: var(--app-font-size);
|
||
line-height: var(--app-line-height);
|
||
font-family: var(--app-font-family);
|
||
text-underline-offset: var(--app-text-underline-offset);
|
||
text-rendering: optimizeLegibility;
|
||
overflow-wrap: break-word;
|
||
-moz-tab-size: 4;
|
||
-o-tab-size: 4;
|
||
tab-size: 4;
|
||
}
|
||
|
||
body {
|
||
width: 100%;
|
||
margin: 0;
|
||
}
|
||
|
||
main {
|
||
display: block;
|
||
}
|
||
|
||
body > main {
|
||
padding-block: var(--app-block-spacing-vertical);
|
||
}
|
||
|
||
/* Footer layout, spacing and colors live in components/app-footer.css. */
|
||
|
||
header[data-align="center"],
|
||
hgroup[data-align="center"] > h1,
|
||
hgroup[data-align="center"] > h2,
|
||
hgroup[data-align="center"] > h3,
|
||
hgroup[data-align="center"] > p,
|
||
hgroup[data-align="center"] > *,
|
||
hgroup[data-align="center"] {
|
||
text-align: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
section {
|
||
margin-bottom: var(--app-block-spacing-vertical);
|
||
}
|
||
|
||
.container-small {
|
||
max-width: 420px;
|
||
margin-right: auto;
|
||
margin-left: auto;
|
||
}
|
||
|
||
.container,
|
||
.container-fluid {
|
||
width: 100%;
|
||
margin-right: auto;
|
||
margin-left: auto;
|
||
padding-right: var(--app-spacing);
|
||
padding-left: var(--app-spacing);
|
||
}
|
||
|
||
.app-main-content {
|
||
padding-inline: calc(var(--app-spacing) * 1);
|
||
padding-block-start: var(--app-spacing);
|
||
}
|
||
|
||
/* Details pages provide their own sticky titlebar with padding — let it manage
|
||
the gap to the topbar itself, don't double it. */
|
||
.app-main-content:has(.app-details-container) {
|
||
padding-block-start: 0;
|
||
}
|
||
|
||
@media (min-width: 576px) {
|
||
.container {
|
||
max-width: 510px;
|
||
padding-right: 0;
|
||
padding-left: 0;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 768px) {
|
||
.container {
|
||
max-width: 700px;
|
||
}
|
||
.app-container.is-sidebar-hidden:has(.aside-icon-bar):has(.app-sidebar) {
|
||
display: grid;
|
||
min-height: calc(100dvh - var(--app-topbar-height));
|
||
align-items: stretch;
|
||
grid-template-columns: minmax(0, 52px) minmax(0, 1fr);
|
||
}
|
||
.sidebar-hidden .app-container:has(.aside-icon-bar):has(.app-sidebar) {
|
||
grid-template-columns: minmax(0, 52px) minmax(0, 1fr);
|
||
}
|
||
.app-container:has(.aside-icon-bar):has(.app-sidebar) {
|
||
display: grid;
|
||
min-height: calc(100dvh - var(--app-topbar-height));
|
||
align-items: stretch;
|
||
grid-template-columns: minmax(0, 52px) minmax(0, 220px) minmax(0, 1fr);
|
||
}
|
||
.app-container.is-sidebar-collapsed:has(.aside-icon-bar):has(.app-sidebar) {
|
||
display: grid;
|
||
min-height: calc(100dvh - var(--app-topbar-height));
|
||
align-items: stretch;
|
||
grid-template-columns: minmax(0, 52px) minmax(0, 220px) minmax(0, 1fr);
|
||
}
|
||
|
||
.app-container.is-sidebar-collapsed {
|
||
grid-template-columns: minmax(0, 52px) minmax(0, 220px) minmax(0, 1fr);
|
||
}
|
||
|
||
.sidebar-collapsed .app-container {
|
||
grid-template-columns: minmax(0, 52px) minmax(0, 220px) minmax(0, 1fr);
|
||
}
|
||
|
||
.app-main {
|
||
border-left: 1px solid var(--app-border);
|
||
min-height: calc(100dvh - var(--app-topbar-height));
|
||
background: var(--app-background-color);
|
||
}
|
||
|
||
.app-main-content {
|
||
padding-inline: calc(var(--app-spacing) * 2);
|
||
padding-block-start: calc(var(--app-spacing) * 2);
|
||
margin-bottom: calc(var(--app-spacing) * 2);
|
||
}
|
||
.app-main-content:has(.app-details-container) {
|
||
margin-bottom: 0;
|
||
padding: 0;
|
||
position: relative;
|
||
z-index: 1;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 1024px) {
|
||
.container {
|
||
max-width: 950px;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 1280px) {
|
||
.container {
|
||
max-width: 1200px;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 1536px) {
|
||
.container {
|
||
max-width: 1450px;
|
||
}
|
||
}
|
||
|
||
.grid {
|
||
grid-column-gap: var(--app-grid-column-gap);
|
||
grid-row-gap: var(--app-grid-row-gap);
|
||
display: grid;
|
||
--app-grid-template-columns: 1fr;
|
||
grid-template-columns: var(--app-grid-template-columns);
|
||
}
|
||
|
||
.flex {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: var(--app-flex-gap);
|
||
}
|
||
|
||
.flex h1,
|
||
.flex h2,
|
||
.flex h3,
|
||
.flex h4,
|
||
.flex h5,
|
||
.flex h6 {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.align-center {
|
||
align-items: center;
|
||
}
|
||
|
||
.align-flex-start {
|
||
align-items: flex-start;
|
||
}
|
||
|
||
.justify-space-between {
|
||
justify-content: space-between;
|
||
}
|
||
|
||
@media (min-width: 768px) {
|
||
.grid {
|
||
--app-grid-template-columns: repeat(auto-fit, minmax(0%, 1fr));
|
||
}
|
||
|
||
.grid.grid-2,
|
||
.grid.grid-1-1 {
|
||
--app-grid-template-columns: repeat(2, minmax(0%, 1fr));
|
||
}
|
||
|
||
.grid.grid-3 {
|
||
--app-grid-template-columns: repeat(3, minmax(0%, 1fr));
|
||
}
|
||
|
||
.grid.grid-4 {
|
||
--app-grid-template-columns: repeat(4, minmax(0%, 1fr));
|
||
}
|
||
|
||
.grid.grid-5 {
|
||
--app-grid-template-columns: repeat(5, minmax(0%, 1fr));
|
||
}
|
||
|
||
.grid.grid-6 {
|
||
--app-grid-template-columns: repeat(6, minmax(0%, 1fr));
|
||
}
|
||
|
||
.grid.grid-1-2 {
|
||
--app-grid-template-columns: minmax(0%, 1fr) minmax(0%, 2fr);
|
||
}
|
||
|
||
.grid.grid-2-1 {
|
||
--app-grid-template-columns: minmax(0%, 2fr) minmax(0%, 1fr);
|
||
}
|
||
|
||
.grid.grid-1-3 {
|
||
--app-grid-template-columns: minmax(0%, 1fr) minmax(0%, 3fr);
|
||
}
|
||
|
||
.grid.grid-3-1 {
|
||
--app-grid-template-columns: minmax(0%, 3fr) minmax(0%, 1fr);
|
||
}
|
||
}
|
||
|
||
.grid > * {
|
||
min-width: 0;
|
||
}
|
||
|
||
.overflow-auto {
|
||
overflow: auto;
|
||
}
|
||
|
||
b,
|
||
strong {
|
||
font-weight: bolder;
|
||
}
|
||
|
||
sub,
|
||
sup {
|
||
position: relative;
|
||
font-size: 0.75em; /* em-relative sizing — intentional, scales with parent */
|
||
line-height: 0; /* intentional px — sub/sup vertical alignment */
|
||
vertical-align: baseline;
|
||
}
|
||
|
||
sub {
|
||
bottom: -0.25em;
|
||
}
|
||
|
||
sup {
|
||
top: -0.5em;
|
||
}
|
||
|
||
address,
|
||
blockquote,
|
||
dl,
|
||
ol,
|
||
p,
|
||
pre,
|
||
table,
|
||
ul {
|
||
margin-top: 0;
|
||
margin-bottom: var(--app-typography-spacing-vertical);
|
||
color: var(--app-color);
|
||
font-style: normal;
|
||
font-weight: var(--app-font-weight);
|
||
}
|
||
|
||
h1,
|
||
h2,
|
||
h3,
|
||
h4,
|
||
h5,
|
||
h6 {
|
||
margin-top: 0;
|
||
margin-bottom: var(--app-typography-spacing-vertical);
|
||
color: var(--app-color);
|
||
font-weight: var(--app-font-weight);
|
||
font-size: var(--app-font-size);
|
||
line-height: var(--app-line-height);
|
||
font-family: var(--app-font-family);
|
||
}
|
||
|
||
h1 {
|
||
--app-color: var(--app-h1-color);
|
||
}
|
||
|
||
h2 {
|
||
--app-color: var(--app-h2-color);
|
||
}
|
||
|
||
h3 {
|
||
--app-color: var(--app-h3-color);
|
||
}
|
||
|
||
h4 {
|
||
--app-color: var(--app-h4-color);
|
||
}
|
||
|
||
h5 {
|
||
--app-color: var(--app-h5-color);
|
||
}
|
||
|
||
h6 {
|
||
--app-color: var(--app-h6-color);
|
||
}
|
||
|
||
:where(article, address, blockquote, dl, figure, form, ol, p, pre, table, ul)
|
||
~ :is(h1, h2, h3, h4, h5, h6) {
|
||
margin-top: var(--app-typography-spacing-top);
|
||
}
|
||
|
||
p {
|
||
margin-bottom: var(--app-typography-spacing-vertical);
|
||
}
|
||
|
||
hgroup {
|
||
margin-bottom: var(--app-typography-spacing-vertical);
|
||
}
|
||
|
||
.flex hgroup {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
hgroup > * {
|
||
margin-top: 0;
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
hgroup > :not(:first-child):last-child {
|
||
--app-color: var(--app-muted-color);
|
||
--app-font-weight: unset;
|
||
font-size: var(--text-base);
|
||
}
|
||
|
||
:where(ol, ul) li {
|
||
margin-bottom: calc(var(--app-typography-spacing-vertical) * 0.25);
|
||
}
|
||
|
||
:where(dl, ol, ul) :where(dl, ol, ul) {
|
||
margin: 0;
|
||
margin-top: calc(var(--app-typography-spacing-vertical) * 0.25);
|
||
}
|
||
|
||
ul li {
|
||
list-style: square;
|
||
}
|
||
|
||
mark {
|
||
padding: 0.125rem 0.25rem;
|
||
background-color: var(--app-mark-background-color);
|
||
color: var(--app-mark-color);
|
||
vertical-align: baseline;
|
||
}
|
||
|
||
abbr[title] {
|
||
border-bottom: 1px dotted;
|
||
text-decoration: none;
|
||
cursor: help;
|
||
}
|
||
|
||
ins {
|
||
color: var(--app-ins-color);
|
||
text-decoration: none;
|
||
}
|
||
|
||
del {
|
||
color: var(--app-del-color);
|
||
}
|
||
|
||
::-moz-selection {
|
||
background-color: var(--app-text-selection-color);
|
||
}
|
||
|
||
::selection {
|
||
background-color: var(--app-text-selection-color);
|
||
}
|
||
|
||
:where(a:not([role="button"])),
|
||
[role="link"] {
|
||
--app-color: var(--app-primary);
|
||
--app-background-color: transparent;
|
||
--app-underline: var(--app-primary-underline);
|
||
outline: 0;
|
||
background-color: var(--app-background-color);
|
||
color: cornflowerblue;
|
||
-webkit-text-decoration: var(--app-text-decoration);
|
||
text-decoration: var(--app-text-decoration);
|
||
text-decoration-color: var(--app-underline);
|
||
text-underline-offset: 0.125em;
|
||
transition:
|
||
background-color var(--app-transition),
|
||
color var(--app-transition),
|
||
box-shadow var(--app-transition),
|
||
-webkit-text-decoration var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
color var(--app-transition),
|
||
text-decoration var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
color var(--app-transition),
|
||
text-decoration var(--app-transition),
|
||
box-shadow var(--app-transition),
|
||
-webkit-text-decoration var(--app-transition);
|
||
}
|
||
|
||
:where(a:not([role="button"])):is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[role="link"]:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-color: var(--app-primary-hover);
|
||
--app-underline: var(--app-primary-hover-underline);
|
||
--app-text-decoration: underline;
|
||
}
|
||
|
||
:where(a:not([role="button"])):focus-visible,
|
||
[role="link"]:focus-visible {
|
||
box-shadow: 0 0 0 var(--app-outline-width) var(--app-primary-focus);
|
||
}
|
||
|
||
:where(a:not([role="button"])).secondary,
|
||
[role="link"].secondary {
|
||
--app-color: var(--app-secondary);
|
||
--app-underline: var(--app-secondary-underline);
|
||
}
|
||
|
||
:where(a:not([role="button"])).secondary:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[role="link"].secondary:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-color: var(--app-secondary-hover);
|
||
--app-underline: var(--app-secondary-hover-underline);
|
||
}
|
||
|
||
:where(a:not([role="button"])).contrast,
|
||
[role="link"].contrast {
|
||
--app-color: var(--app-contrast);
|
||
--app-underline: var(--app-contrast-underline);
|
||
}
|
||
|
||
:where(a:not([role="button"])).contrast:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[role="link"].contrast:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-color: var(--app-contrast-hover);
|
||
--app-underline: var(--app-contrast-hover-underline);
|
||
}
|
||
|
||
a[role="button"] {
|
||
display: inline-block;
|
||
}
|
||
|
||
button {
|
||
margin: 0;
|
||
overflow: visible;
|
||
font-family: inherit;
|
||
text-transform: none;
|
||
}
|
||
|
||
a.transparent[role="button"],
|
||
button.transparent,
|
||
.transparent[role="button"] {
|
||
background: transparent;
|
||
border: none;
|
||
box-shadow: none;
|
||
color: var(--app-muted-color);
|
||
}
|
||
a.transparent[role="button"]:hover,
|
||
button.transparent:hover,
|
||
.transparent[role="button"]:hover {
|
||
background: var(--app-muted-border-color);
|
||
color: var(--app-contrast);
|
||
}
|
||
|
||
[type="button"],
|
||
[type="reset"],
|
||
[type="submit"],
|
||
button {
|
||
-webkit-appearance: button;
|
||
}
|
||
|
||
[role="button"],
|
||
[type="button"],
|
||
[type="file"]::file-selector-button,
|
||
[type="reset"],
|
||
[type="submit"],
|
||
button {
|
||
--app-background-color: var(--app-primary-background);
|
||
--app-border-color: var(--app-primary-border);
|
||
--app-color: var(--app-primary-inverse);
|
||
--app-box-shadow: var(--app-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));
|
||
padding: var(--app-button-padding-vertical)
|
||
var(--app-button-padding-horizontal);
|
||
border: var(--app-border-width) solid var(--app-border-color);
|
||
border-radius: var(--app-border-radius);
|
||
outline: 0;
|
||
background-color: var(--app-background-color);
|
||
box-shadow: var(--app-box-shadow);
|
||
color: var(--app-color);
|
||
font-weight: var(--app-font-weight);
|
||
font-size: var(--text-base);
|
||
line-height: var(--app-line-height);
|
||
text-align: center;
|
||
text-decoration: none;
|
||
cursor: pointer;
|
||
-webkit-user-select: none;
|
||
-moz-user-select: none;
|
||
user-select: none;
|
||
transition:
|
||
background-color var(--app-transition),
|
||
border-color var(--app-transition),
|
||
color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
}
|
||
|
||
:where(
|
||
button,
|
||
[type="submit"],
|
||
[type="reset"],
|
||
[type="button"],
|
||
[role="button"]
|
||
).small {
|
||
--app-button-padding-vertical: var(--app-button-padding-vertical-small);
|
||
--app-button-padding-horizontal: var(--app-button-padding-horizontal-small);
|
||
font-size: var(--text-sm);
|
||
}
|
||
|
||
[role="button"]:is(:hover, :active, :focus),
|
||
[role="button"]:is([aria-current]:not([aria-current="false"])),
|
||
[type="button"]:is(:hover, :active, :focus),
|
||
[type="button"]:is([aria-current]:not([aria-current="false"])),
|
||
[type="file"]::file-selector-button:is(:hover, :active, :focus),
|
||
[type="file"]::file-selector-button:is(
|
||
[aria-current]:not([aria-current="false"])
|
||
),
|
||
[type="reset"]:is(:hover, :active, :focus),
|
||
[type="reset"]:is([aria-current]:not([aria-current="false"])),
|
||
[type="submit"]:is(:hover, :active, :focus),
|
||
[type="submit"]:is([aria-current]:not([aria-current="false"])),
|
||
button:is(:hover, :active, :focus),
|
||
button:is([aria-current]:not([aria-current="false"])) {
|
||
--app-background-color: var(--app-primary-hover-background);
|
||
--app-border-color: var(--app-primary-hover-border);
|
||
--app-box-shadow: var(
|
||
--app-button-hover-box-shadow,
|
||
0 0 0 rgba(0, 0, 0, 0)
|
||
);
|
||
--app-color: var(--app-primary-inverse);
|
||
}
|
||
|
||
[role="button"]:focus,
|
||
[role="button"]:is([aria-current]:not([aria-current="false"])):focus,
|
||
[type="button"]:focus,
|
||
[type="button"]:is([aria-current]:not([aria-current="false"])):focus,
|
||
[type="file"]::file-selector-button:focus,
|
||
[type="file"]::file-selector-button:is(
|
||
[aria-current]:not([aria-current="false"])
|
||
):focus,
|
||
[type="reset"]:focus,
|
||
[type="reset"]:is([aria-current]:not([aria-current="false"])):focus,
|
||
[type="submit"]:focus,
|
||
[type="submit"]:is([aria-current]:not([aria-current="false"])):focus,
|
||
button:focus,
|
||
button:is([aria-current]:not([aria-current="false"])):focus {
|
||
--app-box-shadow:
|
||
var(--app-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
|
||
0 0 0 var(--app-outline-width) var(--app-primary-focus);
|
||
}
|
||
|
||
[type="button"],
|
||
[type="reset"] {
|
||
margin-bottom: var(--app-spacing);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).secondary,
|
||
[type="file"]::file-selector-button,
|
||
[type="reset"] {
|
||
--app-background-color: var(--app-secondary-background);
|
||
--app-border-color: var(--app-secondary-border);
|
||
--app-color: var(--app-secondary-inverse);
|
||
cursor: pointer;
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).secondary:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[type="file"]::file-selector-button:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[type="reset"]:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-background-color: var(--app-secondary-hover-background);
|
||
--app-border-color: var(--app-secondary-hover-border);
|
||
--app-color: var(--app-secondary-inverse);
|
||
}
|
||
|
||
:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[role="button"]
|
||
).secondary:focus,
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).secondary:is(
|
||
[aria-current]:not([aria-current="false"])
|
||
):focus,
|
||
[type="file"]::file-selector-button:focus,
|
||
[type="file"]::file-selector-button:is(
|
||
[aria-current]:not([aria-current="false"])
|
||
):focus,
|
||
[type="reset"]:focus,
|
||
[type="reset"]:is([aria-current]:not([aria-current="false"])):focus {
|
||
--app-box-shadow:
|
||
var(--app-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
|
||
0 0 0 var(--app-outline-width) var(--app-secondary-focus);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).contrast {
|
||
--app-background-color: var(--app-contrast-background);
|
||
--app-border-color: var(--app-contrast-border);
|
||
--app-color: var(--app-contrast-inverse);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).contrast:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-background-color: var(--app-contrast-hover-background);
|
||
--app-border-color: var(--app-contrast-hover-border);
|
||
--app-color: var(--app-contrast-inverse);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).contrast:focus,
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).contrast:is(
|
||
[aria-current]:not([aria-current="false"])
|
||
):focus {
|
||
--app-box-shadow:
|
||
var(--app-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
|
||
0 0 0 var(--app-outline-width) var(--app-contrast-focus);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).outline,
|
||
[type="reset"].outline {
|
||
--app-background-color: color-mix(in srgb, var(--app-color) 8%, transparent);
|
||
--app-color: var(--app-primary);
|
||
--app-border-color: var(--app-primary);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).outline:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[type="reset"].outline:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-background-color: color-mix(in srgb, var(--app-color) 18%, transparent);
|
||
--app-color: var(--app-primary-hover);
|
||
--app-border-color: var(--app-primary-hover);
|
||
}
|
||
|
||
:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[role="button"]
|
||
).outline.secondary,
|
||
[type="reset"].outline {
|
||
--app-color: var(--app-secondary);
|
||
--app-border-color: var(--app-secondary);
|
||
}
|
||
|
||
:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[role="button"]
|
||
).outline.secondary:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[type="reset"].outline:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-color: var(--app-secondary-hover);
|
||
--app-border-color: var(--app-secondary-hover);
|
||
}
|
||
|
||
/* Stripe-style neutral chip — solid elevated surface, high-contrast text,
|
||
subtle neutral border, medium font-weight. Theme-aware via tokens:
|
||
in light mode a white chip with soft shadow, in dark mode a lifted
|
||
dark-gray chip with white text. */
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).outline.secondary,
|
||
[type="reset"].outline {
|
||
--app-background-color: var(--app-button-neutral-bg);
|
||
--app-color: var(--app-button-neutral-color);
|
||
--app-border-color: var(--app-button-neutral-border);
|
||
box-shadow: var(--app-button-neutral-shadow);
|
||
font-weight: var(--font-medium);
|
||
}
|
||
|
||
:is(button, [type="submit"], [type="button"], [role="button"]).outline.secondary:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
),
|
||
[type="reset"].outline:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-background-color: var(--app-button-neutral-bg-hover);
|
||
--app-color: var(--app-button-neutral-color-hover);
|
||
--app-border-color: var(--app-button-neutral-border-hover);
|
||
box-shadow: var(--app-button-neutral-shadow-hover);
|
||
}
|
||
|
||
:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[role="button"]
|
||
).outline.contrast {
|
||
--app-color: var(--app-contrast);
|
||
--app-border-color: var(--app-contrast);
|
||
}
|
||
|
||
:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[role="button"]
|
||
).outline.contrast:is(
|
||
[aria-current]:not([aria-current="false"]),
|
||
:hover,
|
||
:active,
|
||
:focus
|
||
) {
|
||
--app-color: var(--app-contrast-hover);
|
||
--app-border-color: var(--app-contrast-hover);
|
||
}
|
||
|
||
:where(
|
||
button,
|
||
[type="submit"],
|
||
[type="reset"],
|
||
[type="button"],
|
||
[role="button"]
|
||
)[disabled],
|
||
:where(fieldset[disabled])
|
||
:is(
|
||
button,
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[role="button"]
|
||
) {
|
||
opacity: 0.5;
|
||
pointer-events: none;
|
||
}
|
||
|
||
:where(table) {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
border-spacing: 0;
|
||
text-indent: 0;
|
||
}
|
||
|
||
td,
|
||
th {
|
||
padding: calc(var(--app-spacing) / 2) var(--app-spacing);
|
||
border-bottom: var(--app-border-width) solid var(--app-table-border-color);
|
||
background-color: var(--app-background-color);
|
||
color: var(--app-color);
|
||
font-weight: var(--app-font-weight);
|
||
text-align: left;
|
||
text-align: start;
|
||
}
|
||
|
||
tfoot td,
|
||
tfoot th {
|
||
border-top: var(--app-border-width) solid var(--app-table-border-color);
|
||
border-bottom: 0;
|
||
}
|
||
|
||
table.striped tbody tr:nth-child(odd) td,
|
||
table.striped tbody tr:nth-child(odd) th {
|
||
background-color: var(--app-table-row-stripped-background-color);
|
||
}
|
||
|
||
:where(audio, canvas, iframe, img, svg, video) {
|
||
vertical-align: middle;
|
||
}
|
||
|
||
audio,
|
||
video {
|
||
display: inline-block;
|
||
}
|
||
|
||
audio:not([controls]) {
|
||
display: none;
|
||
height: 0;
|
||
}
|
||
|
||
:where(iframe) {
|
||
border-style: none;
|
||
}
|
||
|
||
img {
|
||
max-width: 100%;
|
||
height: auto;
|
||
border-style: none;
|
||
}
|
||
|
||
img.rounded {
|
||
border-radius: 0.5rem;
|
||
}
|
||
|
||
:where(svg:not([fill])) {
|
||
fill: currentColor;
|
||
}
|
||
|
||
svg:not(:host),
|
||
svg:not(:root) {
|
||
overflow: hidden;
|
||
}
|
||
|
||
code,
|
||
kbd,
|
||
pre,
|
||
samp {
|
||
font-size: 0.875em; /* em-relative sizing — intentional, scales with parent */
|
||
font-family: var(--app-font-family);
|
||
}
|
||
|
||
pre code,
|
||
pre samp {
|
||
font-size: inherit;
|
||
font-family: inherit;
|
||
}
|
||
|
||
pre {
|
||
-ms-overflow-style: scrollbar;
|
||
overflow: auto;
|
||
}
|
||
|
||
code,
|
||
kbd,
|
||
pre,
|
||
samp {
|
||
border-radius: var(--app-border-radius);
|
||
background: var(--app-code-background-color);
|
||
color: var(--app-code-color);
|
||
font-weight: var(--app-font-weight);
|
||
line-height: initial;
|
||
}
|
||
|
||
code,
|
||
kbd,
|
||
samp {
|
||
display: inline-block;
|
||
padding: 0.375rem;
|
||
}
|
||
|
||
pre {
|
||
display: block;
|
||
margin-bottom: var(--app-spacing);
|
||
overflow-x: auto;
|
||
}
|
||
|
||
pre > code,
|
||
pre > samp {
|
||
display: block;
|
||
padding: var(--app-spacing);
|
||
background: 0 0;
|
||
line-height: var(--app-line-height);
|
||
}
|
||
|
||
.code-toolbar {
|
||
position: relative;
|
||
margin-block: var(--app-spacing);
|
||
}
|
||
|
||
.code-toolbar > .toolbar {
|
||
position: absolute;
|
||
top: 0.5rem;
|
||
right: 0.5rem;
|
||
z-index: 1;
|
||
}
|
||
|
||
.code-toolbar > .toolbar .toolbar-item {
|
||
display: inline-flex;
|
||
}
|
||
|
||
.code-toolbar > .toolbar .copy-to-clipboard-button {
|
||
--app-background-color: transparent;
|
||
--app-border-color: var(--app-muted-border-color);
|
||
--app-color: var(--app-muted-color);
|
||
--app-box-shadow: none;
|
||
--app-button-padding-vertical: var(--app-button-padding-vertical-small);
|
||
--app-button-padding-horizontal: var(--app-button-padding-horizontal-small);
|
||
font-size: var(--text-xs);
|
||
}
|
||
|
||
.code-toolbar > .toolbar .copy-to-clipboard-button:is(:hover, :focus) {
|
||
--app-background-color: var(--app-card-sectioning-background-color);
|
||
--app-border-color: var(--app-muted-border-color);
|
||
}
|
||
|
||
.code-toolbar > pre > code {
|
||
padding-top: calc(var(--app-spacing) * 2);
|
||
}
|
||
|
||
kbd {
|
||
background-color: var(--app-code-kbd-background-color);
|
||
color: var(--app-code-kbd-color);
|
||
vertical-align: baseline;
|
||
}
|
||
|
||
figure {
|
||
display: block;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
figure figcaption {
|
||
padding: calc(var(--app-spacing) * 0.5) 0;
|
||
color: var(--app-muted-color);
|
||
}
|
||
|
||
hr {
|
||
height: 0;
|
||
margin: var(--app-typography-spacing-vertical) 0;
|
||
border: 0;
|
||
border-top: 1px solid var(--app-muted-border-color);
|
||
color: inherit;
|
||
}
|
||
|
||
[hidden],
|
||
template {
|
||
display: none !important;
|
||
}
|
||
|
||
canvas {
|
||
display: inline-block;
|
||
}
|
||
|
||
input,
|
||
optgroup,
|
||
select,
|
||
textarea {
|
||
margin: 0;
|
||
font-size: var(--text-base);
|
||
line-height: var(--app-line-height);
|
||
font-family: inherit;
|
||
letter-spacing: inherit;
|
||
}
|
||
|
||
input {
|
||
overflow: visible;
|
||
}
|
||
|
||
select {
|
||
text-transform: none;
|
||
}
|
||
|
||
legend {
|
||
max-width: 100%;
|
||
white-space: normal;
|
||
margin: 0;
|
||
display: block;
|
||
color: var(--app-color);
|
||
font-weight: var(--app-form-label-font-weight, var(--app-font-weight));
|
||
}
|
||
|
||
textarea {
|
||
overflow: auto;
|
||
}
|
||
|
||
[type="checkbox"],
|
||
[type="radio"] {
|
||
padding: 0;
|
||
}
|
||
|
||
::-webkit-inner-spin-button,
|
||
::-webkit-outer-spin-button {
|
||
height: auto;
|
||
}
|
||
|
||
[type="search"] {
|
||
-webkit-appearance: textfield;
|
||
outline-offset: -2px;
|
||
}
|
||
|
||
[type="search"]::-webkit-search-decoration {
|
||
-webkit-appearance: none;
|
||
}
|
||
|
||
::-webkit-file-upload-button {
|
||
-webkit-appearance: button;
|
||
font: inherit;
|
||
}
|
||
|
||
::-moz-focus-inner {
|
||
padding: 0;
|
||
border-style: none;
|
||
}
|
||
|
||
:-moz-focusring {
|
||
outline: 0;
|
||
}
|
||
|
||
:-moz-ui-invalid {
|
||
box-shadow: none;
|
||
}
|
||
|
||
::-ms-expand {
|
||
display: none;
|
||
}
|
||
|
||
[type="file"],
|
||
[type="range"] {
|
||
padding: 0;
|
||
border-width: 0;
|
||
}
|
||
|
||
input:not([type="checkbox"], [type="radio"], [type="range"]) {
|
||
height: calc(
|
||
1rem * var(--app-line-height) + var(--app-form-element-spacing-vertical) *
|
||
2 + var(--app-border-width) * 2
|
||
);
|
||
}
|
||
|
||
fieldset {
|
||
width: 100%;
|
||
margin-bottom: var(--app-spacing);
|
||
border: 1px solid var(--app-form-element-border-color);
|
||
padding: var(--app-spacing);
|
||
border-radius: var(--app-border-radius);
|
||
}
|
||
|
||
fieldset[role="group"] {
|
||
padding: 0;
|
||
border: 0;
|
||
border-radius: 0;
|
||
}
|
||
|
||
label {
|
||
display: block;
|
||
margin-bottom: calc(var(--app-spacing) * 0.375);
|
||
color: var(--app-color);
|
||
font-weight: var(--app-form-label-font-weight, var(--app-font-weight));
|
||
font-size: var(--text-sm);
|
||
}
|
||
|
||
label:has(input[required]) span:after {
|
||
content: " *";
|
||
}
|
||
|
||
input:not([type="checkbox"], [type="radio"]),
|
||
select,
|
||
textarea {
|
||
width: 100%;
|
||
}
|
||
|
||
input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]),
|
||
select,
|
||
textarea {
|
||
-webkit-appearance: none;
|
||
-moz-appearance: none;
|
||
appearance: none;
|
||
padding: var(--app-form-element-spacing-vertical)
|
||
var(--app-form-element-spacing-horizontal);
|
||
}
|
||
|
||
input,
|
||
select,
|
||
textarea {
|
||
--app-background-color: var(--app-form-element-background-color);
|
||
--app-border-color: var(--app-form-element-border-color);
|
||
--app-color: var(--app-form-element-color);
|
||
--app-box-shadow: none;
|
||
border: var(--app-border-width) solid var(--app-border-color);
|
||
border-radius: var(--app-border-radius);
|
||
outline: 0;
|
||
background-color: var(--app-background-color);
|
||
box-shadow: var(--app-box-shadow);
|
||
color: var(--app-color);
|
||
font-weight: var(--app-font-weight);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
border-color var(--app-transition),
|
||
color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
}
|
||
|
||
:where(select, textarea):not([readonly]):is(:active, :focus),
|
||
input:not(
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[readonly]
|
||
):is(:active, :focus) {
|
||
--app-background-color: var(--app-form-element-active-background-color);
|
||
}
|
||
|
||
:where(select, textarea):not([readonly]):is(:active, :focus),
|
||
input:not(
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[role="switch"],
|
||
[readonly]
|
||
):is(:active, :focus) {
|
||
--app-border-color: var(--app-form-element-active-border-color);
|
||
}
|
||
|
||
:where(select, textarea):not([readonly]):focus,
|
||
input:not(
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[type="range"],
|
||
[type="file"],
|
||
[readonly]
|
||
):focus {
|
||
--app-box-shadow: 0 0 0 var(--app-outline-width)
|
||
var(--app-form-element-focus-color);
|
||
}
|
||
|
||
input:not(
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[readonly]:not([disabled]),
|
||
textarea[readonly]:not([disabled]),
|
||
select[readonly]:not([disabled]) {
|
||
--app-background-color: var(--app-form-element-readonly-background-color);
|
||
--app-border-color: var(--app-form-element-readonly-border-color);
|
||
--app-color: var(--app-form-element-readonly-color);
|
||
--app-box-shadow: inset 0 0 0 0.0625rem
|
||
var(--app-form-element-readonly-border-color);
|
||
}
|
||
|
||
input:not(
|
||
[type="submit"],
|
||
[type="button"],
|
||
[type="reset"],
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[readonly]:not([disabled]):focus,
|
||
textarea[readonly]:not([disabled]):focus,
|
||
select[readonly]:not([disabled]):focus {
|
||
--app-box-shadow: 0 0 0 var(--app-outline-width)
|
||
var(--app-form-element-readonly-focus-color);
|
||
}
|
||
|
||
:where(fieldset[disabled])
|
||
:is(
|
||
input:not([type="submit"], [type="button"], [type="reset"]),
|
||
select,
|
||
textarea
|
||
),
|
||
input:not([type="submit"], [type="button"], [type="reset"])[disabled],
|
||
label[aria-disabled="true"],
|
||
select[disabled],
|
||
textarea[disabled] {
|
||
opacity: var(--app-form-element-disabled-opacity);
|
||
pointer-events: none;
|
||
}
|
||
|
||
label[aria-disabled="true"] input[disabled] {
|
||
opacity: 1;
|
||
}
|
||
|
||
:where(input, select, textarea):not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="date"],
|
||
[type="datetime-local"],
|
||
[type="month"],
|
||
[type="time"],
|
||
[type="week"],
|
||
[type="range"]
|
||
)[aria-invalid] {
|
||
padding-right: calc(
|
||
var(--app-form-element-spacing-horizontal) + 1.5rem
|
||
) !important;
|
||
padding-left: var(--app-form-element-spacing-horizontal);
|
||
padding-inline-start: var(--app-form-element-spacing-horizontal) !important;
|
||
padding-inline-end: calc(
|
||
var(--app-form-element-spacing-horizontal) + 1.5rem
|
||
) !important;
|
||
background-position: center right 0.75rem;
|
||
background-size: 1rem auto;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
:where(input, select, textarea):not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="date"],
|
||
[type="datetime-local"],
|
||
[type="month"],
|
||
[type="time"],
|
||
[type="week"],
|
||
[type="range"]
|
||
)[aria-invalid="false"]:not(select) {
|
||
background-image: var(--app-icon-valid);
|
||
}
|
||
|
||
:where(input, select, textarea):not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="date"],
|
||
[type="datetime-local"],
|
||
[type="month"],
|
||
[type="time"],
|
||
[type="week"],
|
||
[type="range"]
|
||
)[aria-invalid="true"]:not(select) {
|
||
background-image: var(--app-icon-invalid);
|
||
}
|
||
|
||
:where(input, select, textarea)[aria-invalid="false"] {
|
||
--app-border-color: var(--app-form-element-valid-border-color);
|
||
}
|
||
|
||
:where(input, select, textarea)[aria-invalid="false"]:is(:active, :focus) {
|
||
--app-border-color: var(
|
||
--app-form-element-valid-active-border-color
|
||
) !important
|
||
;
|
||
}
|
||
|
||
:where(input, select, textarea)[aria-invalid="false"]:is(:active, :focus):not(
|
||
[type="checkbox"],
|
||
[type="radio"]
|
||
) {
|
||
--app-box-shadow: 0 0 0 var(--app-outline-width)
|
||
var(--app-form-element-valid-focus-color) !important
|
||
;
|
||
}
|
||
|
||
:where(input, select, textarea)[aria-invalid="true"] {
|
||
--app-border-color: var(--app-form-element-invalid-border-color);
|
||
}
|
||
|
||
:where(input, select, textarea)[aria-invalid="true"]:is(:active, :focus) {
|
||
--app-border-color: var(
|
||
--app-form-element-invalid-active-border-color
|
||
) !important
|
||
;
|
||
}
|
||
|
||
:where(input, select, textarea)[aria-invalid="true"]:is(:active, :focus):not(
|
||
[type="checkbox"],
|
||
[type="radio"]
|
||
) {
|
||
--app-box-shadow: 0 0 0 var(--app-outline-width)
|
||
var(--app-form-element-invalid-focus-color) !important
|
||
;
|
||
}
|
||
|
||
[dir="rtl"]
|
||
:where(input, select, textarea):not([type="checkbox"], [type="radio"]):is(
|
||
[aria-invalid],
|
||
[aria-invalid="true"],
|
||
[aria-invalid="false"]
|
||
) {
|
||
background-position: center left 0.75rem;
|
||
}
|
||
|
||
input::-webkit-input-placeholder,
|
||
input::placeholder,
|
||
select:invalid,
|
||
textarea::-webkit-input-placeholder,
|
||
textarea::placeholder {
|
||
color: var(--app-form-element-placeholder-color);
|
||
opacity: 1;
|
||
}
|
||
|
||
input:not([type="checkbox"], [type="radio"]),
|
||
select,
|
||
textarea {
|
||
margin-bottom: var(--app-spacing);
|
||
}
|
||
|
||
select::-ms-expand {
|
||
border: 0;
|
||
background-color: transparent;
|
||
}
|
||
|
||
select:not([multiple], [size]) {
|
||
padding-right: calc(var(--app-form-element-spacing-horizontal) + 1.5rem);
|
||
padding-left: var(--app-form-element-spacing-horizontal);
|
||
padding-inline-start: var(--app-form-element-spacing-horizontal);
|
||
padding-inline-end: calc(
|
||
var(--app-form-element-spacing-horizontal) + 1.5rem
|
||
);
|
||
background-image: var(--app-icon-chevron);
|
||
background-position: center right 0.75rem;
|
||
background-size: 1rem auto;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
select[multiple] option:checked {
|
||
background: var(--app-form-element-selected-background-color);
|
||
color: var(--app-form-element-color);
|
||
}
|
||
|
||
[dir="rtl"] select:not([multiple], [size]) {
|
||
background-position: center left 0.75rem;
|
||
}
|
||
|
||
textarea {
|
||
display: block;
|
||
resize: vertical;
|
||
}
|
||
|
||
textarea[aria-invalid] {
|
||
--app-icon-height: calc(
|
||
1rem * var(--app-line-height) + var(--app-form-element-spacing-vertical) *
|
||
2 + var(--app-border-width) * 2
|
||
);
|
||
background-position: top right 0.75rem !important;
|
||
background-size: 1rem var(--app-icon-height) !important;
|
||
}
|
||
|
||
:where(input, select, textarea, fieldset, .grid) + small {
|
||
display: block;
|
||
width: 100%;
|
||
margin-top: calc(var(--app-spacing) * -0.75);
|
||
margin-bottom: var(--app-spacing);
|
||
color: var(--app-muted-color);
|
||
}
|
||
|
||
:where(input, select, textarea, fieldset, .grid)[aria-invalid="false"]
|
||
+ small {
|
||
color: var(--app-ins-color);
|
||
}
|
||
|
||
:where(input, select, textarea, fieldset, .grid)[aria-invalid="true"]
|
||
+ small {
|
||
color: var(--app-del-color);
|
||
}
|
||
|
||
label > :where(input, select, textarea) {
|
||
margin-top: calc(var(--app-spacing) * 0.25);
|
||
}
|
||
|
||
label:has([type="checkbox"], [type="radio"]) {
|
||
width: -moz-fit-content;
|
||
width: fit-content;
|
||
cursor: pointer;
|
||
}
|
||
|
||
[type="checkbox"],
|
||
[type="radio"] {
|
||
-webkit-appearance: none;
|
||
-moz-appearance: none;
|
||
appearance: none;
|
||
width: 1.25em;
|
||
height: 1.25em;
|
||
margin-top: -0.125em;
|
||
margin-inline-end: 0.5em;
|
||
border-width: var(--app-border-width);
|
||
border-radius: 0.1875rem;
|
||
vertical-align: middle;
|
||
cursor: pointer;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
[type="radio"] {
|
||
border-radius: 50%;
|
||
}
|
||
|
||
[type="checkbox"]::-ms-check,
|
||
[type="radio"]::-ms-check {
|
||
display: none;
|
||
}
|
||
|
||
[type="checkbox"]:checked,
|
||
[type="checkbox"]:checked:active,
|
||
[type="checkbox"]:checked:focus,
|
||
[type="radio"]:checked,
|
||
[type="radio"]:checked:active,
|
||
[type="radio"]:checked:focus {
|
||
--app-background-color: var(--app-primary-background);
|
||
--app-border-color: var(--app-primary-border);
|
||
background-image: var(--app-icon-checkbox);
|
||
background-position: center;
|
||
background-size: 0.75em auto;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
[type="checkbox"] ~ label,
|
||
[type="radio"] ~ label {
|
||
display: inline-block;
|
||
margin-bottom: 0;
|
||
cursor: pointer;
|
||
}
|
||
|
||
[type="checkbox"] ~ label:not(:last-of-type),
|
||
[type="radio"] ~ label:not(:last-of-type) {
|
||
margin-inline-end: 1em;
|
||
}
|
||
|
||
[type="checkbox"]:indeterminate {
|
||
--app-background-color: var(--app-primary-background);
|
||
--app-border-color: var(--app-primary-border);
|
||
background-image: var(--app-icon-minus);
|
||
background-position: center;
|
||
background-size: 0.75em auto;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
[type="radio"] {
|
||
border-radius: 50%;
|
||
}
|
||
|
||
[type="radio"]:checked,
|
||
[type="radio"]:checked:active,
|
||
[type="radio"]:checked:focus {
|
||
--app-background-color: var(--app-primary-inverse);
|
||
border-width: 0.35em;
|
||
background-image: none;
|
||
}
|
||
|
||
[type="checkbox"][role="switch"] {
|
||
--app-background-color: var(--app-switch-background-color);
|
||
--app-color: var(--app-switch-color);
|
||
width: 2.25em;
|
||
height: 1.25em;
|
||
border: var(--app-border-width) solid var(--app-border-color);
|
||
border-radius: 1.25em;
|
||
background-color: var(--app-background-color);
|
||
line-height: 1.25em; /* em-relative sizing — intentional, switch control layout */
|
||
}
|
||
|
||
[type="checkbox"][role="switch"]:not([aria-invalid]) {
|
||
--app-border-color: var(--app-switch-background-color);
|
||
}
|
||
|
||
[type="checkbox"][role="switch"]:before {
|
||
display: block;
|
||
aspect-ratio: 1;
|
||
height: 100%;
|
||
border-radius: 50%;
|
||
background-color: var(--app-color);
|
||
box-shadow: var(--app-switch-thumb-box-shadow);
|
||
content: "";
|
||
transition: margin 0.1s ease-in-out;
|
||
}
|
||
|
||
[type="checkbox"][role="switch"]:focus {
|
||
--app-background-color: var(--app-switch-background-color);
|
||
--app-border-color: var(--app-switch-background-color);
|
||
}
|
||
|
||
[type="checkbox"][role="switch"]:checked {
|
||
--app-background-color: var(--app-switch-checked-background-color);
|
||
--app-border-color: var(--app-switch-checked-background-color);
|
||
background-image: none;
|
||
}
|
||
|
||
[type="checkbox"][role="switch"]:checked::before {
|
||
margin-inline-start: calc(2.25em - 1.25em);
|
||
}
|
||
|
||
[type="checkbox"][role="switch"][disabled] {
|
||
--app-background-color: var(--app-border-color);
|
||
}
|
||
|
||
[type="checkbox"][aria-invalid="false"]:checked,
|
||
[type="checkbox"][aria-invalid="false"]:checked:active,
|
||
[type="checkbox"][aria-invalid="false"]:checked:focus,
|
||
[type="checkbox"][role="switch"][aria-invalid="false"]:checked,
|
||
[type="checkbox"][role="switch"][aria-invalid="false"]:checked:active,
|
||
[type="checkbox"][role="switch"][aria-invalid="false"]:checked:focus {
|
||
--app-background-color: var(--app-form-element-valid-border-color);
|
||
}
|
||
|
||
[type="checkbox"]:checked:active[aria-invalid="true"],
|
||
[type="checkbox"]:checked:focus[aria-invalid="true"],
|
||
[type="checkbox"]:checked[aria-invalid="true"],
|
||
[type="checkbox"][role="switch"]:checked:active[aria-invalid="true"],
|
||
[type="checkbox"][role="switch"]:checked:focus[aria-invalid="true"],
|
||
[type="checkbox"][role="switch"]:checked[aria-invalid="true"] {
|
||
--app-background-color: var(--app-form-element-invalid-border-color);
|
||
}
|
||
|
||
[type="checkbox"][aria-invalid="false"]:checked,
|
||
[type="checkbox"][aria-invalid="false"]:checked:active,
|
||
[type="checkbox"][aria-invalid="false"]:checked:focus,
|
||
[type="checkbox"][role="switch"][aria-invalid="false"]:checked,
|
||
[type="checkbox"][role="switch"][aria-invalid="false"]:checked:active,
|
||
[type="checkbox"][role="switch"][aria-invalid="false"]:checked:focus,
|
||
[type="radio"][aria-invalid="false"]:checked,
|
||
[type="radio"][aria-invalid="false"]:checked:active,
|
||
[type="radio"][aria-invalid="false"]:checked:focus {
|
||
--app-border-color: var(--app-form-element-valid-border-color);
|
||
}
|
||
|
||
[type="checkbox"]:checked:active[aria-invalid="true"],
|
||
[type="checkbox"]:checked:focus[aria-invalid="true"],
|
||
[type="checkbox"]:checked[aria-invalid="true"],
|
||
[type="checkbox"][role="switch"]:checked:active[aria-invalid="true"],
|
||
[type="checkbox"][role="switch"]:checked:focus[aria-invalid="true"],
|
||
[type="checkbox"][role="switch"]:checked[aria-invalid="true"],
|
||
[type="radio"]:checked:active[aria-invalid="true"],
|
||
[type="radio"]:checked:focus[aria-invalid="true"],
|
||
[type="radio"]:checked[aria-invalid="true"] {
|
||
--app-border-color: var(--app-form-element-invalid-border-color);
|
||
}
|
||
|
||
[type="color"]::-webkit-color-swatch-wrapper {
|
||
padding: 0;
|
||
}
|
||
|
||
[type="color"]::-moz-focus-inner {
|
||
padding: 0;
|
||
}
|
||
|
||
[type="color"]::-webkit-color-swatch {
|
||
border: 0;
|
||
border-radius: calc(var(--app-border-radius) * 0.5);
|
||
}
|
||
|
||
[type="color"]::-moz-color-swatch {
|
||
border: 0;
|
||
border-radius: calc(var(--app-border-radius) * 0.5);
|
||
}
|
||
|
||
input:not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
):is(
|
||
[type="date"],
|
||
[type="datetime-local"],
|
||
[type="month"],
|
||
[type="time"],
|
||
[type="week"]
|
||
) {
|
||
--app-icon-position: 0.75rem;
|
||
--app-icon-width: 1rem;
|
||
padding-right: calc(var(--app-icon-width) + var(--app-icon-position));
|
||
background-image: var(--app-icon-date);
|
||
background-position: center right var(--app-icon-position);
|
||
background-size: var(--app-icon-width) auto;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
input:not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="time"] {
|
||
background-image: var(--app-icon-time);
|
||
}
|
||
|
||
[type="date"]::-webkit-calendar-picker-indicator,
|
||
[type="datetime-local"]::-webkit-calendar-picker-indicator,
|
||
[type="month"]::-webkit-calendar-picker-indicator,
|
||
[type="time"]::-webkit-calendar-picker-indicator,
|
||
[type="week"]::-webkit-calendar-picker-indicator {
|
||
width: var(--app-icon-width);
|
||
margin-right: calc(var(--app-icon-width) * -1);
|
||
margin-left: var(--app-icon-position);
|
||
opacity: 0;
|
||
}
|
||
|
||
@-moz-document url-prefix() {
|
||
[type="date"],
|
||
[type="datetime-local"],
|
||
[type="month"],
|
||
[type="time"],
|
||
[type="week"] {
|
||
padding-right: var(--app-form-element-spacing-horizontal) !important;
|
||
background-image: none !important;
|
||
}
|
||
}
|
||
|
||
[dir="rtl"]
|
||
:is(
|
||
[type="date"],
|
||
[type="datetime-local"],
|
||
[type="month"],
|
||
[type="time"],
|
||
[type="week"]
|
||
) {
|
||
text-align: right;
|
||
}
|
||
|
||
[type="file"] {
|
||
--app-color: var(--app-muted-color);
|
||
margin-left: calc(var(--app-outline-width) * -1);
|
||
background: 0 0;
|
||
border: 2px dashed var(--app-form-element-border-color);
|
||
padding: 1.5rem;
|
||
height: auto !important;
|
||
}
|
||
|
||
[type="file"]::file-selector-button {
|
||
margin-right: calc(var(--app-spacing) / 2);
|
||
padding: calc(var(--app-form-element-spacing-vertical) * 0.5)
|
||
var(--app-form-element-spacing-horizontal);
|
||
}
|
||
|
||
[type="file"]:is(:hover, :active, :focus)::file-selector-button {
|
||
--app-background-color: var(--app-secondary-hover-background);
|
||
--app-border-color: var(--app-secondary-hover-border);
|
||
}
|
||
|
||
[type="file"]:focus::file-selector-button {
|
||
--app-box-shadow:
|
||
var(--app-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),
|
||
0 0 0 var(--app-outline-width) var(--app-secondary-focus);
|
||
}
|
||
|
||
[type="range"] {
|
||
-webkit-appearance: none;
|
||
-moz-appearance: none;
|
||
appearance: none;
|
||
width: 100%;
|
||
height: 1.25rem;
|
||
background: 0 0;
|
||
}
|
||
|
||
[type="range"]::-webkit-slider-runnable-track {
|
||
width: 100%;
|
||
height: 0.375rem;
|
||
border-radius: var(--app-border-radius);
|
||
background-color: var(--app-range-border-color);
|
||
-webkit-transition:
|
||
background-color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
}
|
||
|
||
[type="range"]::-moz-range-track {
|
||
width: 100%;
|
||
height: 0.375rem;
|
||
border-radius: var(--app-border-radius);
|
||
background-color: var(--app-range-border-color);
|
||
-moz-transition:
|
||
background-color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
}
|
||
|
||
[type="range"]::-ms-track {
|
||
width: 100%;
|
||
height: 0.375rem;
|
||
border-radius: var(--app-border-radius);
|
||
background-color: var(--app-range-border-color);
|
||
-ms-transition:
|
||
background-color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
}
|
||
|
||
[type="range"]::-webkit-slider-thumb {
|
||
-webkit-appearance: none;
|
||
width: 1.25rem;
|
||
height: 1.25rem;
|
||
margin-top: -0.4375rem;
|
||
border: 2px solid var(--app-range-thumb-border-color);
|
||
border-radius: 50%;
|
||
background-color: var(--app-range-thumb-color);
|
||
cursor: pointer;
|
||
-webkit-transition:
|
||
background-color var(--app-transition),
|
||
transform var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
transform var(--app-transition);
|
||
}
|
||
|
||
[type="range"]::-moz-range-thumb {
|
||
-webkit-appearance: none;
|
||
width: 1.25rem;
|
||
height: 1.25rem;
|
||
margin-top: -0.4375rem;
|
||
border: 2px solid var(--app-range-thumb-border-color);
|
||
border-radius: 50%;
|
||
background-color: var(--app-range-thumb-color);
|
||
cursor: pointer;
|
||
-moz-transition:
|
||
background-color var(--app-transition),
|
||
transform var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
transform var(--app-transition);
|
||
}
|
||
|
||
[type="range"]::-ms-thumb {
|
||
-webkit-appearance: none;
|
||
width: 1.25rem;
|
||
height: 1.25rem;
|
||
margin-top: -0.4375rem;
|
||
border: 2px solid var(--app-range-thumb-border-color);
|
||
border-radius: 50%;
|
||
background-color: var(--app-range-thumb-color);
|
||
cursor: pointer;
|
||
-ms-transition:
|
||
background-color var(--app-transition),
|
||
transform var(--app-transition);
|
||
transition:
|
||
background-color var(--app-transition),
|
||
transform var(--app-transition);
|
||
}
|
||
|
||
[type="range"]:active,
|
||
[type="range"]:focus-within {
|
||
--app-range-border-color: var(--app-range-active-border-color);
|
||
--app-range-thumb-color: var(--app-range-thumb-active-color);
|
||
}
|
||
|
||
[type="range"]:active::-webkit-slider-thumb {
|
||
transform: scale(1.25);
|
||
}
|
||
|
||
[type="range"]:active::-moz-range-thumb {
|
||
transform: scale(1.25);
|
||
}
|
||
|
||
[type="range"]:active::-ms-thumb {
|
||
transform: scale(1.25);
|
||
}
|
||
|
||
input:not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="search"] {
|
||
padding-inline-start: calc(
|
||
var(--app-form-element-spacing-horizontal) + 1.75rem
|
||
);
|
||
background-image: var(--app-icon-search);
|
||
background-position: center left
|
||
calc(var(--app-form-element-spacing-horizontal) + 0.125rem);
|
||
background-size: 1rem auto;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
input:not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="search"][aria-invalid] {
|
||
padding-inline-start: calc(
|
||
var(--app-form-element-spacing-horizontal) + 1.75rem
|
||
) !important;
|
||
background-position:
|
||
center left 1.125rem,
|
||
center right 0.75rem;
|
||
}
|
||
|
||
input:not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="search"][aria-invalid="false"] {
|
||
background-image: var(--app-icon-search), var(--app-icon-valid);
|
||
}
|
||
|
||
input:not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="search"][aria-invalid="true"] {
|
||
background-image: var(--app-icon-search), var(--app-icon-invalid);
|
||
}
|
||
|
||
[dir="rtl"]
|
||
:where(input):not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="search"] {
|
||
background-position: center right 1.125rem;
|
||
}
|
||
|
||
[dir="rtl"]
|
||
:where(input):not(
|
||
[type="checkbox"],
|
||
[type="radio"],
|
||
[type="range"],
|
||
[type="file"]
|
||
)[type="search"][aria-invalid] {
|
||
background-position:
|
||
center right 1.125rem,
|
||
center left 0.75rem;
|
||
}
|
||
|
||
details {
|
||
display: block;
|
||
margin-bottom: var(--app-spacing);
|
||
}
|
||
|
||
details summary {
|
||
line-height: var(--leading-tight);
|
||
list-style-type: none;
|
||
cursor: pointer;
|
||
transition: color var(--app-transition);
|
||
vertical-align: middle;
|
||
}
|
||
|
||
details summary:not([role]) {
|
||
color: var(--app-accordion-close-summary-color);
|
||
}
|
||
|
||
details summary::-webkit-details-marker {
|
||
display: none;
|
||
}
|
||
|
||
details summary::marker {
|
||
display: none;
|
||
}
|
||
|
||
details summary::-moz-list-bullet {
|
||
list-style-type: none;
|
||
}
|
||
|
||
details summary::after {
|
||
display: block;
|
||
width: 1rem;
|
||
height: 1rem;
|
||
margin-inline-start: calc(var(--app-spacing, 1rem) * 0.5);
|
||
float: right;
|
||
transform: rotate(-90deg);
|
||
background-image: var(--app-icon-chevron);
|
||
background-position: right center;
|
||
background-size: 1rem auto;
|
||
background-repeat: no-repeat;
|
||
content: "";
|
||
transition: transform var(--app-transition);
|
||
}
|
||
|
||
/* Opt-out hook for components that should not render the default summary chevron. */
|
||
details[data-summary-chevron="none"] > summary::after,
|
||
details > summary[data-summary-chevron="none"]::after {
|
||
display: none !important;
|
||
content: none !important;
|
||
background-image: none !important;
|
||
}
|
||
|
||
details summary:focus {
|
||
outline: 0;
|
||
}
|
||
|
||
details summary:focus:not([role]) {
|
||
color: var(--app-accordion-active-summary-color);
|
||
}
|
||
|
||
details summary:focus-visible:not([role]) {
|
||
outline: var(--app-outline-width) solid var(--app-primary-focus);
|
||
outline-offset: calc(var(--app-spacing, 1rem) * 0.5);
|
||
color: var(--app-primary);
|
||
}
|
||
|
||
details summary[role="button"] {
|
||
width: 100%;
|
||
text-align: left;
|
||
}
|
||
|
||
details summary[role="button"]::after {
|
||
height: calc(1rem * var(--app-line-height, 1.5));
|
||
}
|
||
|
||
details[open] > summary {
|
||
margin-bottom: calc(var(--app-spacing) * 0.5);
|
||
}
|
||
|
||
details[open] > summary:not([role]):not(:focus) {
|
||
color: var(--app-accordion-close-summary-color);
|
||
}
|
||
|
||
details[open] > summary::after {
|
||
transform: rotate(0);
|
||
}
|
||
|
||
[dir="rtl"] details summary {
|
||
text-align: right;
|
||
}
|
||
|
||
[dir="rtl"] details summary::after {
|
||
float: left;
|
||
background-position: left center;
|
||
}
|
||
|
||
article {
|
||
margin-bottom: var(--app-block-spacing-vertical);
|
||
padding: var(--app-block-spacing-vertical)
|
||
var(--app-block-spacing-horizontal);
|
||
border-radius: var(--app-border-radius);
|
||
background: var(--app-card-background-color);
|
||
box-shadow: var(--app-card-box-shadow);
|
||
}
|
||
|
||
article:not(:has(footer)) p:last-child {
|
||
margin: 0;
|
||
}
|
||
|
||
article > footer,
|
||
article > header {
|
||
margin-right: calc(var(--app-block-spacing-horizontal) * -1);
|
||
margin-left: calc(var(--app-block-spacing-horizontal) * -1);
|
||
padding: calc(var(--app-block-spacing-vertical) * 1)
|
||
var(--app-block-spacing-horizontal);
|
||
background-color: var(--app-card-sectioning-background-color);
|
||
}
|
||
|
||
article > header {
|
||
margin-top: calc(var(--app-block-spacing-vertical) * -1);
|
||
margin-bottom: var(--app-block-spacing-vertical);
|
||
border-bottom: var(--app-border-width) solid var(--app-card-border-color);
|
||
border-top-right-radius: var(--app-border-radius);
|
||
border-top-left-radius: var(--app-border-radius);
|
||
}
|
||
|
||
article > header > hgroup {
|
||
margin: 0;
|
||
}
|
||
|
||
article > footer {
|
||
margin-top: var(--app-block-spacing-vertical);
|
||
margin-bottom: calc(var(--app-block-spacing-vertical) * -1);
|
||
border-top: var(--app-border-width) solid var(--app-card-border-color);
|
||
border-bottom-right-radius: var(--app-border-radius);
|
||
border-bottom-left-radius: var(--app-border-radius);
|
||
}
|
||
|
||
details.dropdown {
|
||
position: relative;
|
||
border-bottom: none;
|
||
}
|
||
|
||
details.dropdown > a::after,
|
||
details.dropdown > button::after,
|
||
details.dropdown > summary::after {
|
||
display: block;
|
||
width: 1rem;
|
||
height: calc(1rem * var(--app-line-height, 1.5));
|
||
margin-inline-start: 0.25rem;
|
||
float: right;
|
||
transform: rotate(0) translateX(0.2rem);
|
||
background-image: var(--app-icon-chevron);
|
||
background-position: right center;
|
||
background-size: 1rem auto;
|
||
background-repeat: no-repeat;
|
||
content: "";
|
||
}
|
||
|
||
details.dropdown[data-summary-chevron="none"] > summary::after,
|
||
details.dropdown > summary[data-summary-chevron="none"]::after {
|
||
display: none !important;
|
||
content: none !important;
|
||
background-image: none !important;
|
||
}
|
||
|
||
nav details.dropdown {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
details.dropdown > summary:not([role]) {
|
||
height: calc(
|
||
1rem * var(--app-line-height) + var(--app-form-element-spacing-vertical) *
|
||
2 + var(--app-border-width) * 2
|
||
);
|
||
padding: var(--app-form-element-spacing-vertical)
|
||
var(--app-form-element-spacing-horizontal);
|
||
border: var(--app-border-width) solid var(--app-form-element-border-color);
|
||
border-radius: var(--app-border-radius);
|
||
background-color: var(--app-form-element-background-color);
|
||
color: var(--app-form-element-placeholder-color);
|
||
line-height: inherit;
|
||
cursor: pointer;
|
||
-webkit-user-select: none;
|
||
-moz-user-select: none;
|
||
user-select: none;
|
||
transition:
|
||
background-color var(--app-transition),
|
||
border-color var(--app-transition),
|
||
color var(--app-transition),
|
||
box-shadow var(--app-transition);
|
||
}
|
||
|
||
details.dropdown > summary:not([role]):active,
|
||
details.dropdown > summary:not([role]):focus {
|
||
border-color: var(--app-form-element-active-border-color);
|
||
background-color: var(--app-form-element-active-background-color);
|
||
}
|
||
|
||
details.dropdown > summary:not([role]):focus {
|
||
box-shadow: 0 0 0 var(--app-outline-width)
|
||
var(--app-form-element-focus-color);
|
||
}
|
||
|
||
details.dropdown > summary:not([role]):focus-visible {
|
||
outline: 0;
|
||
}
|
||
|
||
details.dropdown > summary:not([role])[aria-invalid="false"] {
|
||
--app-form-element-border-color: var(--app-form-element-valid-border-color);
|
||
--app-form-element-active-border-color: var(
|
||
--app-form-element-valid-focus-color
|
||
);
|
||
--app-form-element-focus-color: var(--app-form-element-valid-focus-color);
|
||
}
|
||
|
||
details.dropdown > summary:not([role])[aria-invalid="true"] {
|
||
--app-form-element-border-color: var(
|
||
--app-form-element-invalid-border-color
|
||
);
|
||
--app-form-element-active-border-color: var(
|
||
--app-form-element-invalid-focus-color
|
||
);
|
||
--app-form-element-focus-color: var(--app-form-element-invalid-focus-color);
|
||
}
|
||
|
||
nav details.dropdown {
|
||
display: inline;
|
||
margin: calc(var(--app-nav-element-spacing-vertical) * -1) 0;
|
||
}
|
||
|
||
nav details.dropdown > summary::after {
|
||
transform: rotate(0) translateX(0);
|
||
}
|
||
|
||
nav details.dropdown > summary:not([role]) {
|
||
height: calc(
|
||
1rem * var(--app-line-height) + var(--app-nav-link-spacing-vertical) * 2
|
||
);
|
||
padding: calc(
|
||
var(--app-nav-link-spacing-vertical) - var(--app-border-width) * 2
|
||
)
|
||
var(--app-nav-link-spacing-horizontal);
|
||
}
|
||
|
||
nav details.dropdown > summary:not([role]):focus-visible {
|
||
box-shadow: 0 0 0 var(--app-outline-width) var(--app-primary-focus);
|
||
}
|
||
|
||
details.dropdown > summary + ul {
|
||
display: flex;
|
||
z-index: 99;
|
||
position: absolute;
|
||
left: 0;
|
||
flex-direction: column;
|
||
width: 100%;
|
||
min-width: -moz-fit-content;
|
||
min-width: fit-content;
|
||
margin: 0;
|
||
margin-top: var(--app-outline-width);
|
||
padding: 0.25rem;
|
||
border: 1px solid var(--app-dropdown-border-color);
|
||
border-radius: var(--app-border-radius);
|
||
background-color: var(--app-dropdown-background-color);
|
||
box-shadow: var(--app-dropdown-box-shadow);
|
||
color: var(--app-dropdown-color);
|
||
white-space: nowrap;
|
||
opacity: 0;
|
||
transition:
|
||
opacity var(--app-transition),
|
||
transform 0s ease-in-out 1s;
|
||
}
|
||
|
||
details.dropdown > summary + ul[dir="rtl"] {
|
||
right: 0;
|
||
left: auto;
|
||
}
|
||
|
||
details.dropdown > summary + ul li {
|
||
width: 100%;
|
||
margin-bottom: 0;
|
||
padding: 0;
|
||
list-style: none;
|
||
text-align: left;
|
||
}
|
||
|
||
details.dropdown > summary + ul li a {
|
||
display: block;
|
||
width: 100%;
|
||
margin: 0;
|
||
padding: 0.375rem 0.5rem;
|
||
overflow: hidden;
|
||
border-radius: 3px;
|
||
color: var(--app-dropdown-color);
|
||
text-decoration: none;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
details.dropdown > summary + ul li a:active,
|
||
details.dropdown > summary + ul li a:focus,
|
||
details.dropdown > summary + ul li a:focus-visible,
|
||
details.dropdown > summary + ul li a:hover,
|
||
details.dropdown
|
||
> summary
|
||
+ ul
|
||
li
|
||
a[aria-current]:not([aria-current="false"]) {
|
||
background: color-mix(in srgb, var(--app-contrast) 8%, transparent);
|
||
}
|
||
|
||
details.dropdown > summary + ul li label {
|
||
width: 100%;
|
||
}
|
||
|
||
details.dropdown > summary + ul li:has(label):hover {
|
||
background: color-mix(in srgb, var(--app-contrast) 8%, transparent);
|
||
border-radius: 3px;
|
||
}
|
||
|
||
details.dropdown[open] > summary {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
details.dropdown[open] > summary + ul {
|
||
transform: scaleY(1);
|
||
opacity: 1;
|
||
transition:
|
||
opacity var(--app-transition),
|
||
transform 0s ease-in-out 0s;
|
||
}
|
||
|
||
details.dropdown[open] > summary::before {
|
||
display: block;
|
||
z-index: 1;
|
||
position: fixed;
|
||
width: 100vw;
|
||
height: 100vh;
|
||
inset: 0;
|
||
background: 0 0;
|
||
content: "";
|
||
cursor: default;
|
||
}
|
||
|
||
label > details.dropdown {
|
||
margin-top: calc(var(--app-spacing) * 0.25);
|
||
}
|
||
|
||
[role="group"],
|
||
[role="search"] {
|
||
display: inline-flex;
|
||
position: relative;
|
||
width: 100%;
|
||
margin-bottom: var(--app-spacing);
|
||
border-radius: var(--app-border-radius);
|
||
box-shadow: var(--app-group-box-shadow, 0 0 0 transparent);
|
||
vertical-align: middle;
|
||
transition: box-shadow var(--app-transition);
|
||
}
|
||
|
||
[role="group"] input:not([type="checkbox"], [type="radio"]),
|
||
[role="group"] select,
|
||
[role="group"] > *,
|
||
[role="search"] input:not([type="checkbox"], [type="radio"]),
|
||
[role="search"] select,
|
||
[role="search"] > * {
|
||
position: relative;
|
||
flex: 1 1 auto;
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
[role="group"] input:not([type="checkbox"], [type="radio"]):not(:first-child),
|
||
[role="group"] select:not(:first-child),
|
||
[role="group"] > :not(:first-child),
|
||
[role="search"]
|
||
input:not([type="checkbox"], [type="radio"]):not(:first-child),
|
||
[role="search"] select:not(:first-child),
|
||
[role="search"] > :not(:first-child) {
|
||
margin-left: 0;
|
||
border-top-left-radius: 0;
|
||
border-bottom-left-radius: 0;
|
||
}
|
||
|
||
[role="group"] input:not([type="checkbox"], [type="radio"]):not(:last-child),
|
||
[role="group"] select:not(:last-child),
|
||
[role="group"] > :not(:last-child),
|
||
[role="search"] input:not([type="checkbox"], [type="radio"]):not(:last-child),
|
||
[role="search"] select:not(:last-child),
|
||
[role="search"] > :not(:last-child) {
|
||
border-top-right-radius: 0;
|
||
border-bottom-right-radius: 0;
|
||
}
|
||
|
||
[role="group"] input:not([type="checkbox"], [type="radio"]):focus,
|
||
[role="group"] select:focus,
|
||
[role="group"] > :focus,
|
||
[role="search"] input:not([type="checkbox"], [type="radio"]):focus,
|
||
[role="search"] select:focus,
|
||
[role="search"] > :focus {
|
||
z-index: 2;
|
||
}
|
||
|
||
[role="group"] [role="button"]:not(:first-child),
|
||
[role="group"] [type="button"]:not(:first-child),
|
||
[role="group"] [type="reset"]:not(:first-child),
|
||
[role="group"] [type="submit"]:not(:first-child),
|
||
[role="group"] button:not(:first-child),
|
||
[role="group"] input:not([type="checkbox"], [type="radio"]):not(:first-child),
|
||
[role="group"] select:not(:first-child),
|
||
[role="search"] [role="button"]:not(:first-child),
|
||
[role="search"] [type="button"]:not(:first-child),
|
||
[role="search"] [type="reset"]:not(:first-child),
|
||
[role="search"] [type="submit"]:not(:first-child),
|
||
[role="search"] button:not(:first-child),
|
||
[role="search"]
|
||
input:not([type="checkbox"], [type="radio"]):not(:first-child),
|
||
[role="search"] select:not(:first-child) {
|
||
margin-left: calc(var(--app-border-width) * -1);
|
||
}
|
||
|
||
[role="group"] [role="button"],
|
||
[role="group"] [type="button"],
|
||
[role="group"] [type="reset"],
|
||
[role="group"] [type="submit"],
|
||
[role="group"] button,
|
||
[role="search"] [role="button"],
|
||
[role="search"] [type="button"],
|
||
[role="search"] [type="reset"],
|
||
[role="search"] [type="submit"],
|
||
[role="search"] button {
|
||
width: auto;
|
||
}
|
||
|
||
@supports selector(:has(*)) {
|
||
[role="group"]:has(
|
||
button:focus,
|
||
[type="submit"]:focus,
|
||
[type="button"]:focus,
|
||
[role="button"]:focus
|
||
),
|
||
[role="search"]:has(
|
||
button:focus,
|
||
[type="submit"]:focus,
|
||
[type="button"]:focus,
|
||
[role="button"]:focus
|
||
) {
|
||
--app-group-box-shadow: var(--app-group-box-shadow-focus-with-button);
|
||
}
|
||
|
||
[role="group"]:has(
|
||
button:focus,
|
||
[type="submit"]:focus,
|
||
[type="button"]:focus,
|
||
[role="button"]:focus
|
||
)
|
||
input:not([type="checkbox"], [type="radio"]),
|
||
[role="group"]:has(
|
||
button:focus,
|
||
[type="submit"]:focus,
|
||
[type="button"]:focus,
|
||
[role="button"]:focus
|
||
)
|
||
select,
|
||
[role="search"]:has(
|
||
button:focus,
|
||
[type="submit"]:focus,
|
||
[type="button"]:focus,
|
||
[role="button"]:focus
|
||
)
|
||
input:not([type="checkbox"], [type="radio"]),
|
||
[role="search"]:has(
|
||
button:focus,
|
||
[type="submit"]:focus,
|
||
[type="button"]:focus,
|
||
[role="button"]:focus
|
||
)
|
||
select {
|
||
border-color: transparent;
|
||
}
|
||
|
||
[role="group"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
),
|
||
[role="search"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
) {
|
||
--app-group-box-shadow: var(--app-group-box-shadow-focus-with-input);
|
||
}
|
||
|
||
[role="group"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
[role="button"],
|
||
[role="group"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
[type="button"],
|
||
[role="group"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
[type="submit"],
|
||
[role="group"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
button,
|
||
[role="search"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
[role="button"],
|
||
[role="search"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
[type="button"],
|
||
[role="search"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
[type="submit"],
|
||
[role="search"]:has(
|
||
input:not([type="submit"], [type="button"]):focus,
|
||
select:focus
|
||
)
|
||
button {
|
||
--app-button-box-shadow: 0 0 0 var(--app-border-width)
|
||
var(--app-primary-border);
|
||
--app-button-hover-box-shadow: 0 0 0 var(--app-border-width)
|
||
var(--app-primary-hover-border);
|
||
}
|
||
|
||
[role="group"] [role="button"]:focus,
|
||
[role="group"] [type="button"]:focus,
|
||
[role="group"] [type="reset"]:focus,
|
||
[role="group"] [type="submit"]:focus,
|
||
[role="group"] button:focus,
|
||
[role="search"] [role="button"]:focus,
|
||
[role="search"] [type="button"]:focus,
|
||
[role="search"] [type="reset"]:focus,
|
||
[role="search"] [type="submit"]:focus,
|
||
[role="search"] button:focus {
|
||
box-shadow: none;
|
||
}
|
||
}
|
||
|
||
[role="search"] > :first-child {
|
||
border-top-left-radius: 5rem;
|
||
border-bottom-left-radius: 5rem;
|
||
}
|
||
|
||
[role="search"] > :last-child {
|
||
border-top-right-radius: 5rem;
|
||
border-bottom-right-radius: 5rem;
|
||
}
|
||
|
||
html {
|
||
scroll-behavior: smooth;
|
||
background: var(--app-sidebar-background-color);
|
||
}
|
||
|
||
.white-space-nowrap {
|
||
white-space: nowrap;
|
||
}
|
||
|
||
[aria-busy="true"]:not(input, select, textarea, html, form) {
|
||
white-space: nowrap;
|
||
}
|
||
|
||
[aria-busy="true"]:not(input, select, textarea, html, form)::before {
|
||
display: inline-block;
|
||
width: 1em;
|
||
height: 1em;
|
||
background-image: var(--app-icon-loading);
|
||
background-size: 1em auto;
|
||
background-repeat: no-repeat;
|
||
content: "";
|
||
vertical-align: -0.125em;
|
||
}
|
||
|
||
[aria-busy="true"]:not(input, select, textarea, html, form):not(
|
||
:empty
|
||
)::before {
|
||
margin-inline-end: calc(var(--app-spacing) * 0.5);
|
||
}
|
||
|
||
[aria-busy="true"]:not(input, select, textarea, html, form):empty {
|
||
text-align: center;
|
||
}
|
||
|
||
[role="button"][aria-busy="true"],
|
||
[type="button"][aria-busy="true"],
|
||
[type="reset"][aria-busy="true"],
|
||
[type="submit"][aria-busy="true"],
|
||
a[aria-busy="true"],
|
||
button[aria-busy="true"] {
|
||
pointer-events: none;
|
||
}
|
||
|
||
dialog {
|
||
display: flex;
|
||
z-index: 999;
|
||
position: fixed;
|
||
top: 0;
|
||
right: 0;
|
||
bottom: 0;
|
||
left: 0;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: inherit;
|
||
min-width: 100%;
|
||
height: inherit;
|
||
min-height: 100%;
|
||
padding: 0;
|
||
border: 0;
|
||
-webkit-backdrop-filter: var(--app-modal-overlay-backdrop-filter);
|
||
backdrop-filter: var(--app-modal-overlay-backdrop-filter);
|
||
background-color: var(--app-modal-overlay-background-color);
|
||
color: var(--app-color);
|
||
}
|
||
|
||
dialog > article {
|
||
width: 100%;
|
||
max-height: calc(100vh - var(--app-spacing) * 2);
|
||
margin: var(--app-spacing);
|
||
overflow: auto;
|
||
}
|
||
|
||
.bi::before,
|
||
[class^="bi-"]::before,
|
||
[class*=" bi-"]::before {
|
||
vertical-align: -0.125em;
|
||
}
|
||
|
||
@media (min-width: 576px) {
|
||
dialog > article {
|
||
max-width: 510px;
|
||
}
|
||
}
|
||
|
||
@media (min-width: 768px) {
|
||
dialog > article {
|
||
max-width: 700px;
|
||
}
|
||
}
|
||
|
||
/* Dialog header/footer/close styles → web/css/components/app-dialog.css */
|
||
|
||
dialog:not([open]),
|
||
dialog[open="false"] {
|
||
display: none;
|
||
}
|
||
|
||
.modal-is-open {
|
||
padding-right: var(--app-scrollbar-width, 0);
|
||
overflow: hidden;
|
||
pointer-events: none;
|
||
touch-action: none;
|
||
}
|
||
|
||
.modal-is-open dialog {
|
||
pointer-events: auto;
|
||
touch-action: auto;
|
||
}
|
||
|
||
:where(.modal-is-opening, .modal-is-closing) dialog,
|
||
:where(.modal-is-opening, .modal-is-closing) dialog > article {
|
||
animation-duration: 0.2s;
|
||
animation-timing-function: ease-in-out;
|
||
animation-fill-mode: both;
|
||
}
|
||
|
||
:where(.modal-is-opening, .modal-is-closing) dialog {
|
||
animation-duration: 0.8s;
|
||
animation-name: modal-overlay;
|
||
}
|
||
|
||
:where(.modal-is-opening, .modal-is-closing) dialog > article {
|
||
animation-delay: 0.2s;
|
||
animation-name: modal;
|
||
}
|
||
|
||
.modal-is-closing dialog,
|
||
.modal-is-closing dialog > article {
|
||
animation-delay: 0s;
|
||
animation-direction: reverse;
|
||
}
|
||
|
||
@keyframes modal-overlay {
|
||
from {
|
||
-webkit-backdrop-filter: none;
|
||
backdrop-filter: none;
|
||
background-color: transparent;
|
||
}
|
||
}
|
||
|
||
@keyframes modal {
|
||
from {
|
||
transform: translateY(-100%);
|
||
opacity: 0;
|
||
}
|
||
}
|
||
|
||
:where(nav li)::before {
|
||
float: left;
|
||
content: "";
|
||
}
|
||
|
||
nav,
|
||
nav ul {
|
||
display: flex;
|
||
}
|
||
|
||
nav {
|
||
justify-content: space-between;
|
||
overflow: visible;
|
||
}
|
||
|
||
nav ol,
|
||
nav ul {
|
||
align-items: center;
|
||
margin-bottom: 0;
|
||
padding: 0;
|
||
list-style: none;
|
||
}
|
||
|
||
nav ol:first-of-type,
|
||
nav ul:first-of-type {
|
||
margin-left: calc(var(--app-nav-element-spacing-horizontal) * -1);
|
||
}
|
||
|
||
nav ol:last-of-type,
|
||
nav ul:last-of-type {
|
||
margin-right: calc(var(--app-nav-element-spacing-horizontal) * -1);
|
||
}
|
||
|
||
nav li {
|
||
display: inline-block;
|
||
margin: 0;
|
||
padding: var(--app-nav-element-spacing-vertical)
|
||
var(--app-nav-element-spacing-horizontal);
|
||
}
|
||
|
||
nav li :where(a, [role="link"]) {
|
||
display: inline-block;
|
||
margin: calc(var(--app-nav-link-spacing-vertical) * -1)
|
||
calc(var(--app-nav-link-spacing-horizontal) * -1);
|
||
padding: var(--app-nav-link-spacing-vertical)
|
||
var(--app-nav-link-spacing-horizontal);
|
||
border-radius: var(--app-border-radius);
|
||
}
|
||
|
||
nav li :where(a, [role="link"]):not(:hover) {
|
||
text-decoration: none;
|
||
}
|
||
|
||
nav li [role="button"],
|
||
nav li [type="button"],
|
||
nav li button,
|
||
nav
|
||
li
|
||
input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]),
|
||
nav li select {
|
||
height: auto;
|
||
margin-right: inherit;
|
||
margin-bottom: 0;
|
||
margin-left: inherit;
|
||
padding: calc(
|
||
var(--app-nav-link-spacing-vertical) - var(--app-border-width) * 2
|
||
)
|
||
var(--app-nav-link-spacing-horizontal);
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] {
|
||
--app-breadcrumb-separator-size: 0.75rem;
|
||
--app-nav-element-spacing-vertical: 0.25rem;
|
||
--app-nav-element-spacing-horizontal: 0.25rem;
|
||
--app-nav-link-spacing-vertical: 0.25rem;
|
||
--app-nav-link-spacing-horizontal: 0.25rem;
|
||
align-items: center;
|
||
justify-content: start;
|
||
font-size: 0.875em; /* em-relative sizing — intentional, scales with parent */
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] ol,
|
||
nav[aria-label="breadcrumb"] ul {
|
||
margin: 0;
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] :is(ol, ul) li {
|
||
padding: 0;
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] :is(ol, ul) li:not(:first-child) {
|
||
margin-inline-start: 0;
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] :is(ol, ul) li a {
|
||
margin: calc(var(--app-nav-link-spacing-vertical) * -1) 0;
|
||
margin-inline-start: calc(var(--app-nav-link-spacing-horizontal) * -1);
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] :is(ol, ul) li:not(:last-child)::after {
|
||
display: inline-block;
|
||
width: var(--app-breadcrumb-separator-size);
|
||
height: var(--app-breadcrumb-separator-size);
|
||
margin-inline: calc(var(--app-nav-link-spacing-horizontal) * 0.75);
|
||
content: "";
|
||
background-image: var(--app-icon-chevron);
|
||
background-size: var(--app-breadcrumb-separator-size) auto;
|
||
background-repeat: no-repeat;
|
||
opacity: 0.7;
|
||
transform: rotate(-90deg);
|
||
}
|
||
|
||
nav[aria-label="breadcrumb"] a[aria-current]:not([aria-current="false"]) {
|
||
background-color: transparent;
|
||
color: inherit;
|
||
text-decoration: none;
|
||
pointer-events: none;
|
||
}
|
||
|
||
aside li,
|
||
aside nav,
|
||
aside ol,
|
||
aside ul {
|
||
display: block;
|
||
}
|
||
|
||
aside li {
|
||
padding: calc(var(--app-nav-element-spacing-vertical) * 0.5)
|
||
var(--app-nav-element-spacing-horizontal);
|
||
}
|
||
|
||
aside li a {
|
||
display: block;
|
||
text-decoration: none;
|
||
}
|
||
|
||
aside li [role="button"] {
|
||
margin: inherit;
|
||
}
|
||
|
||
.text-align-center {
|
||
text-align: center;
|
||
}
|
||
|
||
/* Loading state - global cursor and interaction blocking */
|
||
body.is-loading {
|
||
cursor: wait;
|
||
}
|
||
|
||
body.is-loading * {
|
||
cursor: wait !important;
|
||
}
|
||
|
||
body.is-loading button,
|
||
body.is-loading a,
|
||
body.is-loading input,
|
||
body.is-loading select,
|
||
body.is-loading textarea {
|
||
pointer-events: none;
|
||
}
|
||
|
||
/* ── Print: hide all navigation chrome ── */
|
||
@media print {
|
||
.app-header,
|
||
aside.aside-icon-bar,
|
||
aside.app-sidebar,
|
||
.app-drawer-backdrop {
|
||
display: none !important;
|
||
}
|
||
|
||
.app-container {
|
||
display: block !important;
|
||
}
|
||
}
|
||
}
|