/*!
 * Preco Quote Engine — scoped reset, typography and primitives
 * ===========================================================================
 *
 * Depends on preco-tokens.css. Read that file's header first: it carries the
 * specificity convention, the naming convention and the breakpoint table that
 * this file and every later widget stylesheet follow.
 *
 * Everything here is scoped to `.preco`. Nothing leaks out and nothing is
 * inherited in: typography, colour, spacing, borders, radii, shadows, form
 * control appearance, button appearance, focus rings and states are all
 * declared by the plugin.
 *
 * There is no `!important` in this file. If one ever becomes necessary it must
 * name the specific theme rule it defends against, in a comment, at the
 * declaration.
 *
 * @package Preco\QuoteEngine
 */

/* =========================================================================
 * 1. Root scope
 * ========================================================================= */

.preco.preco {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
	border: 0;
	color: var(--preco-ink-body);
	font-family: var(--preco-font-sans);
	font-size: var(--preco-fs-body);
	font-style: normal;
	font-weight: var(--preco-fw-regular);
	font-variant-numeric: tabular-nums;
	line-height: var(--preco-lh-normal);
	letter-spacing: var(--preco-ls-normal);
	text-align: left;
	text-transform: none;
	/*
	 * How text breaks is inherited too, and a theme that sets word-break or
	 * hyphens on body or on a wrapper changes where the plugin's own lines
	 * wrap. These were the four inherited properties the scope still let in.
	 * overflow-wrap is left to the components, which use it deliberately to
	 * stop a long token overflowing its column.
	 */
	word-break: normal;
	word-spacing: normal;
	white-space: normal;
	hyphens: manual;
	background: transparent;
	/*
	 * Pins form controls and scrollbars to the light scheme. Without this a
	 * browser in dark mode restyles native controls inside the plugin, which
	 * is appearance inherited from outside.
	 */
	color-scheme: light;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	-webkit-text-size-adjust: 100%;
	text-size-adjust: 100%;
}

/* =========================================================================
 * 2. Scoped reset
 *
 * `font: inherit` and `color: inherit` on every descendant are the load-bearing
 * declarations: they chain the whole subtree back to the root above, so a theme
 * rule targeting an element inside the widget cannot reach it.
 * ========================================================================= */

.preco.preco *,
.preco.preco *::before,
.preco.preco *::after {
	box-sizing: border-box;
	margin: 0;
	padding: 0;
	border: 0 solid var(--preco-border);
	color: inherit;
	font: inherit;
	font-size: 100%;
	letter-spacing: inherit;
	text-align: inherit;
	text-decoration: none;
	text-transform: none;
	vertical-align: baseline;
	list-style: none;
	background: transparent;
	outline-offset: var(--preco-focus-offset);
}

/* Replaced elements must not overflow their column at any width (AC-14). */
.preco.preco img,
.preco.preco svg,
.preco.preco video,
.preco.preco canvas,
.preco.preco picture {
	display: block;
	max-width: 100%;
	height: auto;
}

.preco.preco svg {
	fill: currentColor;
}

/* Form controls: every appearance property declared, none inherited. */
.preco.preco input,
.preco.preco select,
.preco.preco textarea,
.preco.preco button {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	min-width: 0;
	color: inherit;
	font: inherit;
	letter-spacing: inherit;
	background-color: transparent;
	background-image: none;
	border-radius: 0;
	box-shadow: none;
	text-shadow: none;
}

.preco.preco textarea {
	overflow: auto;
	resize: vertical;
}

.preco.preco input[type="checkbox"],
.preco.preco input[type="radio"] {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	flex: 0 0 auto;
}

.preco.preco input[type="search"]::-webkit-search-decoration,
.preco.preco input[type="search"]::-webkit-search-cancel-button {
	-webkit-appearance: none;
	appearance: none;
}

.preco.preco input[type="number"]::-webkit-inner-spin-button,
.preco.preco input[type="number"]::-webkit-outer-spin-button {
	-webkit-appearance: none;
	appearance: none;
	margin: 0;
}

.preco.preco input[type="number"] {
	-moz-appearance: textfield;
}

.preco.preco button,
.preco.preco [role="button"] {
	cursor: pointer;
	background: none;
}

