		/* ───────── Elite "What's included" modal ───────────────────
		   Numbered editorial sections in serif display, body in
		   Manrope, vivid emerald palette in both light + dark. The
		   wireui card surface is forcibly stripped via the x-init
		   walk above; this is the only visible chrome. */

		:root {
			--ds-elite-bg-cream: #fbf7ee;
			--ds-elite-bg-cream-edge: #f1ead8;
			--ds-elite-emerald: #047857;
			--ds-elite-emerald-deep: #064e3b;
			--ds-elite-emerald-bright: #10b981;
			--ds-elite-teal: #0d9488;
			--ds-elite-ink: #0a1410;
			--ds-elite-ink-soft: #1e3b30;
			--ds-elite-ink-muted: #4b665b;
			--ds-elite-rule: rgba(4, 120, 87, 0.18);
			--ds-elite-list-tint: rgba(16, 185, 129, 0.07);
			--ds-elite-aurora-1: rgba(16, 185, 129, 0.22);
			--ds-elite-aurora-2: rgba(45, 212, 191, 0.16);
		}
		html.dark {
			--ds-elite-bg-cream: #0d1f1a;
			--ds-elite-bg-cream-edge: #08110d;
			--ds-elite-emerald: #34d399;
			--ds-elite-emerald-deep: #064e3b;
			--ds-elite-emerald-bright: #6ee7b7;
			--ds-elite-teal: #5eead4;
			--ds-elite-ink: #ecfdf5;
			--ds-elite-ink-soft: #d1fae5;
			--ds-elite-ink-muted: #86efac;
			--ds-elite-rule: rgba(110, 231, 183, 0.20);
			--ds-elite-list-tint: rgba(16, 185, 129, 0.10);
			--ds-elite-aurora-1: rgba(16, 185, 129, 0.30);
			--ds-elite-aurora-2: rgba(45, 212, 191, 0.22);
		}

		.ds-elite-modal {
			position: relative;
			isolation: isolate;
			overflow: hidden;
			border-radius: 22px;
			background:
				radial-gradient(120% 80% at 100% 0%, var(--ds-elite-aurora-2), transparent 55%),
				radial-gradient(110% 100% at 0% 100%, var(--ds-elite-aurora-1), transparent 60%),
				linear-gradient(180deg, var(--ds-elite-bg-cream) 0%, var(--ds-elite-bg-cream-edge) 100%);
			box-shadow:
				0 30px 80px -32px rgba(4, 120, 87, 0.50),
				0 8px 24px -10px rgba(4, 120, 87, 0.25),
				inset 0 1px 0 0 rgba(255, 255, 255, 0.55);
			border: 1px solid rgba(4, 120, 87, 0.18);
			color: var(--ds-elite-ink);
			font-family: 'Manrope', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
			max-width: 640px;
			width: 100%;
			/* Cap the modal so it never fills the full viewport on
			   any screen — leaves clean breathing room top/bottom
			   when vertically centered. */
			max-height: min(82vh, 720px);
			margin: 0;
			display: flex;
			flex-direction: column;
		}
		/* Override the wireui centering wrapper's `min-h-full` at ALL
		   viewport sizes when our modal is the one being shown.
		   `name="eliteDetailsModal"` isn't actually rendered as a DOM
		   attribute by wireui (it's only used for the Livewire/Alpine
		   store key) — earlier selector targeting `[name=…]` matched
		   nothing, leaving the wrapper at its native `min-h-full`
		   which grows to its overflow container's reported height
		   (= the page's full scrollHeight on a tall page) and produces
		   a residual scroll behind the modal. Use `:has(.ds-elite-modal)`
		   to scope the override to only the wrapper that contains
		   our editorial modal — modern browser support for :has() is
		   universal at this point. */
		.min-h-full:has(.ds-elite-modal) {
			min-height: 0 !important;
			height: 100dvh !important;
		}
		html.dark .ds-elite-modal {
			border-color: rgba(110, 231, 183, 0.22);
			box-shadow:
				0 30px 90px -28px rgba(4, 120, 87, 0.65),
				0 10px 28px -10px rgba(0, 0, 0, 0.55),
				inset 0 1px 0 0 rgba(110, 231, 183, 0.10);
		}

		/* Drifting aurora behind everything — a single pseudo-element
		   that breathes between two emerald hues so the surface feels
		   alive without being noisy. Pointer-events disabled so it
		   never steals taps. */
		.ds-elite-modal-aurora {
			position: absolute;
			inset: -10%;
			z-index: 0;
			pointer-events: none;
			background:
				radial-gradient(ellipse 60% 40% at 80% 10%, var(--ds-elite-aurora-1), transparent 65%),
				radial-gradient(ellipse 50% 35% at 15% 90%, var(--ds-elite-aurora-2), transparent 65%);
			filter: blur(20px);
			opacity: 0.85;
			animation: ds-elite-aurora-drift 14s ease-in-out infinite;
		}
		@keyframes ds-elite-aurora-drift {
			0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.85; }
			33%      { transform: translate(2%, -3%) scale(1.05); opacity: 1; }
			66%      { transform: translate(-2%, 2%) scale(0.96); opacity: 0.7; }
		}

		.ds-elite-modal > * {
			position: relative;
			z-index: 1;
		}

		/* ─── Header ─────────────────────────────────────────────── */
		.ds-elite-modal-header {
			padding: 1.875rem 1.875rem 1.25rem;
			border-bottom: 1px solid var(--ds-elite-rule);
			position: relative;
		}
		.ds-elite-modal-eyebrow {
			display: inline-flex;
			align-items: center;
			gap: 0.4375rem;
			font-size: 0.6875rem;
			font-weight: 700;
			letter-spacing: 0.18em;
			text-transform: uppercase;
			color: var(--ds-elite-emerald);
			margin-bottom: 0.875rem;
		}
		.ds-elite-modal-eyebrow svg {
			width: 13px;
			height: 13px;
		}
		.ds-elite-modal-title {
			font-family: 'Fraunces', 'Cormorant Garamond', Georgia, serif;
			font-variation-settings: 'opsz' 144, 'SOFT' 60;
			font-weight: 530;
			font-size: clamp(1.625rem, 4.6vw, 2.25rem);
			line-height: 1.1;
			letter-spacing: -0.018em;
			color: var(--ds-elite-ink);
			margin: 0 0 0.5rem;
		}
		.ds-elite-modal-title em {
			font-style: italic;
			font-variation-settings: 'opsz' 144, 'SOFT' 100;
			background: linear-gradient(115deg, var(--ds-elite-emerald) 0%, var(--ds-elite-teal) 100%);
			-webkit-background-clip: text;
			        background-clip: text;
			-webkit-text-fill-color: transparent;
			/* Italic "d" has a tall right-leaning ear that overshoots
			   the inline box's natural width — without this padding
			   the descender clips at the right edge of the gradient
			   text fill. */
			padding-right: 0.08em;
		}
		.ds-elite-modal-amp {
			/* The custom italic / smaller-size / translateY(0.04em)
			   styling for the ampersand was sinking it below the
			   surrounding cap-height baseline and reading as a
			   typographic glitch rather than an intentional accent.
			   Reverted to plain inheritance — same Fraunces face,
			   weight, size, and baseline as the rest of the title.
			   The class stays in the markup as a stable hook in case
			   we want to restyle later. */
			font: inherit;
			color: inherit;
		}
		.ds-elite-modal-lede {
			margin: 0;
			font-size: 0.9375rem;
			line-height: 1.55;
			color: var(--ds-elite-ink-soft);
			max-width: 32rem;
		}
		.ds-elite-modal-x {
			position: absolute;
			top: 1rem;
			right: 1rem;
			width: 32px;
			height: 32px;
			border-radius: 50%;
			border: 1px solid var(--ds-elite-rule);
			background: rgba(255, 255, 255, 0.55);
			color: var(--ds-elite-emerald);
			cursor: pointer;
			display: inline-flex;
			align-items: center;
			justify-content: center;
			transition: transform 0.18s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.18s ease, border-color 0.18s ease;
			-webkit-tap-highlight-color: transparent;
		}
		.ds-elite-modal-x svg { width: 14px; height: 14px; }
		.ds-elite-modal-x:hover {
			transform: rotate(90deg);
			background: rgba(255, 255, 255, 0.92);
			border-color: rgba(4, 120, 87, 0.45);
		}
		html.dark .ds-elite-modal-x {
			background: rgba(13, 31, 26, 0.65);
			color: var(--ds-elite-emerald-bright);
		}
		html.dark .ds-elite-modal-x:hover {
			background: rgba(16, 185, 129, 0.18);
			border-color: rgba(110, 231, 183, 0.45);
		}

		/* ─── Body / sections ───────────────────────────────────── */
		.ds-elite-modal-body {
			flex: 1 1 auto;
			min-height: 0;
			overflow-y: auto;
			padding: 0.5rem 0;
			scrollbar-width: thin;
			scrollbar-color: rgba(4, 120, 87, 0.35) transparent;
		}
		.ds-elite-modal-body::-webkit-scrollbar { width: 8px; }
		.ds-elite-modal-body::-webkit-scrollbar-track { background: transparent; }
		.ds-elite-modal-body::-webkit-scrollbar-thumb {
			background: rgba(4, 120, 87, 0.35);
			border-radius: 999px;
		}
		html.dark .ds-elite-modal-body {
			scrollbar-color: rgba(110, 231, 183, 0.35) transparent;
		}
		html.dark .ds-elite-modal-body::-webkit-scrollbar-thumb {
			background: rgba(110, 231, 183, 0.35);
		}

		.ds-elite-section {
			display: grid;
			grid-template-columns: 4.25rem 1fr;
			column-gap: 0.5rem;
			padding: 1.375rem 1.875rem;
			border-bottom: 1px solid var(--ds-elite-rule);
		}
		.ds-elite-section:last-child { border-bottom: 0; }

		.ds-elite-section-num {
			font-family: 'Fraunces', serif;
			font-variation-settings: 'opsz' 144, 'SOFT' 100;
			font-weight: 200;
			font-style: italic;
			font-size: 3.25rem;
			line-height: 0.9;
			color: var(--ds-elite-emerald);
			padding-top: 0.0625rem;
			letter-spacing: -0.02em;
			user-select: none;
		}
		.ds-elite-section-num::after {
			content: '';
			display: block;
			width: 1.875rem;
			height: 1px;
			background: linear-gradient(90deg, var(--ds-elite-emerald), transparent);
			margin-top: 0.5rem;
		}

		.ds-elite-section-title {
			font-family: 'Fraunces', serif;
			font-variation-settings: 'opsz' 60;
			font-weight: 580;
			font-size: 1.3125rem;
			line-height: 1.18;
			letter-spacing: -0.01em;
			color: var(--ds-elite-ink);
			margin: 0 0 0.5rem;
		}
		.ds-elite-section-lede {
			margin: 0 0 0.75rem;
			font-size: 0.9375rem;
			line-height: 1.55;
			color: var(--ds-elite-ink-soft);
		}
		.ds-elite-section-tail {
			margin: 0.875rem 0 0;
			font-size: 0.875rem;
			line-height: 1.6;
			color: var(--ds-elite-ink-muted);
		}

		.ds-elite-section-list {
			display: grid;
			gap: 0.4375rem;
			margin: 0.25rem 0 0;
		}
		.ds-elite-section-list > div {
			display: grid;
			grid-template-columns: 9rem 1fr;
			gap: 0.5rem 0.875rem;
			padding: 0.5625rem 0.75rem;
			border-radius: 9px;
			background: var(--ds-elite-list-tint);
			align-items: baseline;
		}
		.ds-elite-section-list dt {
			font-family: 'Manrope', sans-serif;
			font-weight: 700;
			font-size: 0.8125rem;
			letter-spacing: -0.005em;
			color: var(--ds-elite-emerald-deep);
			margin: 0;
		}
		html.dark .ds-elite-section-list dt {
			color: var(--ds-elite-emerald-bright);
		}
		.ds-elite-section-list dd {
			font-size: 0.84375rem;
			line-height: 1.5;
			color: var(--ds-elite-ink-soft);
			margin: 0;
		}
		.ds-elite-section-list dd em {
			font-style: italic;
			font-family: 'Fraunces', serif;
			font-variation-settings: 'opsz' 30;
			font-weight: 500;
			color: var(--ds-elite-emerald);
		}

		/* ─── "Next step" hint band ─────────────────────────────
		   Sits between the body and footer. Tells the user that
		   picking Elite kicks off a structured audience-input
		   step on the next page so the brand strategy isn't a
		   black box. Quiet emerald tint so it doesn't compete
		   with the section content above or the CTA below. */
		.ds-elite-modal-hint {
			display: flex;
			align-items: flex-start;
			gap: 0.5rem;
			padding: 0.625rem 1.875rem 0;
			font-size: 0.75rem;
			line-height: 1.45;
			color: var(--ds-elite-emerald-deep);
		}
		html.dark .ds-elite-modal-hint { color: var(--ds-elite-emerald-bright); }
		.ds-elite-modal-hint svg {
			width: 14px;
			height: 14px;
			flex-shrink: 0;
			color: var(--ds-elite-emerald);
			margin-top: 0.125rem;
			opacity: 0.85;
		}

		/* ─── Footer ────────────────────────────────────────────── */
		.ds-elite-modal-footer {
			padding: 1rem 1.875rem 1.25rem;
			border-top: 1px solid var(--ds-elite-rule);
			display: flex;
			align-items: center;
			justify-content: space-between;
			gap: 1rem;
		}
		.ds-elite-modal-foot-mark {
			font-size: 0.75rem;
			font-weight: 600;
			letter-spacing: 0.04em;
			color: var(--ds-elite-ink-muted);
		}
		.ds-elite-modal-cta {
			all: unset;
			display: inline-flex;
			align-items: center;
			gap: 0.4375rem;
			padding: 0.625rem 1.125rem;
			font-family: 'Manrope', sans-serif;
			font-weight: 700;
			font-size: 0.875rem;
			letter-spacing: -0.005em;
			color: white;
			background: linear-gradient(120deg, var(--ds-elite-emerald) 0%, var(--ds-elite-teal) 100%);
			border-radius: 999px;
			cursor: pointer;
			box-shadow:
				0 8px 20px -8px rgba(4, 120, 87, 0.6),
				inset 0 1px 0 rgba(255, 255, 255, 0.25);
			transition: transform 0.18s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.18s ease, filter 0.18s ease;
			-webkit-tap-highlight-color: transparent;
		}
		.ds-elite-modal-cta svg {
			width: 14px;
			height: 14px;
			transition: transform 0.18s ease;
		}
		.ds-elite-modal-cta:hover {
			transform: translateY(-1px);
			filter: brightness(1.06);
			box-shadow:
				0 12px 26px -8px rgba(4, 120, 87, 0.75),
				inset 0 1px 0 rgba(255, 255, 255, 0.30);
		}
		.ds-elite-modal-cta:hover svg { transform: translateX(2px); }
		.ds-elite-modal-cta:active { transform: translateY(0) scale(0.98); }
		.ds-elite-modal-cta:focus-visible {
			outline: 2px solid var(--ds-elite-emerald);
			outline-offset: 2px;
		}

		/* ─── Mobile (≤640px) ─────────────────────────────────── */
		@media (max-width: 640px) {
			.ds-elite-modal {
				border-radius: 18px;
				/* Hard-cap to dvh so wireui's `min-h-full` on the
				   modal centering wrapper can't push the inner card
				   taller than the visible viewport. With the modal
				   now vertically centered (see the `align-items:
				   center` override below), the wireui wrapper takes
				   care of placement — we just clamp the modal's own
				   max-height so it doesn't fill the entire screen. */
				height: auto;
				max-height: calc(100dvh - 2rem);
				margin: 0;
			}
			/* Mobile-specific override — the global rule above
			   already clamps height to 100dvh; this stays as a
			   no-op marker comment for the mobile breakpoint
			   in case future tweaks need to diverge. */
			.ds-elite-modal-header {
				padding: 1.25rem 1.25rem 1rem;
			}
			.ds-elite-modal-title {
				font-size: 1.5rem;
				line-height: 1.12;
			}
			.ds-elite-modal-lede { font-size: 0.875rem; }
			.ds-elite-modal-x { top: 0.625rem; right: 0.625rem; width: 30px; height: 30px; }

			.ds-elite-section {
				grid-template-columns: 2.875rem 1fr;
				column-gap: 0.5rem;
				padding: 1rem 1.25rem;
			}
			.ds-elite-section-num { font-size: 2.25rem; }
			.ds-elite-section-num::after { width: 1.25rem; margin-top: 0.375rem; }
			.ds-elite-section-title { font-size: 1.0625rem; }
			.ds-elite-section-lede { font-size: 0.875rem; }
			.ds-elite-section-tail { font-size: 0.8125rem; }

			.ds-elite-section-list > div {
				grid-template-columns: 1fr;
				gap: 0.125rem;
				padding: 0.5rem 0.625rem;
			}
			.ds-elite-section-list dt { font-size: 0.8125rem; }
			.ds-elite-section-list dd { font-size: 0.8125rem; line-height: 1.45; }

			.ds-elite-modal-hint {
				padding: 0.5rem 1rem 0;
				font-size: 0.6875rem;
				line-height: 1.4;
			}

			/* Footer compresses on mobile — single-row layout instead
			   of stacked column-reverse so it takes ~52px instead of
			   ~96px, and the "Got it" CTA shrinks proportionally. */
			.ds-elite-modal-footer {
				padding: 0.5rem 1rem 0.625rem;
				flex-direction: row;
				align-items: center;
				gap: 0.625rem;
			}
			.ds-elite-modal-foot-mark {
				font-size: 0.6875rem;
				flex: 1 1 auto;
				min-width: 0;
				line-height: 1.3;
			}
			.ds-elite-modal-cta {
				flex-shrink: 0;
				padding: 0.5rem 0.9375rem;
				font-size: 0.8125rem;
			}
		}

		@media (prefers-reduced-motion: reduce) {
			.ds-elite-modal-aurora,
			.ds-elite-modal-x,
			.ds-elite-modal-cta { animation: none; transition: none; }
			.ds-elite-modal-x:hover { transform: none; }
			.ds-elite-modal-cta:hover svg { transform: none; }
		}

		/* ─── Open-state body lock + footer cover ─────────────────
		   wireui sets `body.!overflow-hidden` when its modal opens,
		   but only on body — html stays scrollable, so the user
		   could still wheel past the modal. Mirror it onto html.

		   The wireui backdrop (fixed inset-0, secondary tint) sits
		   at z-index: auto. The page's sticky `.steps-footer` is at
		   z-index: 50, so the footer paints OVER the backdrop and
		   stays fully vivid. We want the footer to STAY in place
		   visually but be dimmed by the screen-fade, so raise the
		   backdrop's z-index above the footer (z:60) — the modal
		   itself sits at z:50 inside its own stacking context but
		   wireui paints the modal container AFTER the backdrop in
		   source order, so the modal still wins over the bumped
		   backdrop. */
		html:has(body.\!overflow-hidden) {
			overflow: hidden !important;
		}
		/* Modal-open lock breaks sticky positioning: when wireui
		   sets body.!overflow-hidden + we mirror html.overflow-hidden,
		   neither container scrolls anymore — and `position: sticky`
		   has nothing to "stick" to without a scrollable ancestor,
		   so the footer falls back to its in-flow position at the
		   end of <body> (usually scrolled out of view). Switching
		   to `position: fixed` keeps it pinned to the viewport
		   regardless of scroll context.

		   For the dim treatment: drop the footer's z-index so the
		   wireui backdrop (siblings later in source with z:auto)
		   paints on top of it. The backdrop is already a 60%
		   secondary-tone overlay, so it dims the footer the same
		   way it dims the rest of the page — no separate opacity
		   filter needed. pointer-events: none defends against
		   accidental Back / Next clicks while the modal owns the
		   page. */
		/* Center the modal on every viewport. wireui's centering
		   wrapper uses `flex items-end justify-center sm:items-center`
		   which leaves mobile bottom-anchored. We force vertical
		   centering across the board so the modal floats in the
		   middle of the screen regardless of breakpoint. The page
		   sticky footer is left to wireui's natural behavior — it
		   can disappear behind the backdrop or get pushed out of
		   flow by `body.overflow-hidden` and that's fine. */
		.min-h-full:has(.ds-elite-modal) {
			align-items: center !important;
		}
		/* ─── Plan-watch card on the action_shopify_plan error state.
		   Mirrors the ds-confirm-address pattern from stepconfirm.blade.php
		   but rendered here in store-setup.blade.php since the error state
		   lives in this file (not the stepsignup blade where the original
		   styles are defined). Without these copies, the SVG inside
		   .ds-confirm-address-icon renders at its natural ~600px size and
		   blows out the layout. ─── */
		.ds-confirm-address {
			display: flex;
			align-items: center;
			gap: 0.75rem;
			padding: 0.75rem 0.875rem;
			margin-bottom: 0.75rem;
			background: linear-gradient(135deg, rgba(251, 191, 36, 0.10), rgba(245, 158, 11, 0.06));
			border: 1px solid rgba(245, 158, 11, 0.32);
			border-radius: 14px;
			color: #78350f;
			transition: background 0.18s ease, border-color 0.18s ease;
		}
		.ds-confirm-address.is-watching {
			background: linear-gradient(135deg, rgba(16, 185, 129, 0.10), rgba(45, 212, 191, 0.05));
			border-color: rgba(16, 185, 129, 0.40);
			color: #064e3b;
		}
		.ds-confirm-address-icon {
			position: relative;
			flex-shrink: 0;
			width: 36px;
			height: 36px;
			border-radius: 10px;
			display: inline-flex;
			align-items: center;
			justify-content: center;
			background: rgba(245, 158, 11, 0.14);
			color: #d97706;
		}
		.ds-confirm-address.is-watching .ds-confirm-address-icon {
			background: rgba(16, 185, 129, 0.16);
			color: #047857;
		}
		.ds-confirm-address-icon svg { width: 18px; height: 18px; position: relative; z-index: 1; }
		.ds-confirm-address-pulse {
			position: absolute;
			inset: -3px;
			border-radius: 12px;
			border: 2px solid rgba(16, 185, 129, 0.55);
			animation: ds-confirm-addr-pulse 1.6s ease-out infinite;
			pointer-events: none;
		}
		@keyframes ds-confirm-addr-pulse {
			0%   { transform: scale(0.85); opacity: 0.95; }
			100% { transform: scale(1.30); opacity: 0; }
		}
		.ds-confirm-address-body {
			flex: 1;
			min-width: 0;
			display: flex;
			flex-direction: column;
			gap: 0.0625rem;
			text-align: left;
		}
		.ds-confirm-address-title {
			font-size: 0.875rem;
			font-weight: 700;
			line-height: 1.25;
			letter-spacing: -0.005em;
		}
		.ds-confirm-address-sub {
			font-size: 0.75rem;
			line-height: 1.4;
			opacity: 0.85;
		}

		.legal-modal-content p { margin: 1rem 0; }
		.legal-modal-content ul { list-style: disc; margin: 0.5rem 0 0.5rem 1.25rem; }

		/* Desktop-only header stepper slot. Mobile keeps the stepper
		   in its original position above the wizard card. The script
		   below DOM-moves .ds-progress-container into this slot on
		   lg+ widths. Inline + this media query (rather than Tailwind
		   `hidden lg:flex`) because the Tailwind build doesn't reliably
		   compile `lg:flex` from this file. */
		@media (min-width: 1024px) {
			#ds-header-stepper-slot { display: flex !important; }
			#ds-header-stepper-slot .ds-progress-container {
				margin-bottom: 0;
				width: 100%;
				max-width: 720px;
			}
		}

		/* Static-stepper dual-render visibility gate (Telegram 5732).
		   Desktop instance lives inside #ds-header-stepper-slot and is
		   shown via the slot's flex display at ≥1024. The mobile
		   instance lives in ds-setup-main directly and needs to hide
		   at desktop so we don't paint two copies. Mirrored rule hides
		   the desktop instance at mobile widths since the slot is
		   already display:none below the breakpoint — belt-and-
		   suspenders against any future override. */
		.ds-progress-static-desktop {
			display: none;
		}
		.ds-progress-static-mobile {
			display: block;
		}
		@media (min-width: 1024px) {
			.ds-progress-static-desktop {
				display: block;
			}
			.ds-progress-static-mobile {
				display: none;
			}
		}

		/* ------------------------------------------------------------
		   Plan-trial confirm modal — mirrors stepsignup.blade.php's
		   .ds-modal* rules, copied here because store-setup.blade.php
		   renders the error state independently of the wizard step file
		   that originally owned this CSS. Without these rules the modal
		   has no fixed-position backdrop and renders as an inline block.
		   ------------------------------------------------------------ */
		.ds-modal-overlay {
			position: fixed;
			inset: 0;
			background: rgba(15, 23, 42, 0.55);
			backdrop-filter: blur(8px) saturate(1.1);
			-webkit-backdrop-filter: blur(8px) saturate(1.1);
			display: flex;
			align-items: center;
			justify-content: center;
			z-index: 100;
			padding: 1rem;
			padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
		}
		/* /setup renders 6+ modal overlays in DOM at once (welcome-back
		   phases, niche-upgrade, brand-strategy, competitor-analysis,
		   address-confirm, store-switcher). Each with backdrop-filter
		   blur stacks composited surfaces, and on iOS Safari 18 + Chrome
		   Android this tips the renderer into killing the WebContent
		   process on tab switch (page returns blank). Drop the blur at
		   mobile widths; the rgba scrim alone is plenty separation. */
		@media (max-width: 1023px) {
			.ds-modal-overlay {
				backdrop-filter: none !important;
				-webkit-backdrop-filter: none !important;
				background: rgba(15, 23, 42, 0.72) !important;
			}
		}
		.ds-modal {
			position: relative;
			background: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);
			border-radius: 24px;
			max-width: 420px;
			width: 100%;
			padding: 2.5rem 2rem 2rem;
			text-align: center;
			box-shadow:
				0 24px 60px -12px rgba(15, 23, 42, 0.35),
				0 8px 24px -8px rgba(15, 23, 42, 0.15),
				inset 0 1px 0 0 rgba(255, 255, 255, 0.9);
			border: 1px solid rgba(255, 255, 255, 0.6);
			max-height: calc(100vh - 2rem);
			overflow-y: auto;
		}
		.ds-modal::before {
			content: '';
			position: absolute;
			top: 0;
			left: 2rem;
			right: 2rem;
			height: 3px;
			border-radius: 0 0 4px 4px;
		}
		.ds-modal.green::before  { background: linear-gradient(90deg, #22c55e, #4ade80); }
		.ds-modal.blue::before   { background: linear-gradient(90deg, #2090F0, #8ec3ff); }
		.ds-modal.orange::before { background: linear-gradient(90deg, #f97316, #fbbf24); }
		.ds-modal.bw::before     { background: linear-gradient(90deg, #18181b, #52525b); }
		/* Back button on the publish-mode modal — top-left chevron + label
		   that lets the user undo their "New theme" pick and return to
		   the Welcome Back modal. Subtle so it doesn't compete with the
		   primary CTAs. */
		.ds-modal-back {
			position: absolute;
			top: 0.75rem;
			left: 0.875rem;
			display: inline-flex;
			align-items: center;
			gap: 0.25rem;
			padding: 0.375rem 0.625rem 0.375rem 0.4rem;
			border-radius: 999px;
			background: transparent;
			border: none;
			cursor: pointer;
			color: #64748b;
			font-size: 0.75rem;
			font-weight: 600;
			letter-spacing: 0.01em;
			transition: color 0.18s ease, background 0.18s ease, transform 0.18s ease;
			font-family: var(--ds-font, inherit);
		}
		.ds-modal-back:hover {
			color: #0f172a;
			background: rgba(15, 23, 42, 0.05);
			transform: translateX(-1px);
		}
		.ds-modal-back-icon {
			width: 14px;
			height: 14px;
			flex-shrink: 0;
		}
		html.dark .ds-modal-back { color: #a1a1aa; }
		html.dark .ds-modal-back:hover { color: #f4f4f5; background: rgba(255, 255, 255, 0.06); }

		.ds-modal-close {
			position: absolute;
			top: 0.875rem;
			right: 0.875rem;
			width: 32px;
			height: 32px;
			border-radius: 50%;
			background: rgba(0, 0, 0, 0.04);
			border: none;
			cursor: pointer;
			display: flex;
			align-items: center;
			justify-content: center;
			color: #64748b;
			transition: all 0.18s ease;
		}
		.ds-modal-close:hover { background: rgba(0, 0, 0, 0.08); color: #0f172a; }
		.ds-modal-icon {
			width: 64px;
			height: 64px;
			border-radius: 18px;
			display: flex;
			align-items: center;
			justify-content: center;
			margin: 0 auto 1.25rem;
		}
		.ds-modal-icon-lg {
			width: 72px;
			height: 72px;
			border-radius: 20px;
			margin: 0 auto 1.5rem;
			animation: ds-modal-icon-float 3.6s ease-in-out infinite;
		}
		@keyframes ds-modal-icon-float {
			0%, 100% { transform: translateY(0); }
			50%      { transform: translateY(-3px); }
		}
		/* Wizard-step-style slide between modals — used when one modal
		   immediately follows another (returning-merchant choice →
		   publish mode pick). Driven by Alpine x-transition so the
		   animation restarts every time the phase flips, not just on
		   initial render. */
		.ds-modal-slide-enter {
			transition: opacity 0.32s cubic-bezier(0.4, 0, 0.2, 1),
			            transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);
		}
		.ds-modal-slide-enter-start {
			opacity: 0;
			transform: translateX(36px);
		}
		.ds-modal-slide-enter-end {
			opacity: 1;
			transform: translateX(0);
		}
		.ds-modal-icon-svg { width: 32px; height: 32px; }
		.ds-modal-icon-lg .ds-modal-icon-svg { width: 36px; height: 36px; }
		.ds-modal-icon.green {
			background: linear-gradient(135deg, rgba(34, 197, 94, 0.14) 0%, rgba(22, 163, 74, 0.20) 100%);
			color: #16a34a;
			box-shadow: 0 6px 18px -6px rgba(34, 197, 94, 0.32);
		}
		.ds-modal-icon.blue {
			background: linear-gradient(135deg, rgba(32, 144, 240, 0.14) 0%, rgba(14, 123, 217, 0.20) 100%);
			color: #0E7BD9;
			box-shadow: 0 6px 18px -6px rgba(32, 144, 240, 0.32);
		}
		.ds-modal-icon.orange {
			background: linear-gradient(135deg, rgba(249, 115, 22, 0.14) 0%, rgba(234, 88, 12, 0.20) 100%);
			color: #ea580c;
			box-shadow: 0 6px 18px -6px rgba(249, 115, 22, 0.32);
		}
		.ds-modal-icon.bw {
			background: linear-gradient(135deg, rgba(24, 24, 27, 0.06) 0%, rgba(39, 39, 42, 0.12) 100%);
			color: #18181b;
			box-shadow: 0 6px 18px -6px rgba(24, 24, 27, 0.28);
		}
		.ds-modal-title {
			font-size: 1.375rem;
			font-weight: 700;
			line-height: 1.25;
			margin: 0 0 0.5rem;
			color: #0f172a;
			letter-spacing: -0.015em;
		}
		.ds-modal-lead {
			font-size: 1rem;
			line-height: 1.5;
			color: #475569;
			margin: 0 0 1.875rem;
		}
		.ds-modal-lead strong { color: #0f172a; font-weight: 700; }
		.ds-modal-btn {
			display: inline-flex;
			align-items: center;
			justify-content: center;
			padding: 1rem 1.5rem;
			border-radius: 14px;
			border: none;
			cursor: pointer;
			font-size: 1rem;
			font-weight: 600;
			font-family: var(--ds-font, inherit);
			transition: all 0.2s cubic-bezier(0.32, 0.72, 0, 1);
			min-height: 52px;
		}
		.ds-modal-btn-solo { width: 100%; }
		.ds-modal-btn-primary { color: white; position: relative; overflow: hidden; }
		.ds-modal-btn-primary.green {
			background: linear-gradient(135deg, #10b981 0%, #22c55e 50%, #16a34a 100%);
			box-shadow: 0 6px 18px -3px rgba(34, 197, 94, 0.5);
		}
		.ds-modal-btn-primary.blue {
			/* All-DS-blue brand gradient (sampled from the rocket logo) — was
			   purple/cyan-leaning before the May 2026 brand pass. */
			background: linear-gradient(135deg, #3DB1F5 0%, #2090F0 50%, #0E7BD9 100%);
			box-shadow: 0 6px 18px -3px rgba(32, 144, 240, 0.5);
		}
		.ds-modal-btn-primary.orange {
			background: linear-gradient(135deg, #FEC201 0%, #FDB813 40%, #F5A623 80%, #fb923c 100%);
			color: #1a1a1a;
			box-shadow: 0 6px 18px -3px rgba(253, 184, 19, 0.6);
		}
		.ds-modal-btn-primary.bw {
			background: linear-gradient(135deg, #3f3f46 0%, #18181b 50%, #27272a 100%);
			box-shadow: 0 6px 18px -3px rgba(24, 24, 27, 0.5);
		}
		.ds-modal-btn-primary:hover  { transform: translateY(-1px); filter: brightness(1.1); }
		.ds-modal-btn-primary:active { transform: translateY(0) scale(0.98); }

		/* Two-button row for modals offering a binary choice (e.g. the
		   /import → /setup welcome modal: "Put it live" / "Save as draft"). */
		.ds-modal-btns-row {
			display: grid;
			grid-template-columns: 1fr 1fr;
			gap: 0.625rem;
			margin-top: 0.25rem;
		}
		.ds-modal-btns-row .ds-modal-btn { width: 100%; }
		.ds-modal-btn-secondary {
			background: rgba(15, 23, 42, 0.04);
			color: #0f172a;
			border: 1px solid rgba(15, 23, 42, 0.08);
		}
		.ds-modal-btn-secondary:hover {
			background: rgba(15, 23, 42, 0.07);
			transform: translateY(-1px);
		}
		.ds-modal-btn-secondary:active { transform: translateY(0) scale(0.98); }
		html.dark .ds-modal-btn-secondary {
			background: rgba(255, 255, 255, 0.06);
			color: #fafafa;
			border-color: rgba(255, 255, 255, 0.10);
		}
		html.dark .ds-modal-btn-secondary:hover { background: rgba(255, 255, 255, 0.10); }
		.ds-modal-footnote {
			margin: 0.875rem 0 0;
			text-align: center;
			font-size: 0.75rem;
			color: var(--ds-text-muted, #94a3b8);
			font-weight: 500;
		}

		@media (max-width: 480px) {
			.ds-modal-btns-row { grid-template-columns: 1fr; }
		}
		@media (max-width: 480px) {
			.ds-modal { padding: 2rem 1.5rem 1.5rem; border-radius: 22px; }
			.ds-modal-icon-lg {
				width: 64px; height: 64px;
				border-radius: 18px;
				margin-bottom: 1.25rem;
			}
			.ds-modal-icon-lg .ds-modal-icon-svg { width: 32px; height: 32px; }
			.ds-modal-title { font-size: 1.1875rem; }
			.ds-modal-lead  { font-size: 0.9375rem; margin-bottom: 1.5rem; }
			.ds-modal-btn   { font-size: 0.9375rem; min-height: 50px; }
		}

		/* ─── Shop-URL prompt modal (welcome-back → New Store) ─────
		   Single-input collection screen that breaks the install loop
		   for editor users adding a second store. Visual language is
		   intentionally restrained — same .ds-modal frame as the
		   other welcome-back phases — but the input field carries the
		   craft: inline `.myshopify.com` suffix in muted monospace, a
		   live preview line that materialises only when the value
		   parses, a check chip that pops in on validation, and a
		   collapsible help panel with numbered steps for the long
		   tail of users who don't have their store URL memorised. */
		.ds-shop-url-modal {
			max-width: 480px;
			padding-top: 2.25rem;
		}
		.ds-shop-url-icon {
			margin-bottom: 1rem;
		}
		.ds-shop-url-modal .ds-modal-lead {
			margin-bottom: 1.25rem;
		}
		.ds-shop-url-field {
			text-align: left;
			margin-bottom: 0.75rem;
		}
		.ds-shop-url-label {
			display: block;
			font-size: 0.6875rem;
			font-weight: 700;
			color: rgba(15, 23, 42, 0.55);
			text-transform: uppercase;
			letter-spacing: 0.06em;
			margin-bottom: 0.5rem;
		}
		.ds-shop-url-input-wrap {
			display: flex;
			align-items: center;
			background: white;
			border: 2px solid rgba(15, 23, 42, 0.10);
			border-radius: 14px;
			transition: border-color 0.18s ease, box-shadow 0.22s ease, background 0.18s ease;
			overflow: hidden;
			box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.6);
		}
		.ds-shop-url-input-wrap:focus-within {
			border-color: var(--ds-primary, #2090F0);
			box-shadow: 0 0 0 4px rgba(32, 144, 240, 0.12);
		}
		.ds-shop-url-input-wrap.is-valid {
			border-color: #10b981;
			box-shadow: 0 0 0 4px rgba(16, 185, 129, 0.10);
			background: linear-gradient(180deg, #ffffff 0%, rgba(16, 185, 129, 0.025) 100%);
		}
		.ds-shop-url-input-wrap.is-invalid {
			border-color: #f97316;
			box-shadow: 0 0 0 4px rgba(249, 115, 22, 0.08);
		}
		.ds-shop-url-input {
			flex: 1 1 auto;
			min-width: 0;
			border: none;
			outline: none;
			padding: 0.875rem 0.25rem 0.875rem 1rem;
			background: transparent;
			font-size: 1rem;
			font-family: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, "Courier New", monospace;
			color: #0f172a;
			font-weight: 500;
			letter-spacing: -0.005em;
			-webkit-appearance: none;
		}
		.ds-shop-url-input::placeholder {
			color: rgba(15, 23, 42, 0.32);
			font-weight: 400;
		}
		.ds-shop-url-suffix {
			padding: 0 0.875rem 0 0.125rem;
			font-size: 0.9375rem;
			color: rgba(15, 23, 42, 0.42);
			font-family: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, monospace;
			flex-shrink: 0;
			user-select: none;
		}
		.ds-shop-url-input-wrap.is-valid .ds-shop-url-suffix {
			color: rgba(15, 23, 42, 0.62);
		}
		.ds-shop-url-check {
			display: inline-flex;
			align-items: center;
			justify-content: center;
			width: 28px;
			height: 28px;
			margin-right: 0.5rem;
			background: #10b981;
			color: white;
			border-radius: 50%;
			flex-shrink: 0;
			animation: ds-shop-url-check-pop 0.32s cubic-bezier(0.34, 1.56, 0.64, 1) both;
			box-shadow: 0 4px 10px -3px rgba(16, 185, 129, 0.55);
		}
		.ds-shop-url-check svg {
			width: 16px;
			height: 16px;
		}
		@keyframes ds-shop-url-check-pop {
			0%   { transform: scale(0) rotate(-45deg); opacity: 0; }
			60%  { transform: scale(1.15) rotate(0deg); opacity: 1; }
			100% { transform: scale(1) rotate(0deg);    opacity: 1; }
		}

		.ds-shop-url-preview {
			display: flex;
			align-items: center;
			gap: 0.5rem;
			margin: 0.625rem 0 0;
			padding: 0 0.25rem;
			font-size: 0.8125rem;
			color: rgba(15, 23, 42, 0.62);
			line-height: 1.4;
		}
		.ds-shop-url-preview-label {
			font-weight: 500;
			color: rgba(15, 23, 42, 0.50);
		}
		.ds-shop-url-preview-value {
			font-family: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, monospace;
			font-weight: 600;
			color: #047857;
			letter-spacing: -0.005em;
			word-break: break-all;
		}
		.ds-shop-url-preview-warn {
			color: #c2410c;
		}
		.ds-shop-url-preview-warn svg {
			width: 14px;
			height: 14px;
			flex-shrink: 0;
		}

		/* Help toggle — opens the "where do I find this URL?" panel.
		   Designed to read as a friendly prompt rather than a button:
		   dashed border + question icon + soft hover. */
		.ds-shop-url-help-toggle {
			width: 100%;
			display: inline-flex;
			align-items: center;
			gap: 0.5rem;
			/* Tightened from 0.875rem so the help toggle hugs the URL
			   input — visually pairs it with the field rather than
			   reading as a separate block of UI. Telegram 5723. */
			margin-top: 0.375rem;
			padding: 0.625rem 0.875rem;
			background: transparent;
			border: 1px dashed rgba(15, 23, 42, 0.16);
			border-radius: 11px;
			font-family: inherit;
			font-size: 0.8125rem;
			font-weight: 500;
			color: rgba(15, 23, 42, 0.65);
			cursor: pointer;
			text-align: left;
			transition: background 0.18s ease, border-color 0.18s ease, color 0.18s ease;
		}
		.ds-shop-url-help-toggle:hover {
			background: rgba(15, 23, 42, 0.035);
			border-color: rgba(15, 23, 42, 0.26);
			color: rgba(15, 23, 42, 0.82);
		}
		.ds-shop-url-help-toggle:focus-visible {
			outline: none;
			border-color: var(--ds-primary, #2090F0);
			box-shadow: 0 0 0 3px rgba(32, 144, 240, 0.16);
		}
		.ds-shop-url-help-toggle > span {
			flex: 1;
		}
		.ds-shop-url-help-icon,
		.ds-shop-url-help-chevron {
			width: 14px;
			height: 14px;
			flex-shrink: 0;
		}
		.ds-shop-url-help-chevron {
			transition: transform 0.22s cubic-bezier(0.4, 0, 0.2, 1);
		}
		.ds-shop-url-help-chevron.is-open {
			transform: rotate(180deg);
		}

		.ds-shop-url-help {
			margin-top: 0.5rem;
			padding: 1rem 1.125rem;
			background:
				linear-gradient(180deg, rgba(248, 250, 252, 0.95) 0%, rgba(241, 245, 249, 0.85) 100%);
			border: 1px solid rgba(15, 23, 42, 0.06);
			border-radius: 12px;
			text-align: left;
			overflow: hidden;
		}
		/* Always-on inline help block sits between the lead and the
		   URL input (Telegram 5727). Zero top margin pulls it closer
		   to the lead paragraph above (Telegram 5730); the lead's own
		   margin-bottom: 0.75rem provides all the breathing room
		   needed. Bottom margin keeps the field from abutting the
		   help card. */
		.ds-shop-url-help-inline {
			margin-top: 0;
			margin-bottom: 0.875rem;
		}
		.ds-shop-url-help-enter            { transition: max-height 0.3s ease, opacity 0.22s ease; max-height: 280px; }
		.ds-shop-url-help-enter-start      { max-height: 0; opacity: 0; }
		.ds-shop-url-help-enter-end        { max-height: 280px; opacity: 1; }

		.ds-shop-url-steps {
			margin: 0;
			padding: 0;
			list-style: none;
			counter-reset: ds-step;
		}
		.ds-shop-url-steps li {
			position: relative;
			display: block;
			padding: 0.375rem 0 0.375rem 2rem;
			counter-increment: ds-step;
			font-size: 0.8125rem;
			line-height: 1.55;
			color: rgba(15, 23, 42, 0.74);
		}
		.ds-shop-url-steps li::before {
			content: counter(ds-step);
			position: absolute;
			left: 0;
			top: 0.4375rem;
			width: 22px;
			height: 22px;
			background: var(--ds-primary, #2090F0);
			color: white;
			font-size: 0.6875rem;
			font-weight: 700;
			line-height: 22px;
			text-align: center;
			border-radius: 50%;
			font-family: var(--ds-font, inherit);
			box-shadow: 0 2px 6px -2px rgba(32, 144, 240, 0.40);
		}
		.ds-modal.green .ds-shop-url-steps li::before  { background: #22c55e; box-shadow: 0 2px 6px -2px rgba(34, 197, 94, 0.45); }
		.ds-modal.orange .ds-shop-url-steps li::before { background: #f97316; box-shadow: 0 2px 6px -2px rgba(249, 115, 22, 0.45); }
		.ds-modal.bw .ds-shop-url-steps li::before     { background: #18181b; box-shadow: 0 2px 6px -2px rgba(24, 24, 27, 0.40); }
		.ds-shop-url-steps li > span {
			display: block;
		}
		.ds-shop-url-steps a {
			color: var(--ds-primary, #2090F0);
			text-decoration: underline;
			text-decoration-thickness: 1.5px;
			text-underline-offset: 2px;
			font-weight: 600;
		}
		.ds-shop-url-steps em {
			font-style: italic;
			color: #0f172a;
			font-weight: 600;
		}
		.ds-shop-url-example {
			display: inline-block;
			margin-top: 0.375rem;
			padding: 0.3125rem 0.5625rem;
			background: rgba(15, 23, 42, 0.06);
			border-radius: 7px;
			font-size: 0.75rem;
			font-family: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Monaco, monospace;
			color: rgba(15, 23, 42, 0.75);
			line-height: 1.3;
			word-break: break-all;
		}
		.ds-shop-url-example mark {
			background: rgba(16, 185, 129, 0.22);
			color: #047857;
			padding: 1px 4px;
			border-radius: 4px;
			font-weight: 700;
		}

		.ds-shop-url-btns {
			margin-top: 1.25rem;
		}
		.ds-modal-btn:disabled,
		.ds-modal-btn[disabled] {
			opacity: 0.42;
			cursor: not-allowed;
			filter: saturate(0.55);
			transform: none !important;
		}
		.ds-modal-btn:disabled:hover,
		.ds-modal-btn[disabled]:hover {
			transform: none !important;
			filter: saturate(0.55);
		}
		.ds-shop-url-cta-arrow {
			width: 14px;
			height: 14px;
			margin-left: 0.375rem;
			vertical-align: middle;
			transition: transform 0.18s ease;
		}
		.ds-modal-btn-primary:not(:disabled):hover .ds-shop-url-cta-arrow {
			transform: translateX(3px);
		}
		.ds-shop-url-footnote {
			margin-top: 0.875rem;
			color: rgba(15, 23, 42, 0.48);
			font-size: 0.71875rem;
			font-style: italic;
		}

		html.dark .ds-shop-url-input-wrap {
			background: rgba(255, 255, 255, 0.04);
			border-color: rgba(255, 255, 255, 0.10);
			box-shadow: none;
		}
		html.dark .ds-shop-url-input { color: #fafafa; }
		html.dark .ds-shop-url-input::placeholder { color: rgba(244, 244, 245, 0.36); }
		html.dark .ds-shop-url-label { color: rgba(244, 244, 245, 0.62); }
		html.dark .ds-shop-url-suffix { color: rgba(244, 244, 245, 0.46); }
		html.dark .ds-shop-url-input-wrap.is-valid .ds-shop-url-suffix { color: rgba(244, 244, 245, 0.70); }
		html.dark .ds-shop-url-preview { color: rgba(244, 244, 245, 0.62); }
		html.dark .ds-shop-url-preview-label { color: rgba(244, 244, 245, 0.46); }
		html.dark .ds-shop-url-preview-value { color: #6ee7b7; }
		html.dark .ds-shop-url-preview-warn { color: #fb923c; }
		html.dark .ds-shop-url-help-toggle {
			border-color: rgba(255, 255, 255, 0.16);
			color: rgba(244, 244, 245, 0.62);
		}
		html.dark .ds-shop-url-help-toggle:hover {
			background: rgba(255, 255, 255, 0.05);
			border-color: rgba(255, 255, 255, 0.24);
			color: #f4f4f5;
		}
		html.dark .ds-shop-url-help {
			background: rgba(255, 255, 255, 0.03);
			border-color: rgba(255, 255, 255, 0.08);
		}
		html.dark .ds-shop-url-steps li { color: rgba(244, 244, 245, 0.78); }
		html.dark .ds-shop-url-steps em { color: #fafafa; }
		html.dark .ds-shop-url-example {
			background: rgba(255, 255, 255, 0.06);
			color: rgba(244, 244, 245, 0.78);
		}
		html.dark .ds-shop-url-example mark {
			background: rgba(16, 185, 129, 0.20);
			color: #6ee7b7;
		}
		html.dark .ds-shop-url-footnote { color: rgba(244, 244, 245, 0.46); }

		/* Store-closed recovery modal — title + sub left-aligned.
		   `.ds-modal` parent sets text-align: center which the orb-
		   dropdown switcher modal accepts, but the store-closed
		   variant reads better with the warning headline and body
		   ranged left. Telegram 5636. */
		.ds-store-closed-modal .ds-store-switcher-title,
		.ds-store-closed-modal .ds-store-switcher-sub {
			text-align: left;
		}

		/* Description paragraph above the URL input, ported from the
		   welcome-back modal's shop-url phase when we relocated the
		   input to live on the wizard step (Telegram 5594). Anchors
		   the WHY of the input — without it the field reads as
		   standalone. */
		.ds-shop-url-lead {
			margin: 0 0 0.75rem;
			/* No max-width — let the lead consume the full card width so
			   short sentences like the new "right place." copy don't
			   needlessly wrap onto a lonely second line. Telegram 5616. */
			text-align: left;
			font-size: 0.875rem;
			line-height: 1.45;
			color: #475569;
		}
		html.dark .ds-shop-url-lead {
			color: rgba(244, 244, 245, 0.72);
		}

		/* Vertical breathing room between the "Where do I find my
		   store's URL?" disclosure (toggle + collapsible help list)
		   and the Add DropStart CTA, when the editor-new-store
		   variant of stepsignup's B_install renders the shop URL
		   input inline. Without this the CTA crowds the help section
		   and visually reads as part of the disclosure. Telegram 5590. */
		.ds-shop-url-cta-spacer {
			height: 1.25rem;
		}
		@media (min-width: 768px) {
			.ds-shop-url-cta-spacer { height: 1.625rem; }
		}
		.ds-install-cta-gated {
			margin-top: 0;
		}

		/* Gated-disabled state — the editor-new-store install CTA
		   sits visibly inert while shopSlug is empty/invalid so the
		   merchant's eye lands on the pulsing URL input first.
		   Border and text both significantly washed out vs the normal
		   filled CTA. Once Alpine drops the `disabled` class (URL is
		   valid), the cascade lets the standard `.ds-install-cta`
		   theme fill take over — no need to manually undo here.
		   Telegram 5596. */
		.ds-install-cta-gated.disabled,
		.ds-install-cta-gated[disabled] {
			background: transparent !important;
			color: rgba(15, 23, 42, 0.32) !important;
			border: 1.5px solid rgba(15, 23, 42, 0.14) !important;
			box-shadow: none !important;
			cursor: not-allowed;
			opacity: 1;  /* override any global .disabled opacity dimming so border/text colors land predictably */
		}
		.ds-install-cta-gated.disabled svg,
		.ds-install-cta-gated[disabled] svg {
			color: rgba(15, 23, 42, 0.28) !important;
			stroke: currentColor;
		}
		html.dark .ds-install-cta-gated.disabled,
		html.dark .ds-install-cta-gated[disabled] {
			background: transparent !important;
			color: rgba(244, 244, 245, 0.32) !important;
			border-color: rgba(244, 244, 245, 0.14) !important;
		}
		html.dark .ds-install-cta-gated.disabled svg,
		html.dark .ds-install-cta-gated[disabled] svg {
			color: rgba(244, 244, 245, 0.28) !important;
		}

		/* Empty-state pulse — applied when the URL input wrap has no
		   value entered yet. The merchant lands on this card after
		   clicking "New Store" in the welcome-back modal and needs to
		   know that typing here is the next action (the Add DropStart
		   button below is disabled until a valid handle is entered).
		   Border + a subtle ring throb with the theme highlight color
		   so the input visually beckons. Stops the moment the user
		   types a character (the `has-input` / `is-valid` /
		   `is-invalid` classes Alpine applies have stronger
		   specificity and override this state's animation).
		   Respects prefers-reduced-motion. Telegram 5591. */
		.ds-shop-url-input-wrap.is-empty-pulse {
			animation: ds-shop-url-empty-pulse 1.85s ease-in-out infinite;
			border-color: var(--ds-primary, #6366f1);
		}
		@keyframes ds-shop-url-empty-pulse {
			0%, 100% {
				box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);
				border-color: color-mix(in srgb, var(--ds-primary, #6366f1) 55%, transparent);
			}
			50% {
				box-shadow: 0 0 0 6px color-mix(in srgb, var(--ds-primary, #6366f1) 22%, transparent);
				border-color: var(--ds-primary, #6366f1);
			}
		}
		/* Fallback for browsers without color-mix (older Safari < 16.2):
		   plain rgba on the primary fallback hex, less brand-accurate
		   but still gives the pulse cue. */
		@supports not (color: color-mix(in srgb, red, blue)) {
			@keyframes ds-shop-url-empty-pulse {
				0%, 100% {
					box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);
					border-color: rgba(99, 102, 241, 0.55);
				}
				50% {
					box-shadow: 0 0 0 6px rgba(99, 102, 241, 0.22);
					border-color: rgba(99, 102, 241, 1);
				}
			}
		}
		@media (prefers-reduced-motion: reduce) {
			.ds-shop-url-input-wrap.is-empty-pulse {
				animation: none;
				/* Static accent instead of motion so accessibility
				   users still see the highlight cue. */
				border-color: var(--ds-primary, #6366f1);
				box-shadow: 0 0 0 3px color-mix(in srgb, var(--ds-primary, #6366f1) 18%, transparent);
			}
		}

		@media (max-width: 480px) {
			.ds-shop-url-modal { padding-top: 2rem; }
			.ds-shop-url-input  { font-size: 0.9375rem; padding: 0.8125rem 0.25rem 0.8125rem 0.875rem; }
			.ds-shop-url-suffix { font-size: 0.875rem; padding-right: 0.75rem; }
			.ds-shop-url-help   { padding: 0.875rem 1rem; }
			.ds-shop-url-steps li { font-size: 0.78125rem; padding-left: 1.875rem; }
			.ds-shop-url-steps li::before { width: 20px; height: 20px; line-height: 20px; }
			.ds-shop-url-example { font-size: 0.71875rem; }
		}

		/* Tertiary "Didn't finish setting up your plan?" re-open link
		   shown while watchingPlan is true — mirrors the .ds-signup-help-toggle
		   pattern from stepsignup.blade.php (originally scoped there). */
		.ds-signup-help-toggle {
			margin: 0.875rem auto 0;
			display: inline-flex;
			align-items: center;
			gap: 0.375rem;
			background: transparent;
			border: none;
			font-size: 0.8125rem;
			color: #64748b;
			cursor: pointer;
			padding: 0.25rem 0.5rem;
			font-weight: 500;
			text-decoration: underline dotted;
			text-underline-offset: 3px;
			transition: color 0.15s ease;
		}
		.ds-signup-help-toggle:hover { color: #0f172a; }
		.ds-signup-help-toggle svg { transition: transform 0.25s ease; }