.preco.preco button:disabled,
.preco.preco input:disabled,
.preco.preco select:disabled,
.preco.preco textarea:disabled {
	cursor: not-allowed;
}

.preco.preco table {
	width: 100%;
	border-collapse: collapse;
	border-spacing: 0;
}

.preco.preco a {
	color: var(--preco-ink-link);
	text-decoration: none;
	cursor: pointer;
	background-color: transparent;
}

.preco.preco hr {
	height: 0;
	border-top: 1px solid var(--preco-border);
}

.preco.preco code,
.preco.preco pre,
.preco.preco kbd,
.preco.preco samp {
	font-family: var(--preco-font-mono);
	font-size: 0.92em;
}

/*
 * The `hidden` attribute, and it has to outrank every component rule.
 *
 * `.preco.preco [hidden]` is (0,3,0) — two classes plus an attribute — which
 * is exactly the specificity of a component rule like
 * `.preco.preco .preco-feedback`. A tie is settled by source order, and every
 * component stylesheet loads after this one, so a component that declares
 * `display: flex` on a block the markup marks `hidden` wins and the block is
 * visible. That is not hypothetical: the quote widgets' feedback panel shipped
 * exactly like that, and "Added to your cart" sat on every product page until a
 * measured pass in the browser found it.
 *
 * Repeating the attribute makes it (0,4,0), which no component rule in this
 * plugin can reach, so the attribute means what it says wherever it is used.
 * The single-attribute form stays as well, for the case where nothing competes
 * with it.
 *
 * This is why components use the attribute rather than a `.preco-u-hidden`
 * class: `hidden` also removes the element from the accessibility tree, which a
 * class cannot do, and `element.hidden = false` is what the scripts already
 * say.
 */
.preco.preco [hidden],
.preco.preco [hidden][hidden] {
	display: none;
}

/* =========================================================================
 * 3. Focus
 *
 * Keyboard focus is always visible. :focus-visible is the primary rule;
 * the :focus fallback is scoped to the same selector set so a browser
 * without :focus-visible still shows a ring.
 * ========================================================================= */

.preco.preco :focus-visible {
	outline: var(--preco-focus-width) solid var(--preco-focus-color);
	outline-offset: var(--preco-focus-offset);
}

.preco.preco :focus:not(:focus-visible) {
	outline: none;
}

.preco.preco .preco-on-inverse :focus-visible {
	outline-color: var(--preco-focus-color-inverse);
}

/* =========================================================================
 * 4. Layout
 * ========================================================================= */

.preco.preco .preco-container {
	width: 100%;
	max-width: var(--preco-container-max);
	margin-right: auto;
	margin-left: auto;
	padding-right: var(--preco-gutter);
	padding-left: var(--preco-gutter);
}

.preco.preco .preco-container--narrow {
	max-width: var(--preco-container-narrow);
}

.preco.preco .preco-stack {
	display: flex;
	flex-direction: column;
	gap: var(--preco-space-7);
}

.preco.preco .preco-stack--tight {
	gap: var(--preco-space-4);
}

.preco.preco .preco-stack--loose {
	gap: var(--preco-space-10);
}

.preco.preco .preco-row {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--preco-space-6);
}

.preco.preco .preco-grid {
	display: grid;
	grid-template-columns: 1fr;
	gap: var(--preco-space-7);
}

@media (min-width: 768px) {

	.preco.preco .preco-grid--2 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	.preco.preco .preco-grid--3 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (min-width: 1024px) {

	.preco.preco .preco-grid--3 {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}

/* A table that must scroll scrolls inside its own wrapper, never the page. */
.preco.preco .preco-scroller {
	max-width: 100%;
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	overscroll-behavior-x: contain;
}

/* =========================================================================
 * 5. Typography
 * ========================================================================= */

.preco.preco .preco-display {
	font-size: var(--preco-fs-display);
	font-weight: var(--preco-fw-heavy);
	line-height: var(--preco-lh-tight);
	letter-spacing: var(--preco-ls-tight);
	color: var(--preco-ink);
}

.preco.preco .preco-h1 {
	font-size: var(--preco-fs-h1);
	font-weight: var(--preco-fw-bold);
	line-height: var(--preco-lh-tight);
	letter-spacing: var(--preco-ls-tight);
	color: var(--preco-ink);
}

.preco.preco .preco-h2 {
	font-size: var(--preco-fs-h2);
	font-weight: var(--preco-fw-bold);
	line-height: var(--preco-lh-snug);
	letter-spacing: var(--preco-ls-tight);
	color: var(--preco-ink);
}

.preco.preco .preco-h3 {
	font-size: var(--preco-fs-h3);
	font-weight: var(--preco-fw-semibold);
	line-height: var(--preco-lh-snug);
	color: var(--preco-ink);
}

.preco.preco .preco-h4 {
	font-size: var(--preco-fs-h4);
	font-weight: var(--preco-fw-semibold);
	line-height: var(--preco-lh-snug);
	color: var(--preco-ink);
}

.preco.preco .preco-body {
	font-size: var(--preco-fs-body);
	line-height: var(--preco-lh-normal);
	color: var(--preco-ink-body);
}

.preco.preco .preco-body--lead {
	font-size: var(--preco-fs-body-lg);
	line-height: var(--preco-lh-relaxed);
	color: var(--preco-ink-muted);
}

.preco.preco .preco-small {
	font-size: var(--preco-fs-small);
	line-height: var(--preco-lh-normal);
	color: var(--preco-ink-muted);
}

.preco.preco .preco-caption {
	font-size: var(--preco-fs-caption);
	font-weight: var(--preco-fw-medium);
	line-height: var(--preco-lh-normal);
	color: var(--preco-ink-subtle);
}

.preco.preco .preco-label {
	display: block;
	font-size: var(--preco-fs-label);
	font-weight: var(--preco-fw-semibold);
	line-height: var(--preco-lh-snug);
	letter-spacing: var(--preco-ls-label);
	text-transform: uppercase;
	color: var(--preco-ink-muted);
}

.preco.preco .preco-mono {
	font-family: var(--preco-font-mono);
	font-variant-numeric: tabular-nums;
	letter-spacing: var(--preco-ls-normal);
}

.preco.preco .preco-link {
	color: var(--preco-ink-link);
	font-weight: var(--preco-fw-semibold);
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 2px;
	transition: color var(--preco-transition-fast);
}

.preco.preco .preco-link:hover {
	color: var(--preco-ink-link-hover);
}

.preco.preco .preco-prose {
	font-size: var(--preco-fs-body);
	line-height: var(--preco-lh-relaxed);
	color: var(--preco-ink-body);
}

.preco.preco .preco-prose > * + * {
	margin-top: var(--preco-space-6);
}

.preco.preco .preco-prose strong {
	font-weight: var(--preco-fw-semibold);
	color: var(--preco-ink);
}

.preco.preco .preco-prose ul,
.preco.preco .preco-prose ol {
	padding-left: var(--preco-space-8);
}

.preco.preco .preco-prose ul {
	list-style: disc;
}

.preco.preco .preco-prose ol {
	list-style: decimal;
}

.preco.preco .preco-prose li + li {
	margin-top: var(--preco-space-3);
}

/* -------------------------------------------------------------------------
 * Prose that came from a product description.
 *
 * The rules above cover paragraphs and lists, which is all a description
 * used to contain. Catalogue descriptions now also carry section headings
 * and specification and pricing tables, and those had no rules at all: they
 * fell through to whatever the theme left them, which on a reset theme is
 * body text. A heading that looks identical to the paragraph under it is the
 * whole of the "poor formatting" - there was no hierarchy to read.
 *
 * Sized DOWN from the widget's own heading, which is an h3 (see
 * partials/heading.php). These are sections inside that widget, so they must
 * not compete with it.
 * ------------------------------------------------------------------------- */

.preco.preco .preco-prose h2,
.preco.preco .preco-prose h3,
.preco.preco .preco-prose h4 {
	color: var(--preco-ink);
	line-height: var(--preco-lh-snug);
}

/*
 * A hairline above each section does the structural work here. Type alone
 * could not: the only token between the widget's own h3 and body text is
 * h4, which lands two pixels above a paragraph, and borrowing h3 would have
 * these competing with the widget heading they sit under. The rule separates
 * sections unmistakably while the heading stays politely smaller.
 */
.preco.preco .preco-prose h2 {
	margin-top: var(--preco-space-10);
	margin-bottom: var(--preco-space-5);
	padding-top: var(--preco-space-8);
	border-top: 1px solid var(--preco-border);
	font-size: var(--preco-fs-h4);
	font-weight: var(--preco-fw-bold);
}

/* The opening section is not being separated from anything. */
.preco.preco .preco-prose > h2:first-child {
	padding-top: 0;
	border-top: 0;
}

.preco.preco .preco-prose h3,
.preco.preco .preco-prose h4 {
	margin-top: var(--preco-space-8);
	margin-bottom: var(--preco-space-3);
	font-size: var(--preco-fs-body);
	font-weight: var(--preco-fw-semibold);
}

/* A heading that opens the block has nothing to be pushed away from. */
.preco.preco .preco-prose > :first-child {
	margin-top: 0;
}

/*
 * Tables follow .preco-table's conventions rather than inventing a second
 * look, so a specification table inside a description reads as the same
 * component as every other table the plugin draws.
 */
.preco.preco .preco-prose table {
	width: 100%;
	margin-top: var(--preco-space-6);
	font-size: var(--preco-fs-small);
	border-collapse: collapse;
}

.preco.preco .preco-prose th,
.preco.preco .preco-prose td {
	padding: var(--preco-space-5) var(--preco-space-6);
	text-align: left;
	vertical-align: top;
	border-bottom: 1px solid var(--preco-border);
}

/* Column headings: the pricing table's top row. */
.preco.preco .preco-prose thead th {
	font-size: var(--preco-fs-label);
	font-weight: var(--preco-fw-bold);
	letter-spacing: var(--preco-ls-label);
	text-transform: uppercase;
	color: var(--preco-ink-muted);
	background-color: var(--preco-surface-sunken);
}

/*
 * Row labels: the first cell of each specification row. Not uppercased and
 * not given a filled background, because a whole column of that reads as a
 * second header rather than as the quiet left-hand label it is.
 */
.preco.preco .preco-prose tbody th {
	width: 38%;
	font-weight: var(--preco-fw-semibold);
	color: var(--preco-ink-muted);
}

.preco.preco .preco-prose tbody tr:last-child th,
.preco.preco .preco-prose tbody tr:last-child td {
	border-bottom: 0;
}

/* The first cell of a row carries no left padding, so the table's left edge
 * lines up with the paragraphs above and below it. */
.preco.preco .preco-prose tr > :first-child {
	padding-left: 0;
}

.preco.preco .preco-prose tr > :last-child {
	padding-right: 0;
}

@media (max-width: 599px) {

	.preco.preco .preco-prose th,
	.preco.preco .preco-prose td {
		padding: var(--preco-space-4) var(--preco-space-4);
	}

	.preco.preco .preco-prose tbody th {
		width: 44%;
	}
}

/* =========================================================================
 * 6. Buttons
 * ========================================================================= */

.preco.preco .preco-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--preco-space-4);
	min-height: var(--preco-control-h);
	padding: var(--preco-space-5) var(--preco-space-8);
	border: var(--preco-control-border) solid transparent;
	border-radius: var(--preco-control-radius);
	font-family: var(--preco-font-sans);
	font-size: var(--preco-fs-button);
	font-weight: var(--preco-fw-bold);
	line-height: 1.2;
	letter-spacing: var(--preco-ls-wide);
	text-align: center;
	text-decoration: none;
	white-space: nowrap;
	cursor: pointer;
	transition:
		background-color var(--preco-transition-fast),
		border-color var(--preco-transition-fast),
		color var(--preco-transition-fast),
		box-shadow var(--preco-transition-fast);
}

.preco.preco .preco-btn--primary {
	color: var(--preco-ink-inverse);
	background-color: var(--preco-brand-primary);
	border-color: var(--preco-brand-primary);
}

.preco.preco .preco-btn--primary:hover {
	background-color: var(--preco-brand-primary-hover);
	border-color: var(--preco-brand-primary-hover);
}

.preco.preco .preco-btn--primary:active {
	background-color: var(--preco-brand-primary-active);
	border-color: var(--preco-brand-primary-active);
}

.preco.preco .preco-btn--secondary {
	color: var(--preco-ink);
	background-color: var(--preco-surface);
	border-color: var(--preco-border-strong);
}

.preco.preco .preco-btn--secondary:hover {
	border-color: var(--preco-brand-primary);
	color: var(--preco-brand-primary);
}

.preco.preco .preco-btn--ghost {
	color: var(--preco-ink-muted);
	background-color: transparent;
	border-color: transparent;
}

.preco.preco .preco-btn--ghost:hover {
	color: var(--preco-brand-primary);
	background-color: var(--preco-brand-primary-soft);
}

.preco.preco .preco-btn--dark {
	color: var(--preco-ink-inverse);
	background-color: var(--preco-black);
	border-color: var(--preco-black);
}

.preco.preco .preco-btn--dark:hover {
	background-color: var(--preco-n-950);
	border-color: var(--preco-n-950);
}

.preco.preco .preco-btn--whatsapp {
	color: var(--preco-ink-inverse);
	background-color: var(--preco-whatsapp-strong);
	border-color: var(--preco-whatsapp-strong);
}

.preco.preco .preco-btn--whatsapp:hover {
	background-color: var(--preco-whatsapp-strong-hover);
	border-color: var(--preco-whatsapp-strong-hover);
}

.preco.preco .preco-btn--block {
	display: flex;
	width: 100%;
}

/*
 * Specification 20: on mobile buttons are full width, stacked, 12px apart and
 * at least 48px tall. Below 768px every button therefore steps up.
 */
@media (max-width: 767px) {

	.preco.preco .preco-btn {
		min-height: var(--preco-control-h-lg);
		white-space: normal;
	}

	.preco.preco .preco-btn-group {
		flex-direction: column;
		gap: var(--preco-space-6);
	}

	.preco.preco .preco-btn-group .preco-btn {
		width: 100%;
	}
}

.preco.preco .preco-btn-group {
	display: flex;
	flex-wrap: wrap;
	gap: var(--preco-space-6);
}

.preco.preco .preco-btn:disabled,
.preco.preco .preco-btn[aria-disabled="true"] {
	opacity: 0.55;
	cursor: not-allowed;
}

/*
 * AC-26: no primary action is ever rendered permanently inert without an
 * explanation. A button in the busy state is disabled only for the duration of
 * a request it has already accepted, and says so through its label.
 */
.preco.preco .preco-btn.preco-is-busy {
	cursor: progress;
	opacity: 0.8;
}

/*
 * The in-button spinner, hidden until the button says it is loading.
 *
 * It shipped as `display: inline-block` with nothing to switch it off, so
 * every Preco button rendered a spinning ring beside its label at rest. The
 * class existed from phase 1 and had no caller until the ordering widgets
 * arrived, which is how it stayed wrong for seven phases and was found by
 * looking at a screenshot rather than at the markup.
 */
.preco.preco .preco-btn__spinner {
	display: none;
	width: 14px;
	height: 14px;
	border: 2px solid currentColor;
	border-top-color: transparent;
	border-radius: var(--preco-radius-circle);
	animation: preco-spin 640ms linear infinite;
}

.preco.preco .preco-is-loading .preco-btn__spinner,
.preco.preco .preco-btn.preco-is-loading .preco-btn__spinner {
	display: inline-block;
}

@keyframes preco-spin {

	to {
		transform: rotate(360deg);
	}
}

@media (prefers-reduced-motion: reduce) {

	.preco.preco .preco-btn__spinner {
		animation-duration: 2s;
	}
}

/* =========================================================================
 * 7. Form controls
 * ========================================================================= */

.preco.preco .preco-field {
	display: flex;
	flex-direction: column;
	gap: var(--preco-space-3);
}

.preco.preco .preco-field__hint {
	font-size: var(--preco-fs-caption);
	color: var(--preco-ink-subtle);
}

.preco.preco .preco-field__required {
	color: var(--preco-danger);
}

/*
 * The inline per-field error the REST `fields` map renders into.
 *
 * It reserves its line whether or not there is a message, so showing one does
 * not push the rest of the form down. A validation failure that reflows the
 * page moves the control the customer was about to press, which is how a
 * mis-click becomes a second failed submission.
 */
.preco.preco .preco-field__error {
	display: block;
	min-height: var(--preco-lh-normal);
	font-size: var(--preco-fs-caption);
	line-height: var(--preco-lh-normal);
	color: var(--preco-danger-strong);
}

.preco.preco .preco-field__error:empty {
	min-height: 0;
}

.preco.preco .preco-field--invalid .preco-field__hint {
	display: none;
}

.preco.preco .preco-input,
.preco.preco .preco-select,
.preco.preco .preco-textarea {
	display: block;
	width: 100%;
	min-height: var(--preco-control-h);
	padding: var(--preco-space-5) var(--preco-control-px);
	color: var(--preco-ink);
	font-family: var(--preco-font-sans);
	font-size: var(--preco-fs-form);
	font-weight: var(--preco-fw-medium);
	line-height: 1.3;
	background-color: var(--preco-surface);
	border: var(--preco-control-border) solid var(--preco-border-input);
	border-radius: var(--preco-control-radius);
	transition:
		border-color var(--preco-transition-fast),
		box-shadow var(--preco-transition-fast);
}

.preco.preco .preco-textarea {
	min-height: calc(var(--preco-control-h) * 2.5);
	padding-top: var(--preco-space-6);
	line-height: var(--preco-lh-normal);
	resize: vertical;
}

.preco.preco .preco-input::placeholder,
.preco.preco .preco-textarea::placeholder {
	color: var(--preco-ink-subtle);
	font-weight: var(--preco-fw-regular);
	opacity: 1;
}

.preco.preco .preco-input:hover,
.preco.preco .preco-select:hover,
.preco.preco .preco-textarea:hover {
	border-color: var(--preco-n-600);
}

.preco.preco .preco-input:focus,
.preco.preco .preco-select:focus,
.preco.preco .preco-textarea:focus {
	border-color: var(--preco-brand-primary);
	outline: var(--preco-focus-width) solid var(--preco-focus-color);
	outline-offset: var(--preco-focus-offset);
}

.preco.preco .preco-input:disabled,
.preco.preco .preco-select:disabled,
.preco.preco .preco-textarea:disabled {
	color: var(--preco-ink-subtle);
	background-color: var(--preco-surface-sunken);
	border-color: var(--preco-border);
}

/* Native select arrow is replaced, so appearance does not vary by platform. */
.preco.preco .preco-select {
	padding-right: var(--preco-space-11);
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%2352585f' d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.4 0 1.4z'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right var(--preco-control-px) center;
	background-size: 12px 8px;
	cursor: pointer;
}

/* Invalid state. Specification 20: the field border recolours with the message. */
.preco.preco .preco-input[aria-invalid="true"],
.preco.preco .preco-select[aria-invalid="true"],
.preco.preco .preco-textarea[aria-invalid="true"] {
	border-color: var(--preco-danger);
	background-color: var(--preco-danger-soft);
}

.preco.preco .preco-check {
	display: flex;
	align-items: flex-start;
	gap: var(--preco-space-5);
	min-height: var(--preco-tap-min);
	padding: var(--preco-space-4) 0;
	cursor: pointer;
}

.preco.preco .preco-check__control {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	margin-top: 1px;
	background-color: var(--preco-surface);
	border: var(--preco-control-border) solid var(--preco-border-input);
	border-radius: var(--preco-radius-xs);
	cursor: pointer;
	transition:
		background-color var(--preco-transition-fast),
		border-color var(--preco-transition-fast);
}

.preco.preco .preco-check__control:checked {
	background-color: var(--preco-brand-primary);
	border-color: var(--preco-brand-primary);
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='10' viewBox='0 0 12 10'%3E%3Cpath fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='square' d='m1 5 3.2 3.2L11 1.4'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 10px;
}

.preco.preco .preco-check__control[type="radio"] {
	border-radius: var(--preco-radius-circle);
}

.preco.preco .preco-check__label {
	font-size: var(--preco-fs-small);
	line-height: var(--preco-lh-normal);
	color: var(--preco-ink-body);
}

.preco.preco .preco-fieldset {
	display: flex;
	flex-direction: column;
	gap: var(--preco-space-4);
	border: 0;
}

.preco.preco .preco-legend {
	display: block;
	padding: 0;
	font-size: var(--preco-fs-label);
	font-weight: var(--preco-fw-semibold);
	letter-spacing: var(--preco-ls-label);
	text-transform: uppercase;
	color: var(--preco-ink-muted);
}

/* =========================================================================
 * 8. Surfaces
 * ========================================================================= */

.preco.preco .preco-panel {
	padding: var(--preco-space-8);
	background-color: var(--preco-surface);
	border: 1px solid var(--preco-border);
	border-radius: var(--preco-radius-md);
}

.preco.preco .preco-panel--sunken {
	background-color: var(--preco-surface-sunken);
}

.preco.preco .preco-panel--raised {
	border-color: var(--preco-border-strong);
	box-shadow: var(--preco-shadow-md);
}

.preco.preco .preco-panel--accent {
	border-left: 3px solid var(--preco-brand-primary);
}

.preco.preco .preco-panel__header {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--preco-space-5);
	padding-bottom: var(--preco-space-6);
	margin-bottom: var(--preco-space-7);
	border-bottom: 1px solid var(--preco-border);
}

.preco.preco .preco-divider {
	height: 1px;
	background-color: var(--preco-border);
}

.preco.preco .preco-badge {
	display: inline-flex;
	align-items: center;
	padding: var(--preco-space-2) var(--preco-space-5);
	font-size: var(--preco-fs-caption);
	font-weight: var(--preco-fw-bold);
	letter-spacing: var(--preco-ls-label);
	text-transform: uppercase;
	color: var(--preco-brand-primary);
	background-color: var(--preco-brand-primary-soft);
	border-radius: var(--preco-radius-xs);
}

.preco.preco .preco-badge--dark {
	color: var(--preco-ink-inverse);
	background-color: var(--preco-black);
}

/* =========================================================================
 * 9. Feedback states
 *
 * Specification 20 fixes the presentation of each state at every breakpoint.
 * ========================================================================= */

.preco.preco .preco-notice {
	display: flex;
	flex-direction: column;
	gap: var(--preco-space-3);
	padding: var(--preco-space-6) var(--preco-space-7);
	font-size: var(--preco-fs-small);
	line-height: var(--preco-lh-normal);
	border: 1px solid transparent;
	border-radius: var(--preco-radius-sm);
}

.preco.preco .preco-notice__title {
	font-size: var(--preco-fs-small);
	font-weight: var(--preco-fw-bold);
}

.preco.preco .preco-notice--info {
	color: var(--preco-ink-body);
	background-color: var(--preco-info-soft);
	border-color: var(--preco-info-border);
}

.preco.preco .preco-notice--success {
	color: var(--preco-ink-body);
	background-color: var(--preco-success-soft);
	border-color: var(--preco-success-border);
}

.preco.preco .preco-notice--warning {
	color: var(--preco-ink-body);
	background-color: var(--preco-warning-soft);
	border-color: var(--preco-warning-border);
}

.preco.preco .preco-notice--error {
	color: var(--preco-danger-strong);
	background-color: var(--preco-danger-soft);
	border-color: var(--preco-danger-border);
}

/*
 * The scope and install disclosure, specification 8.1: a non-dismissible,
 * high-contrast panel on a destructive red ground with white text.
 */
.preco.preco .preco-notice--scope {
	color: var(--preco-ink-inverse);
	background-color: var(--preco-danger);
	border-color: var(--preco-danger-strong);
}

.preco.preco .preco-notice--scope .preco-link {
	color: var(--preco-ink-inverse);
}

/* The inline, per-field error message. */
.preco.preco .preco-error {
	display: block;
	font-size: var(--preco-fs-feedback);
	font-weight: var(--preco-fw-semibold);
	line-height: var(--preco-lh-snug);
	color: var(--preco-danger);
}

.preco.preco .preco-success-text {
	display: block;
	font-size: var(--preco-fs-feedback);
	font-weight: var(--preco-fw-semibold);
	color: var(--preco-success);
}

/* Loading preserves layout height, so nothing shifts (specification 20). */
.preco.preco .preco-is-loading {
	position: relative;
	pointer-events: none;
}

.preco.preco .preco-is-loading::after {
	content: "";
	position: absolute;
	inset: 0;
	background-color: var(--preco-overlay-veil);
}

.preco.preco .preco-spinner {
	display: inline-block;
	width: 16px;
	height: 16px;
	border: 2px solid var(--preco-border-strong);
	border-top-color: var(--preco-brand-primary);
	border-radius: var(--preco-radius-circle);
	animation: preco-spin 640ms linear infinite;
}

.preco.preco .preco-empty {
	display: flex;
	flex-direction: column;
	gap: var(--preco-space-6);
	align-items: flex-start;
	padding: var(--preco-space-11) var(--preco-space-8);
	text-align: left;
	background-color: var(--preco-surface-sunken);
	border: 1px dashed var(--preco-border-strong);
	border-radius: var(--preco-radius-md);
}

/* =========================================================================
 * 10. Tables
 *
 * Desktop shows a full table; tablet scrolls inside the bounded wrapper;
 * mobile collapses to stacked label and value rows (specification 20).
 * ========================================================================= */

.preco.preco .preco-table {
	width: 100%;
	font-size: var(--preco-fs-small);
	border-collapse: collapse;
}

.preco.preco .preco-table th,
.preco.preco .preco-table td {
	padding: var(--preco-space-5) var(--preco-space-6);
	text-align: left;
	vertical-align: top;
	border-bottom: 1px solid var(--preco-border);
}

.preco.preco .preco-table th {
	font-size: var(--preco-fs-label);
	font-weight: var(--preco-fw-bold);
	letter-spacing: var(--preco-ls-label);
	text-transform: uppercase;
	color: var(--preco-ink-muted);
	background-color: var(--preco-surface-sunken);
	white-space: nowrap;
}

.preco.preco .preco-table__numeric {
	font-family: var(--preco-font-mono);
	font-variant-numeric: tabular-nums;
	text-align: right;
}

@media (max-width: 767px) {

	.preco.preco .preco-table--stack thead {
		position: absolute;
		width: 1px;
		height: 1px;
		overflow: hidden;
		clip-path: inset(50%);
		white-space: nowrap;
	}

	.preco.preco .preco-table--stack tr {
		display: block;
		padding: var(--preco-space-6) 0;
		border-bottom: 1px solid var(--preco-border);
	}

	.preco.preco .preco-table--stack td {
		display: flex;
		justify-content: space-between;
		gap: var(--preco-space-6);
		padding: var(--preco-space-2) 0;
		border-bottom: 0;
	}

	.preco.preco .preco-table--stack td::before {
		content: attr(data-preco-label);
		flex: 0 0 auto;
		font-size: var(--preco-fs-label);
		font-weight: var(--preco-fw-bold);
		letter-spacing: var(--preco-ls-label);
		text-transform: uppercase;
		color: var(--preco-ink-subtle);
	}

	.preco.preco .preco-table__numeric {
		text-align: right;
	}
}

/* =========================================================================
 * 11. Utilities
 * ========================================================================= */

.preco.preco .preco-u-visually-hidden {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

.preco.preco .preco-u-hidden {
	display: none;
}

.preco.preco .preco-u-full {
	width: 100%;
}

.preco.preco .preco-u-nowrap {
	white-space: nowrap;
}

.preco.preco .preco-u-truncate {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.preco.preco .preco-u-right {
	text-align: right;
}

.preco.preco .preco-u-center {
	text-align: center;
}

/*
 * The honeypot field. Positioned off-screen rather than display:none, because
 * some bots skip hidden inputs. Never focusable by a real keyboard user.
 */
.preco.preco .preco-u-trap {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
	opacity: 0;
	pointer-events: none;
}

/* The polite announcement region used for success states. */
.preco.preco .preco-announcer {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

/* =========================================================================
 * 12. Print
 * ========================================================================= */

@media print {

	.preco.preco .preco-btn,
	.preco.preco .preco-u-trap {
		display: none;
	}

	.preco.preco .preco-panel {
		border-color: var(--preco-n-600);
		box-shadow: none;
	}
}
