/* DanangBuddy Coastal Premium visual layer.
   This file intentionally contains presentation only: no layout hooks, data or behavior. */
:root {
  --dbf-coastal-ink: #123f49;
  --dbf-coastal-muted: #668087;
  --dbf-coastal-teal: #0eaaa7;
  --dbf-coastal-deep: #087f83;
  --dbf-coastal-mint: #edf9f7;
  --dbf-coastal-coral: #ee6b5b;
  --dbf-coastal-purple: #7356c8;
  --dbf-coastal-line: rgba(14, 170, 167, .2);
  --dbf-coastal-shadow: 0 20px 54px rgba(17, 82, 90, .17);
}

/* Shared interaction language. */
.city-bottom-nav button,
.city-action-menu button,
.city-service-sheet button,
.dbfNearbyLayer button,
.dbfTourLayer button,
.dbfTicketLayer button,
.dbfDiningLayer button {
  transition: background-color .18s ease, border-color .18s ease, color .18s ease, box-shadow .18s ease, transform .18s ease;
}

.city-bottom-nav button:hover,
.city-action-menu button:hover,
.city-service-sheet button:hover,
.dbfNearbyLayer button:hover,
.dbfTourLayer button:hover,
.dbfTicketLayer button:hover,
.dbfDiningLayer button:hover {
  transform: translateY(-1px);
}

/* Map shell. */
.panel {
  isolation: isolate;
  background:
    radial-gradient(circle at 8% 2%, rgba(14, 170, 167, .1), transparent 30%),
    linear-gradient(145deg, rgba(255, 255, 255, .96), rgba(244, 253, 251, .91));
  border-color: rgba(14, 170, 167, .28);
  box-shadow: 0 24px 62px rgba(17, 82, 90, .2), inset 0 3px 0 rgba(14, 170, 167, .56);
}

.panel h1 {
  color: var(--dbf-coastal-ink);
  font-weight: 900;
  letter-spacing: -.035em;
}

/* City-map brand layer: compact on desktop, still readable when the panel
   collapses on mobile. The user-provided DanangBuddy globe is kept as a
   branded accent while the text remains live and accessible. */
.city-map-brand {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px;
  margin: -2px 0 11px;
  padding-bottom: 10px;
  border-bottom: 1px solid rgba(14, 170, 167, .14);
}

.city-map-brand-logo {
  display: block;
  width: 52px;
  height: 52px;
  object-fit: contain;
  padding: 3px;
  border: 3px solid rgba(255, 255, 255, .95);
  border-radius: 16px;
  background: #fff;
  box-shadow: 0 8px 18px rgba(239, 80, 178, .18), 0 0 0 1px rgba(239, 80, 178, .18);
}

.city-map-brand-copy {
  display: grid;
  gap: 2px;
  min-width: 0;
}

.city-map-brand-copy strong {
  color: var(--dbf-coastal-ink);
  font-size: 16px;
  font-weight: 950;
  letter-spacing: -.025em;
}

.city-map-brand-copy small {
  overflow: hidden;
  color: var(--dbf-coastal-muted);
  font-size: 10px;
  line-height: 1.25;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.city-map-brand-mark {
  align-self: start;
  justify-self: end;
  padding-top: 3px;
  color: var(--dbf-coastal-teal);
  font-family: "Segoe Script", "Brush Script MT", cursive;
  font-size: 15px;
  font-style: italic;
  white-space: nowrap;
  transform: rotate(-5deg);
}

.city-map-landmarks {
  display: flex;
  gap: 6px;
  margin: -2px 0 12px;
  overflow-x: auto;
  scrollbar-width: none;
}

.city-map-landmarks::-webkit-scrollbar { display: none; }

.city-map-landmarks > span {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  flex: 0 0 auto;
  padding: 5px 8px;
  border: 1px solid rgba(14, 170, 167, .13);
  border-radius: 999px;
  background: rgba(237, 249, 247, .72);
  color: #4d747b;
  font-size: 10px;
  font-weight: 750;
  white-space: nowrap;
}

.city-map-landmarks > span > span:first-child { font-size: 13px; line-height: 1; }

/* Native vector landmark artwork. It is decorative and pointer-transparent,
   so it can never intercept map/search interactions. */
.city-panel-scene {
  position: absolute;
  z-index: 0;
  inset: 66px 8px 8px;
  margin: 0;
  min-height: 0;
  overflow: hidden;
  border: 0;
  border-radius: 16px;
  box-shadow: none;
  opacity: .13;
  filter: blur(1.25px) saturate(.78);
  mask-image: linear-gradient(to bottom, transparent 0, #000 14%, #000 82%, transparent 100%);
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 14%, #000 82%, transparent 100%);
  pointer-events: none;
}

.city-panel-scene::after {
  position: absolute;
  inset: 0;
  background: linear-gradient(145deg, rgba(255, 255, 255, .2), transparent 48%, rgba(14, 170, 167, .08));
  content: "";
}

.city-panel-scene-svg {
  display: none;
}

.city-panel-scene-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 52%;
  transform: scale(1.035);
}

.city-panel-scene-caption {
  display: none;
}

.panel > :not(.city-panel-scene) {
  position: relative;
  z-index: 2;
}

.panel-details,
.city-map-brand,
.city-map-landmarks,
.panel > .eyebrow,
.panel > h1,
.panel > p,
.panel > #mapSearchForm,
.panel > #mapSuggestions,
.panel > #mapSearchTarget,
.panel > #mapSearchTarget {
  position: relative;
  z-index: 2;
}

.panel.is-collapsed .city-panel-scene { display: none; }

/* A small, non-blocking travel utility. It sits above the bottom navigation
   on phones and stays out of the panel/search flow on larger screens. */
.city-weather-card {
  position: fixed;
  z-index: 4;
  left: 16px;
  bottom: 16px;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px;
  width: min(300px, calc(100vw - 32px));
  box-sizing: border-box;
  padding: 10px 11px;
  border: 1px solid rgba(255, 255, 255, .76);
  border-radius: 17px;
  background: rgba(255, 255, 255, .9);
  box-shadow: 0 16px 38px rgba(17, 82, 90, .2), inset 0 1px 0 rgba(255, 255, 255, .9);
  backdrop-filter: blur(16px) saturate(1.08);
  color: var(--dbf-coastal-ink);
}

.city-weather-icon {
  display: grid;
  width: 38px;
  height: 38px;
  place-items: center;
  border-radius: 13px;
  background: linear-gradient(145deg, #fff4bc, #ffd66f);
  box-shadow: 0 5px 14px rgba(241, 177, 39, .22);
  font-size: 21px;
}

.city-weather-icon img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.city-weather-summary-hit {
  display: grid;
  grid-column: 1 / span 2;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: 10px;
  min-width: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  text-align: left;
  cursor: pointer;
}

.city-weather-summary-hit:hover,
.city-weather-summary-hit:active,
.city-weather-summary-hit:focus:not(:focus-visible) {
  background: transparent !important;
  box-shadow: none !important;
  color: inherit !important;
  filter: none !important;
  transform: none !important;
}

.city-weather-summary-hit:focus-visible {
  outline: 2px solid var(--dbf-coastal-teal);
  outline-offset: 4px;
  border-radius: 14px;
  background: transparent;
}

.city-weather-copy {
  display: grid;
  min-width: 0;
  gap: 2px;
}

.city-weather-copy strong,
.city-weather-copy > span,
.city-weather-copy small {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.city-weather-copy strong {
  color: var(--dbf-coastal-ink);
  font-size: 11px;
  font-weight: 950;
}

.city-weather-copy > span {
  color: #2f6d74;
  font-size: 12px;
  font-weight: 850;
}

.city-weather-copy small {
  color: var(--dbf-coastal-muted);
  font-size: 9px;
  line-height: 1.2;
}

.city-weather-refresh {
  display: grid;
  width: 28px;
  height: 28px;
  place-items: center;
  padding: 0;
  border: 1px solid rgba(14, 170, 167, .18);
  border-radius: 50%;
  background: rgba(237, 249, 247, .78);
  color: var(--dbf-coastal-deep);
  font-size: 16px;
  line-height: 1;
}

.city-weather-refresh:hover {
  transform: rotate(24deg);
}

.city-weather-refresh img {
  display: block;
  width: 17px;
  height: 17px;
  object-fit: contain;
}

.city-weather-refresh:disabled { cursor: wait; opacity: .55; }
.city-weather-card[data-loading="true"] .city-weather-icon { animation: dbfWeatherFloat 1.2s ease-in-out infinite; }

.city-weather-toggle {
  display: none;
  width: 28px;
  height: 28px;
  place-items: center;
  padding: 0;
  border: 1px solid rgba(14, 170, 167, .18);
  border-radius: 50%;
  background: rgba(237, 249, 247, .78);
  color: var(--dbf-coastal-deep);
  font-size: 17px;
  line-height: 1;
}

.city-weather-toggle:hover { transform: translateY(-1px); }

.city-weather-card.is-expanded {
  max-height: min(390px, calc(100vh - 32px));
  overflow: auto;
  scrollbar-width: thin;
}

.city-weather-details {
  grid-column: 1 / -1;
  display: grid;
  gap: 8px;
  padding-top: 9px;
  border-top: 1px solid rgba(14, 170, 167, .18);
}

/* The native hidden attribute must win over the grid layout above. */
.city-weather-details[hidden] { display: none !important; }

.city-weather-detail-heading {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
}

.city-weather-detail-heading strong,
.city-weather-bot-copy strong {
  color: var(--dbf-coastal-ink);
  font-size: 10px;
  font-weight: 950;
}

.city-weather-detail-heading span {
  overflow: hidden;
  color: var(--dbf-coastal-muted);
  font-size: 8px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.city-weather-forecast-list {
  display: grid;
  gap: 5px;
}

.city-weather-forecast-row {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr) auto auto;
  align-items: center;
  gap: 6px;
  padding: 6px 7px;
  border: 1px solid rgba(14, 170, 167, .13);
  border-radius: 9px;
  background: rgba(239, 250, 249, .68);
  color: #2f6d74;
  font-size: 9px;
}

.city-weather-forecast-row strong { color: var(--dbf-coastal-ink); font-size: 9px; }
.city-weather-forecast-row small { color: var(--dbf-coastal-deep); font-size: 8px; font-weight: 850; }

.city-weather-plan {
  position: absolute;
  left: 0;
  bottom: calc(100% + 9px);
  z-index: 2;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 3px 8px;
  align-items: center;
  width: min(360px, calc(100vw - 32px));
  box-sizing: border-box;
  padding: 9px 10px;
  border: 1px solid rgba(14, 170, 167, .2);
  border-radius: 16px 16px 16px 6px;
  background: linear-gradient(135deg, rgba(224, 250, 246, .92), rgba(246, 253, 252, .95));
  box-shadow: 0 12px 26px rgba(17, 82, 90, .18), inset 0 1px 0 rgba(255, 255, 255, .86);
  backdrop-filter: blur(14px) saturate(1.08);
  transform-origin: 24px 100%;
  will-change: opacity, transform;
}

.city-weather-plan[hidden] { display: none !important; }

.city-weather-plan::after {
  content: "";
  position: absolute;
  left: 17px;
  bottom: -6px;
  width: 11px;
  height: 11px;
  border-right: 1px solid rgba(14, 170, 167, .18);
  border-bottom: 1px solid rgba(14, 170, 167, .18);
  background: #effbf9;
  transform: rotate(45deg);
}

.city-weather-bot-avatar {
  display: block;
  width: 28px;
  height: 28px;
  align-self: start;
  border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, .9);
  background: #e9faf7;
  color: #fff;
  font-size: 16px;
  object-fit: cover;
  object-position: center;
  box-shadow: 0 5px 12px rgba(8, 127, 131, .2);
}

.city-weather-bot-copy {
  display: grid;
  min-width: 0;
  gap: 3px;
}

.city-weather-bot-copy span {
  color: #386770;
  font-size: 9px;
  line-height: 1.4;
}

.city-weather-plan.is-speaking {
  animation: dbfWeatherBotIn .46s cubic-bezier(.16, 1, .3, 1) both;
}

.city-weather-plan.is-collapsing {
  pointer-events: none;
  animation: dbfWeatherBotOut .42s cubic-bezier(.7, 0, .84, 0) both;
}

.city-weather-card.is-expanded .city-weather-plan.is-docking {
  animation: dbfWeatherBotDock .52s cubic-bezier(.16, 1, .3, 1) both;
}

.city-weather-card.is-expanded .city-weather-plan {
  position: relative;
  left: auto;
  bottom: auto;
  grid-column: 1 / -1;
  width: auto;
  margin-top: 2px;
}

.nearby-cta-bubble {
  position: fixed;
  right: var(--dbf-nearby-cta-right, 16px);
  bottom: var(--dbf-nearby-cta-bottom, calc(max(14px, env(safe-area-inset-bottom)) + 84px + 10px));
  z-index: 33;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 8px;
  width: min(360px, calc(100vw - 32px));
  box-sizing: border-box;
  padding: 9px 10px;
  border: 1px solid rgba(14, 170, 167, .22);
  border-radius: 16px 16px 7px 16px;
  background: linear-gradient(135deg, rgba(239, 253, 250, .96), rgba(255, 255, 255, .95));
  box-shadow: 0 14px 30px rgba(17, 82, 90, .2), inset 0 1px 0 rgba(255, 255, 255, .9);
  backdrop-filter: blur(15px) saturate(1.08);
  color: var(--dbf-coastal-ink);
  transform-origin: calc(100% - var(--dbf-nearby-cta-tail-right, 42px)) 100%;
  will-change: opacity, transform;
}

.nearby-cta-bubble[hidden] { display: none !important; }

.nearby-cta-bubble::after {
  content: "";
  position: absolute;
  right: var(--dbf-nearby-cta-tail-right, 38px);
  bottom: -6px;
  width: 11px;
  height: 11px;
  border-right: 1px solid rgba(14, 170, 167, .2);
  border-bottom: 1px solid rgba(14, 170, 167, .2);
  background: #f2fcfa;
  transform: rotate(45deg);
}

.nearby-cta-icon {
  display: grid;
  width: 30px;
  height: 30px;
  place-items: center;
  border-radius: 50%;
  background: linear-gradient(145deg, #dffaf5, #b9eee6);
  color: var(--dbf-coastal-deep);
  font-size: 19px;
  font-weight: 950;
  box-shadow: 0 5px 13px rgba(8, 127, 131, .16);
}

.nearby-cta-icon img {
  display: block;
  width: 22px;
  height: 22px;
  object-fit: contain;
}

.nearby-cta-copy {
  display: grid;
  min-width: 0;
  gap: 3px;
}

.nearby-cta-copy strong {
  overflow: hidden;
  color: var(--dbf-coastal-ink);
  font-size: 10px;
  font-weight: 950;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nearby-cta-copy span {
  color: #386770;
  font-size: 9px;
  line-height: 1.35;
}

.nearby-cta-action {
  position: relative;
  z-index: 1;
  padding: 7px 8px;
  border: 1px solid rgba(14, 170, 167, .22);
  border-radius: 10px;
  background: rgba(255, 255, 255, .78);
  color: var(--dbf-coastal-deep);
  font-size: 9px;
  font-weight: 950;
  white-space: nowrap;
}

.nearby-cta-action:hover,
.nearby-cta-action:active,
.nearby-cta-action:focus:not(:focus-visible) {
  transform: translateY(-1px) !important;
}

.nearby-cta-bubble.is-speaking {
  animation: dbfNearbyCtaIn .46s cubic-bezier(.16, 1, .3, 1) both;
}

.nearby-cta-bubble.is-collapsing {
  pointer-events: none;
  animation: dbfNearbyCtaOut .36s cubic-bezier(.7, 0, .84, 0) both;
}

@keyframes dbfNearbyCtaIn {
  from { opacity: 0; transform: translateY(9px) scale(.9); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes dbfNearbyCtaOut {
  from { opacity: 1; transform: translateY(0) scale(1); }
  to { opacity: 0; transform: translateY(11px) scale(.72); }
}

@media (max-width: 720px) {
  .nearby-cta-bubble {
    right: var(--dbf-nearby-cta-right, 10px);
    bottom: var(--dbf-nearby-cta-bottom, calc(max(8px, env(safe-area-inset-bottom)) + 84px + 66px));
    width: min(330px, calc(100vw - 20px));
  }
  .nearby-cta-copy span { font-size: 8px; }
  .nearby-cta-action { padding-inline: 7px; font-size: 8px; }
}

.chat-notification-bubble {
  position: fixed;
  left: var(--dbf-chat-notification-left, 16px);
  bottom: var(--dbf-chat-notification-bottom, calc(max(14px, env(safe-area-inset-bottom)) + 84px + 10px));
  z-index: 34;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 8px;
  width: min(360px, calc(100vw - 32px));
  box-sizing: border-box;
  padding: 9px 10px;
  border: 1px solid rgba(14, 170, 167, .24);
  border-radius: 16px 16px 16px 7px;
  background: linear-gradient(135deg, rgba(239, 253, 250, .97), rgba(255, 255, 255, .96));
  box-shadow: 0 14px 30px rgba(17, 82, 90, .2), inset 0 1px 0 rgba(255, 255, 255, .9);
  backdrop-filter: blur(15px) saturate(1.08);
  color: var(--dbf-coastal-ink);
  transform-origin: var(--dbf-chat-notification-tail-left, 42px) 100%;
  will-change: opacity, transform;
}

.chat-notification-bubble[hidden] { display: none !important; }

.chat-notification-bubble::after {
  content: "";
  position: absolute;
  left: var(--dbf-chat-notification-tail-left, 38px);
  bottom: -6px;
  width: 11px;
  height: 11px;
  border-right: 1px solid rgba(14, 170, 167, .22);
  border-bottom: 1px solid rgba(14, 170, 167, .22);
  background: #f2fcfa;
  transform: rotate(45deg);
}

.chat-notification-icon {
  display: grid;
  width: 30px;
  height: 30px;
  place-items: center;
  border-radius: 50%;
  background: linear-gradient(145deg, #dffaf5, #b9eee6);
  color: var(--dbf-coastal-deep);
  font-size: 16px;
  font-weight: 950;
  box-shadow: 0 5px 13px rgba(8, 127, 131, .16);
}

.chat-notification-icon img {
  display: block;
  width: 19px;
  height: 19px;
  object-fit: contain;
}

.chat-notification-copy {
  display: grid;
  min-width: 0;
  gap: 3px;
}

.chat-notification-copy strong {
  overflow: hidden;
  color: var(--dbf-coastal-ink);
  font-size: 10px;
  font-weight: 950;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.chat-notification-copy span {
  color: #386770;
  font-size: 9px;
  line-height: 1.35;
}

.chat-notification-action {
  position: relative;
  z-index: 1;
  padding: 7px 8px;
  border: 1px solid rgba(14, 170, 167, .22);
  border-radius: 10px;
  background: rgba(255, 255, 255, .78);
  color: var(--dbf-coastal-deep);
  font-size: 9px;
  font-weight: 950;
  white-space: nowrap;
}

.chat-notification-action:hover,
.chat-notification-action:active,
.chat-notification-action:focus:not(:focus-visible) {
  transform: translateY(-1px) !important;
}

.chat-notification-bubble.is-speaking {
  animation: dbfChatNotificationIn .46s cubic-bezier(.16, 1, .3, 1) both;
}

.chat-notification-bubble.is-collapsing {
  pointer-events: none;
  animation: dbfChatNotificationOut .36s cubic-bezier(.7, 0, .84, 0) both;
}

@keyframes dbfChatNotificationIn {
  from { opacity: 0; transform: translateY(9px) scale(.9); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes dbfChatNotificationOut {
  from { opacity: 1; transform: translateY(0) scale(1); }
  to { opacity: 0; transform: translateY(11px) scale(.72); }
}

@media (max-width: 720px) {
  .chat-notification-bubble {
    left: var(--dbf-chat-notification-left, 12px);
    bottom: var(--dbf-chat-notification-bottom, calc(max(8px, env(safe-area-inset-bottom)) + 84px + 66px));
    width: min(350px, calc(100vw - 24px));
  }
  .chat-notification-copy span { font-size: 8px; }
  .chat-notification-action { padding-inline: 7px; font-size: 8px; }
}

@keyframes dbfWeatherBotIn {
  from { opacity: 0; transform: translateY(6px) scale(.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes dbfWeatherBotOut {
  from { opacity: 1; transform: translateY(0) scale(1); }
  to { opacity: 0; transform: translateY(18px) scale(.72); }
}

@keyframes dbfWeatherBotDock {
  from { opacity: .72; transform: translateY(-18px) scale(.94); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes dbfWeatherFloat {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-2px); }
}

@media (max-width: 720px) {
  .city-map-brand { grid-template-columns: auto minmax(0, 1fr) auto; gap: 8px; }
  .city-map-brand-logo { width: 44px; height: 44px; }
  .city-map-brand-copy strong { font-size: 14px; }
  .city-map-brand-mark { display: block; padding-top: 1px; font-size: 13px; }
  .city-map-landmarks { margin-bottom: 10px; }
  .city-panel-scene {
    inset: 58px 7px 7px;
    margin: 0;
    height: auto;
    border-radius: 14px;
    opacity: .11;
  }
  .city-weather-card {
    left: 10px;
    right: 10px;
    bottom: calc(max(8px, env(safe-area-inset-bottom)) + 84px);
    width: auto;
    grid-template-columns: auto minmax(0, 1fr) auto auto;
    padding: 8px 9px;
    border-radius: 15px;
  }
  .city-weather-summary-hit { grid-column: 1 / span 2; }
  .city-weather-card.is-expanded { max-height: min(420px, calc(100dvh - 112px)); }
  .city-weather-card.is-compact .city-weather-copy small { display: none; }
  .city-weather-toggle { display: grid; }
  .city-weather-icon { width: 34px; height: 34px; border-radius: 11px; font-size: 18px; }
  .city-weather-copy strong { font-size: 10px; }
  .city-weather-copy > span { font-size: 11px; }
  .city-weather-copy small { font-size: 8px; }
  .nearby-radar-hud {
    z-index: 5;
    bottom: calc(max(8px, env(safe-area-inset-bottom)) + 84px);
  }
}

.eyebrow {
  color: var(--dbf-coastal-deep);
  text-shadow: 0 4px 14px rgba(14, 170, 167, .16);
}

#mapSearchForm input {
  border-color: rgba(14, 170, 167, .32);
  background: rgba(255, 255, 255, .92);
  box-shadow: inset 0 1px 2px rgba(17, 82, 90, .03);
}

#mapSearchForm input:focus {
  border-color: var(--dbf-coastal-teal);
  box-shadow: 0 0 0 4px rgba(14, 170, 167, .13), inset 0 1px 2px rgba(17, 82, 90, .03);
}

#mapSearchForm button,
.nearby-map-profile,
.city-service-submit,
.city-chat-tabs button.active {
  background: linear-gradient(135deg, #16bdb4, var(--dbf-coastal-deep));
  box-shadow: 0 12px 26px rgba(8, 127, 131, .24);
}

.map-tools button,
.search-target-focus,
.nearby-radar-action {
  border-radius: 999px;
  border-color: rgba(14, 170, 167, .28);
  background: rgba(255, 255, 255, .84);
  color: var(--dbf-coastal-deep);
}

.map-tools button.active {
  background: #e4faf6;
  border-color: #58c9c2;
  box-shadow: 0 5px 15px rgba(14, 170, 167, .12);
}

.legend {
  border-top-color: rgba(14, 170, 167, .18);
  color: #4f7078;
}

.legend .dot {
  border: 2px solid rgba(255, 255, 255, .95);
  box-shadow: 0 0 0 2px rgba(17, 82, 90, .1), 0 3px 8px rgba(17, 82, 90, .16);
}

.nearby-radar-hud {
  background: rgba(255, 255, 255, .9);
  border-color: rgba(14, 170, 167, .34);
  box-shadow: 0 18px 42px rgba(17, 82, 90, .22), inset 0 2px 0 rgba(14, 170, 167, .35);
}

.nearby-radar-icon {
  box-shadow: 0 0 0 6px rgba(14, 170, 167, .11), 0 10px 24px rgba(14, 170, 167, .25);
}

.nearby-match-overlay button {
  border-color: rgba(255, 255, 255, .98);
  background: linear-gradient(145deg, #8268d8, var(--dbf-coastal-purple));
  box-shadow: 0 0 0 4px rgba(115, 86, 200, .23), 0 9px 20px rgba(25, 44, 92, .28);
}

.nearby-match-overlay button.is-coincident {
  background: linear-gradient(145deg, #16bdb4, var(--dbf-coastal-deep));
  box-shadow: 0 0 0 4px rgba(14, 170, 167, .27), 0 0 0 8px rgba(115, 86, 200, .15), 0 9px 20px rgba(25, 44, 92, .28);
}

.nearby-popup-avatar,
.nearby-popup-avatar img {
  box-shadow: 0 0 0 3px rgba(14, 170, 167, .16), 0 10px 20px rgba(16, 91, 96, .2);
}

/* Persistent bottom navigation and service menus. */
.city-bottom-nav {
  background: rgba(255, 255, 255, .91);
  border-color: rgba(14, 170, 167, .26);
  box-shadow: 0 22px 54px rgba(17, 82, 90, .25), inset 0 1px 0 rgba(255, 255, 255, .9);
}

.city-bottom-nav button:hover {
  transform: translateY(-1px);
}

.city-bottom-nav .city-nav-icon {
  position: relative;
  display: inline-grid;
  width: 30px;
  height: 30px;
  place-items: center;
  border-radius: 11px;
  background: #eafaf7;
  color: var(--dbf-coastal-deep);
  font-family: "Segoe UI Emoji", "Noto Color Emoji", sans-serif;
  text-shadow: 0 4px 10px rgba(14, 170, 167, .2);
}

.chat-notification-badge {
  position: absolute;
  top: -5px;
  right: -7px;
  display: grid;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  place-items: center;
  box-sizing: border-box;
  border: 2px solid rgba(255, 255, 255, .94);
  border-radius: 99px;
  background: #e85b63;
  color: #fff;
  font-size: 8px;
  font-weight: 950;
  line-height: 1;
  text-shadow: none;
}

.chat-notification-badge[hidden] { display: none; }

.city-bottom-nav .city-nav-primary .city-nav-icon {
  background: rgba(255, 255, 255, .16);
  color: #fff;
}

/* The central ride action is intentionally distinct from the secondary
   navigation: deep ocean tones, a restrained sheen, and a clear press state
   keep it prominent without using the old teal hover fill. */
.city-bottom-nav .city-nav-primary {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: linear-gradient(145deg, #102f3b, #2b5660);
  color: #fff;
  box-shadow: 0 14px 28px rgba(16, 47, 59, .28), inset 0 1px 0 rgba(255, 255, 255, .22);
  transition: transform .28s cubic-bezier(.16, 1, .3, 1), box-shadow .28s ease, filter .28s ease;
}

.city-bottom-nav .city-nav-primary::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: linear-gradient(112deg, transparent 22%, rgba(255, 255, 255, .28) 48%, transparent 72%);
  transform: translateX(-130%);
}

.city-bottom-nav .city-nav-primary::after {
  content: "";
  position: absolute;
  inset: 1px;
  z-index: 0;
  pointer-events: none;
  border: 1px solid rgba(255, 255, 255, .14);
  border-radius: inherit;
}

.city-bottom-nav .city-nav-primary .city-nav-icon,
.city-bottom-nav .city-nav-primary small {
  position: relative;
  z-index: 1;
}

.city-bottom-nav .city-nav-primary .city-nav-icon {
  will-change: transform;
  transition: transform .32s cubic-bezier(.16, 1, .3, 1), filter .32s ease;
}

@media (hover: hover) and (pointer: fine) {
  .city-bottom-nav .city-nav-primary:hover {
    transform: translateY(-4px);
    box-shadow: 0 19px 34px rgba(16, 47, 59, .34), inset 0 1px 0 rgba(255, 255, 255, .26);
  }

  .city-bottom-nav .city-nav-primary:hover::before {
    animation: dbfRideSheen .9s ease-out;
  }

  .city-bottom-nav .city-nav-primary:hover .city-nav-icon {
    transform: translateY(-2px) rotate(-5deg) scale(1.06);
    filter: drop-shadow(0 5px 7px rgba(0, 0, 0, .22));
  }
}

.city-bottom-nav .city-nav-primary:active {
  transform: translateY(-1px) scale(.97);
  box-shadow: 0 9px 18px rgba(16, 47, 59, .24), inset 0 1px 0 rgba(255, 255, 255, .18);
}

.city-bottom-nav .city-nav-primary:active .city-nav-icon {
  transform: translateY(1px) scale(.94);
}

.city-bottom-nav .city-nav-primary:focus-visible {
  outline: 3px solid rgba(255, 255, 255, .92);
  outline-offset: 3px;
}

@keyframes dbfRideSheen {
  from { transform: translateX(-130%); }
  to { transform: translateX(130%); }
}

/* Ticket launcher: a compact DanangBuddy service menu. The illustrations are
   native SVG/CSS so the menu stays crisp, fast and usable without an image
   request. The animated coastal layers are deliberately subtle so labels
   remain the visual priority. */
.city-service-menu {
  position: fixed;
  display: block;
  width: min(454px, calc(100vw - 28px));
  max-height: min(620px, calc(100vh - 128px));
  padding: 0;
  overflow: auto;
  isolation: isolate;
  border: 1px solid rgba(14, 170, 167, .28);
  border-radius: 28px;
  background: linear-gradient(155deg, #ffffff 0%, #f6fffd 58%, #e6f9f7 100%);
  box-shadow: 0 28px 72px rgba(15, 67, 75, .34), 0 0 0 1px rgba(255, 255, 255, .55) inset;
  scrollbar-width: thin;
  scrollbar-color: rgba(8, 127, 131, .32) transparent;
}

.city-service-menu-scene {
  position: absolute;
  z-index: -1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  border-radius: inherit;
  background:
    radial-gradient(circle at 86% 16%, rgba(255, 205, 137, .56) 0 4%, transparent 4.5%),
    linear-gradient(180deg, rgba(214, 248, 247, .82) 0%, rgba(237, 253, 250, .22) 52%, rgba(218, 249, 246, .72) 100%);
}

.city-service-menu-scene::before {
  position: absolute;
  content: "";
  inset: 0;
  opacity: .72;
  background:
    linear-gradient(166deg, transparent 0 64%, rgba(8, 127, 131, .08) 64.5% 65%, transparent 65.5%),
    radial-gradient(ellipse at 13% 88%, rgba(14, 170, 167, .18) 0 17%, transparent 17.5%),
    radial-gradient(ellipse at 82% 84%, rgba(14, 170, 167, .13) 0 22%, transparent 22.5%);
}

.city-service-menu-scene::after {
  position: absolute;
  content: "";
  left: -10%;
  right: -10%;
  bottom: 0;
  height: 32%;
  opacity: .62;
  background: repeating-radial-gradient(ellipse at 50% 100%, transparent 0 16px, rgba(14, 170, 167, .14) 17px 19px, transparent 20px 35px);
  animation: dbfMyKheWaves 11s ease-in-out infinite alternate;
}

.city-service-menu-sun {
  position: absolute;
  top: 66px;
  right: 58px;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 35%, #fff8dd, #ffd194 62%, rgba(255, 209, 148, 0));
  filter: blur(.2px);
  opacity: .78;
}

.city-service-menu-horizon {
  position: absolute;
  right: -4%;
  bottom: 24%;
  left: -4%;
  height: 22%;
  opacity: .32;
  background: linear-gradient(160deg, transparent 0 24%, #78d5ca 24.5% 28%, transparent 28.5%), linear-gradient(18deg, transparent 0 42%, #56bdb7 42.5% 47%, transparent 47.5%);
  clip-path: polygon(0 82%, 15% 52%, 25% 70%, 39% 26%, 52% 67%, 65% 40%, 79% 72%, 89% 49%, 100% 70%, 100% 100%, 0 100%);
}

.city-service-menu-wave {
  position: absolute;
  right: -15%;
  left: -15%;
  height: 25px;
  border-top: 2px solid rgba(14, 170, 167, .22);
  border-radius: 50%;
  animation: dbfMyKheWaves 8s ease-in-out infinite alternate;
}

.city-service-menu-wave-one { bottom: 12%; transform: rotate(-2deg); }
.city-service-menu-wave-two { bottom: 6%; opacity: .65; transform: rotate(2deg); animation-delay: -3s; }

.city-service-menu-bridge {
  position: absolute;
  right: 18px;
  bottom: 6%;
  width: 128px;
  height: 38px;
  opacity: .24;
  border-top: 4px solid #0eaaa7;
  border-radius: 50% 50% 0 0;
  transform: skewX(-7deg);
}

.city-service-menu-bridge::before,
.city-service-menu-bridge::after {
  position: absolute;
  bottom: -1px;
  width: 4px;
  height: 40px;
  content: "";
  background: #0eaaa7;
}

.city-service-menu-bridge::before { left: 22px; }
.city-service-menu-bridge::after { right: 22px; }

.city-service-menu-palm {
  position: absolute;
  bottom: 9%;
  left: 27px;
  width: 4px;
  height: 46px;
  opacity: .2;
  background: #087f83;
  transform: rotate(8deg);
}

.city-service-menu-palm::before {
  position: absolute;
  top: -7px;
  left: -15px;
  width: 34px;
  height: 18px;
  content: "";
  border-top: 4px solid #087f83;
  border-radius: 50%;
  transform: rotate(-10deg);
}

@keyframes dbfMyKheWaves {
  from { transform: translateX(-10px) rotate(-1deg); }
  to { transform: translateX(14px) rotate(1deg); }
}

.city-service-menu-header,
.city-service-menu-list,
.city-service-menu-footer {
  position: relative;
  z-index: 1;
}

.city-service-menu-header {
  padding: 23px 23px 17px;
}

.city-service-menu-header p:first-child {
  margin: 0 0 7px;
  color: #0eaaa7;
  font-size: 10px;
  font-weight: 900;
  letter-spacing: .13em;
}

.city-service-menu-header h2 {
  max-width: 355px;
  margin: 0;
  color: var(--dbf-coastal-ink);
  font-size: clamp(22px, 5vw, 29px);
  font-weight: 900;
  letter-spacing: -.035em;
  line-height: 1.1;
}

.city-service-menu-header > span {
  display: block;
  margin-top: 7px;
  color: #668087;
  font-size: 12px;
  line-height: 1.35;
}

.city-service-menu-list {
  display: grid;
  gap: 10px;
  padding: 0 14px;
}

.city-service-menu-card {
  position: relative;
  display: grid;
  grid-template-columns: 58px minmax(0, 1fr) 38px;
  align-items: center;
  gap: 12px;
  width: 100%;
  min-height: 88px;
  padding: 12px 13px 12px 12px;
  overflow: hidden;
  border: 1px solid rgba(14, 170, 167, .18);
  border-radius: 21px;
  background: rgba(255, 255, 255, .82);
  color: var(--dbf-coastal-ink);
  text-align: left;
  cursor: pointer;
  box-shadow: 0 8px 22px rgba(17, 82, 90, .08);
  transition: transform .24s cubic-bezier(.16, 1, .3, 1), border-color .24s ease, box-shadow .24s ease, background .24s ease;
}

.city-service-menu-card::after {
  position: absolute;
  right: -22px;
  bottom: -28px;
  width: 135px;
  height: 75px;
  content: "";
  border-top: 2px solid rgba(14, 170, 167, .16);
  border-radius: 50%;
  transform: rotate(-7deg);
}

.city-service-menu-card.is-featured {
  border-color: #0eaaa7;
  background: linear-gradient(125deg, #173f49, #087f83);
  color: #fff;
  box-shadow: 0 12px 27px rgba(8, 127, 131, .26), inset 0 1px 0 rgba(255, 255, 255, .18);
}

.city-service-menu-card.is-featured::after {
  border-color: rgba(173, 245, 235, .32);
}

.city-service-menu-card:hover,
.city-service-menu-card:focus-visible {
  box-shadow: 0 13px 27px rgba(17, 82, 90, .15);
  transform: translateY(-2px);
}

.city-service-menu-card.is-featured:hover,
.city-service-menu-card.is-featured:focus-visible {
  transform: translateY(-2px);
}

.city-service-menu-card:focus-visible {
  outline: 3px solid rgba(14, 170, 167, .28);
  outline-offset: 2px;
}

.city-service-menu-card-icon {
  display: grid;
  width: 58px;
  height: 58px;
  place-items: center;
  border-radius: 18px;
  background: #e0f8f5;
  color: #087f83;
}

.city-service-menu-card.is-featured .city-service-menu-card-icon {
  background: rgba(255, 255, 255, .15);
  color: #fff;
}

.city-service-menu-card-icon svg {
  width: 38px;
  height: 38px;
  fill: none;
  stroke: currentColor;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-width: 2.2;
}

.city-service-menu-card-icon img {
  display: block;
  width: 78%;
  height: 78%;
  object-fit: contain;
}

.city-service-menu-card-copy {
  min-width: 0;
}

.city-service-menu-card-copy strong,
.city-service-menu-card-copy small {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
}

.city-service-menu-card-copy strong {
  position: relative;
  z-index: 1;
  color: currentColor;
  font-size: 17px;
  font-weight: 900;
  line-height: 1.2;
}

.city-service-menu-card-copy small {
  margin-top: 5px;
  color: #668087;
  font-size: 12px;
  line-height: 1.25;
  white-space: nowrap;
}

.city-service-menu-card.is-featured .city-service-menu-card-copy small {
  color: rgba(255, 255, 255, .78);
}

.city-service-menu-arrow {
  position: relative;
  z-index: 1;
  display: grid;
  width: 38px;
  height: 38px;
  place-items: center;
  border-radius: 50%;
  background: #eaf8f6;
  color: #087f83;
  font-size: 24px;
  line-height: 1;
}

.city-service-menu-card.is-featured .city-service-menu-arrow {
  background: rgba(255, 255, 255, .17);
  color: #fff;
}

.city-service-menu-footer {
  padding: 15px 22px 17px;
  color: rgba(8, 127, 131, .76);
  font-size: 11px;
  font-weight: 800;
  letter-spacing: .02em;
  text-align: center;
}

/* Give the persistent horizontal menu a recognizable Da Nang identity while
   keeping every label readable over the moving sea-and-sky layers. */
.city-bottom-nav {
  /* Keep the global action bar anchored to the viewport on desktop and mobile. */
  position: fixed;
  isolation: isolate;
  overflow: visible;
  background: linear-gradient(180deg, rgba(255, 255, 255, .88), rgba(224, 250, 246, .94));
}

.city-bottom-nav::before {
  position: absolute;
  z-index: 0;
  inset: 0;
  content: "";
  overflow: hidden;
  border-radius: inherit;
  opacity: .72;
  pointer-events: none;
  background: radial-gradient(ellipse at 12% 115%, rgba(14, 170, 167, .28) 0 18%, transparent 18.5%), radial-gradient(ellipse at 92% 112%, rgba(65, 185, 202, .2) 0 24%, transparent 24.5%), linear-gradient(180deg, transparent 45%, rgba(14, 170, 167, .08) 45.5% 47%, transparent 47.5%);
  animation: dbfNavSeaDrift 13s ease-in-out infinite alternate;
}

.city-bottom-nav::after {
  position: absolute;
  z-index: 0;
  right: 5%;
  bottom: 7px;
  width: 130px;
  height: 23px;
  content: "";
  border-top: 2px solid rgba(8, 127, 131, .22);
  border-radius: 50%;
  transform: rotate(-2deg);
  pointer-events: none;
}

@keyframes dbfNavSeaDrift {
  from { transform: translateX(-7px); }
  to { transform: translateX(9px); }
}

.city-bottom-nav > button {
  position: relative;
  z-index: 1;
}

.city-bottom-nav .city-nav-icon svg {
  width: 22px;
  height: 22px;
  fill: none;
  stroke: currentColor;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-width: 1.8;
}

.city-bottom-nav .city-nav-icon-image {
  display: block;
  width: 24px;
  height: 24px;
  object-fit: contain;
}

.city-bottom-nav .city-nav-primary .city-nav-icon-image { width: 30px; height: 30px; }

.city-bottom-nav .city-nav-primary .city-nav-icon svg { width: 24px; height: 24px; }
.city-bottom-nav .city-nav-ticket-icon { color: #df5263; background: #fff1f2; }
.city-bottom-nav .city-nav-people-icon { color: #7356c8; background: #f0eaff; }

@media (max-width: 720px) {
  .city-service-menu {
    width: min(454px, calc(100vw - 20px));
    max-height: min(620px, calc(100svh - 100px));
    bottom: calc(max(8px, env(safe-area-inset-bottom)) + 70px);
    border-radius: 23px;
  }

  .city-service-menu-header { padding: 20px 18px 14px; }
  .city-service-menu-list { gap: 8px; padding-inline: 10px; }
  .city-service-menu-card { grid-template-columns: 52px minmax(0, 1fr) 34px; min-height: 78px; gap: 10px; padding: 10px; border-radius: 18px; }
  .city-service-menu-card-icon { width: 52px; height: 52px; border-radius: 16px; }
  .city-service-menu-card-icon svg { width: 34px; height: 34px; }
  .city-service-menu-card-copy strong { font-size: 15px; }
  .city-service-menu-card-copy small { font-size: 11px; }
  .city-service-menu-arrow { width: 34px; height: 34px; font-size: 21px; }
  .city-service-menu-footer { padding: 12px 15px 14px; font-size: 10px; }
  .city-service-menu .city-service-menu-card-icon { width: 52px; height: 52px; border-radius: 16px; }
  .city-service-menu .city-service-menu-arrow { width: 34px; height: 34px; font-size: 21px; }
}

@media (prefers-reduced-motion: reduce) {
  .city-service-menu-scene::after,
  .city-service-menu-wave,
  .city-bottom-nav::before,
  .city-weather-plan,
  .nearby-cta-bubble,
  .chat-notification-bubble { animation: none; }
  .city-weather-plan.is-collapsing { opacity: 0; transform: translateY(10px) scale(.86); }
  .nearby-cta-bubble.is-collapsing { opacity: 0; transform: translateY(8px) scale(.86); }
  .chat-notification-bubble.is-collapsing { opacity: 0; transform: translateY(8px) scale(.86); }
}

.city-action-menu,
.city-nav-status,
.city-service-sheet {
  border-color: rgba(14, 170, 167, .25);
  box-shadow: 0 26px 70px rgba(17, 82, 90, .28);
}

.city-action-menu button,
.city-chat-quick button {
  border-color: rgba(14, 170, 167, .2);
  background: rgba(255, 255, 255, .88);
}

/* These selectors intentionally carry two class components: site-theme.js
   also styles the generic action menu at runtime, and the ticket cards must
   keep their own surface, icon and arrow treatment. */
.city-service-menu .city-service-menu-card {
  border-color: rgba(14, 170, 167, .18);
  background: rgba(255, 255, 255, .82);
}

.city-service-menu .city-service-menu-card.is-featured {
  border-color: #0eaaa7;
  background: linear-gradient(125deg, #173f49, #087f83);
}

.city-service-menu .city-service-menu-card-icon {
  width: 58px;
  height: 58px;
  background: #e0f8f5;
}

.city-service-menu .city-service-menu-card.is-featured .city-service-menu-card-icon {
  background: rgba(255, 255, 255, .15);
}

.city-service-menu .city-service-menu-card-copy,
.city-service-menu .city-service-menu-arrow {
  width: auto;
  text-align: left;
}

.city-service-menu .city-service-menu-arrow {
  width: 38px;
  height: 38px;
  font-size: 24px;
  text-align: center;
}

.city-service-menu .city-service-menu-card:hover,
.city-service-menu .city-service-menu-card:focus-visible {
  transform: translateY(-2px);
}

.city-service-menu .city-service-menu-card.is-featured:hover,
.city-service-menu .city-service-menu-card.is-featured:focus-visible {
  transform: translateY(-2px);
}

.city-service-header {
  background: linear-gradient(135deg, rgba(255, 255, 255, .97), rgba(237, 249, 247, .92));
  border-bottom-color: rgba(14, 170, 167, .16);
}

.city-service-header .city-service-icon {
  background: linear-gradient(145deg, #ddfaf4, #e9e4ff);
  box-shadow: 0 0 0 5px rgba(14, 170, 167, .09), 0 9px 20px rgba(14, 170, 167, .16);
}

.city-service-header h2 {
  color: var(--dbf-coastal-ink);
  font-weight: 900;
  letter-spacing: -.03em;
}

.city-service-notice,
.city-chat-live {
  border-color: rgba(14, 170, 167, .2);
  background: linear-gradient(145deg, #eafaf7, #f8fffd);
}

.city-service-form input,
.city-service-form textarea,
.city-chat-compose input {
  border-color: rgba(14, 170, 167, .22);
  background: rgba(255, 255, 255, .9);
}

.city-service-form input:focus,
.city-service-form textarea:focus,
.city-chat-compose input:focus {
  border-color: var(--dbf-coastal-teal);
  box-shadow: 0 0 0 4px rgba(14, 170, 167, .13);
}

/* Nearby, tour, ticket and dining sheets use one visual language. */
.dbfNearbyShell,
.dbfTourShell,
.dbfTicketPanel,
.dbfDiningPanel {
  border-color: rgba(14, 170, 167, .24);
  box-shadow: 0 30px 90px rgba(8, 48, 55, .3);
}

.dbfNearbyHead,
.dbfTourHeader,
.dbfTicketHeader,
.dbfDiningHeader {
  background: linear-gradient(135deg, rgba(255, 255, 255, .98), rgba(237, 249, 247, .92));
  border-bottom-color: rgba(14, 170, 167, .16);
}

.dbfNearbyHead h2,
.dbfTourHeading h2,
.dbfTicketHeader h2,
.dbfDiningHeader h2 {
  color: var(--dbf-coastal-ink);
  font-weight: 900;
  letter-spacing: -.035em;
}

.dbfNearbyHeadIcon,
.dbfTourCardIcon,
.dbfTicketCardMedia,
.dbfDiningCardMedia {
  filter: saturate(1.06);
}

.dbfNearbyCard,
.dbfTourCard,
.dbfTicketCard,
.dbfDiningCard,
.dbfTourForm,
.dbfTicketBox,
.dbfDiningBox {
  border-color: rgba(14, 170, 167, .18);
  box-shadow: 0 10px 26px rgba(21, 67, 72, .08);
}

.dbfNearbyCard:hover,
.dbfTourCard:hover,
.dbfTicketCard:hover,
.dbfDiningCard:hover {
  box-shadow: 0 14px 32px rgba(21, 67, 72, .13);
}

/* Cards: a restrained lift, image zoom and one-pass sheen make selectable
   experiences feel alive without changing their size or layout. */
.dbfTourCard,
.dbfTicketCard,
.dbfDiningCard {
  isolation: isolate;
  transition: transform .28s cubic-bezier(.16, 1, .3, 1),
    border-color .22s ease, box-shadow .28s ease;
}

.dbfTourCard::before,
.dbfTicketCard::before,
.dbfDiningCard::before {
  position: absolute;
  z-index: 3;
  inset: 0;
  content: "";
  pointer-events: none;
  background: linear-gradient(116deg, transparent 28%, rgba(255, 255, 255, .34) 50%, transparent 72%);
  transform: translateX(-125%);
}

.dbfTourCardArt,
.dbfTourCardBody,
.dbfTicketCardMedia,
.dbfTicketCardContent,
.dbfDiningCardMedia,
.dbfDiningCardContent {
  position: relative;
  z-index: 1;
}

.dbfTourCardImage,
.dbfTicketCardMedia img,
.dbfDiningCardMedia img {
  transition: transform .5s cubic-bezier(.16, 1, .3, 1), filter .3s ease;
}

@media (hover: hover) and (pointer: fine) {
  .dbfTourCard:hover,
  .dbfTicketCard:hover,
  .dbfDiningCard:hover {
    transform: translateY(-6px);
    box-shadow: 0 20px 42px rgba(21, 67, 72, .16);
  }

  .dbfTourCard:hover::before,
  .dbfTicketCard:hover::before,
  .dbfDiningCard:hover::before {
    animation: dbfCardShine .9s ease-out;
  }

  .dbfTourCard:hover .dbfTourCardImage,
  .dbfTicketCard:hover .dbfTicketCardMedia img,
  .dbfDiningCard:hover .dbfDiningCardMedia img {
    transform: scale(1.045);
  }
}

.dbfTourCard:active,
.dbfTicketCard:active,
.dbfDiningCard:active {
  transform: translateY(-2px) scale(.995);
}

@keyframes dbfCardShine {
  from { transform: translateX(-125%); }
  to { transform: translateX(125%); }
}

.dbfNearbyPrimary,
.dbfTourChoose,
.dbfTourPrimary,
.dbfTicketPrimary,
.dbfDiningPrimary,
.dbfDiningSubmit {
  background: linear-gradient(135deg, #16bdb4, var(--dbf-coastal-deep));
  box-shadow: 0 11px 24px rgba(8, 127, 131, .22);
}

.dbfNearbyPrimary:hover,
.dbfTourChoose:hover,
.dbfTourPrimary:hover,
.dbfTicketPrimary:hover,
.dbfDiningPrimary:hover,
.dbfDiningSubmit:hover {
  box-shadow: 0 14px 28px rgba(8, 127, 131, .28);
}

/* Primary actions: simple directional icon motion, adapted to the existing
   labels so no markup or JavaScript behavior needs to change. */
.dbfTourChoose,
.dbfTourPrimary,
.dbfTicketPrimary,
.dbfDiningPrimary,
.dbfDiningSubmit,
.nearby-map-profile,
.city-service-submit,
.ride-request-contact {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  overflow: hidden;
}

.dbfTourChoose::after,
.dbfTourPrimary::after,
.dbfTicketPrimary::after,
.dbfDiningPrimary::after,
.dbfDiningSubmit::after,
.nearby-map-profile::after,
.city-service-submit::after,
.ride-request-contact::after {
  content: "↗";
  display: inline-block;
  font-size: 1.12em;
  line-height: 1;
  transition: transform .32s cubic-bezier(.16, 1, .3, 1);
}

.dbfTourLayer .dbfTourChoose:hover::after,
.dbfTourLayer .dbfTourPrimary:hover::after,
.dbfTicketLayer .dbfTicketPrimary:hover::after,
.dbfDiningLayer .dbfDiningPrimary:hover::after,
.dbfDiningLayer .dbfDiningSubmit:hover::after,
.nearby-map-profile:hover::after,
.city-service-submit:hover::after,
.ride-request-contact:hover::after {
  transform: translate(3px, -2px) rotate(8deg);
}

.dbfTourLayer .dbfTourChoose:active,
.dbfTourLayer .dbfTourPrimary:active,
.dbfTicketLayer .dbfTicketPrimary:active,
.dbfDiningLayer .dbfDiningPrimary:active,
.dbfDiningLayer .dbfDiningSubmit:active,
.nearby-map-profile:active,
.city-service-submit:active,
.ride-request-contact:active {
  transform: translateY(0) scale(.98);
}

/* Keep MapLibre's navigation control neutral. The global button rules above
   are for the product UI and must never recolor map zoom/compass controls. */
.maplibregl-ctrl-group {
  overflow: hidden;
  border: 1px solid rgba(0, 0, 0, .15);
  border-radius: 4px;
  background: #fff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .18);
}

.maplibregl-ctrl-group button,
.maplibregl-ctrl-group button:hover,
.maplibregl-ctrl-group button:focus,
.maplibregl-ctrl-group button:focus-visible {
  width: 29px;
  height: 29px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background-color: #fff;
  color: #333;
  box-shadow: none;
  transform: none;
}

.maplibregl-ctrl-group button:hover {
  transform: scale(1.04);
}

.maplibregl-ctrl-group button:focus-visible {
  outline: 2px solid #0eaaa7;
  outline-offset: -2px;
}

.maplibregl-ctrl-group button + button {
  border-top: 1px solid #ddd;
}

.dbfTourFilter.active,
.dbfTicketFilter.is-active,
.dbfDiningFilter.is-active {
  background: #0eaaa7;
  border-color: #0eaaa7;
  box-shadow: 0 7px 18px rgba(14, 170, 167, .2);
}

.dbfNearbyField input:focus,
.dbfNearbyField select:focus,
.dbfNearbyField textarea:focus,
.dbfTourField input:focus,
.dbfTourField select:focus,
.dbfTourField textarea:focus,
.dbfTicketSearch input:focus,
.dbfTicketField input:focus,
.dbfTicketField textarea:focus,
.dbfTicketField select:focus,
.dbfDiningField input:focus,
.dbfDiningField textarea:focus,
.dbfDiningField select:focus {
  border-color: var(--dbf-coastal-teal);
  box-shadow: 0 0 0 4px rgba(14, 170, 167, .13);
}

.dbfNearbyLayer button:focus-visible,
.dbfTourLayer button:focus-visible,
.dbfTicketLayer button:focus-visible,
.dbfDiningLayer button:focus-visible,
.city-service-sheet button:focus-visible {
  outline: 3px solid rgba(14, 170, 167, .24);
  outline-offset: 3px;
}

/* Chat backdrop: a calm Da Nang panorama gives the service sheet a distinct
   destination feel while the wash layer keeps every interactive label clear. */
.city-chat-sheet {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: #e9f8f8;
}

.city-chat-backdrop,
.city-chat-backdrop-image,
.city-chat-backdrop-wash {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.city-chat-backdrop {
  z-index: 0;
  overflow: hidden;
}

.city-chat-backdrop-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 48%;
  filter: saturate(.92) brightness(1.05);
  transform: scale(1.03);
}

.city-chat-backdrop-wash {
  background:
    linear-gradient(180deg, rgba(226, 248, 250, .26) 0%, rgba(239, 251, 250, .6) 34%, rgba(248, 253, 252, .88) 68%, rgba(248, 253, 252, .98) 100%),
    linear-gradient(90deg, rgba(247, 253, 252, .18), rgba(247, 253, 252, .04) 58%, rgba(247, 253, 252, .35));
}

.city-chat-tagline {
  position: absolute;
  z-index: 3;
  top: 19px;
  right: 69px;
  display: grid;
  max-width: 205px;
  color: #236b72;
  font-family: "Segoe Script", "Brush Script MT", cursive;
  font-size: 17px;
  font-style: italic;
  font-weight: 600;
  line-height: 1.08;
  text-align: right;
  text-shadow: 0 1px 0 rgba(255, 255, 255, .8);
  transform: rotate(-3deg);
  pointer-events: none;
}

.city-chat-tagline span:last-child::after {
  content: "";
  display: block;
  width: 88px;
  height: 7px;
  margin: 4px 0 0 auto;
  border-top: 2px solid rgba(236, 103, 145, .75);
  border-radius: 50%;
  transform: rotate(-4deg);
}

.city-chat-sheet .city-service-header,
.city-chat-sheet .city-service-body {
  position: relative;
  z-index: 2;
  background: transparent;
}

.city-chat-sheet .city-service-header {
  min-height: 72px;
  padding-right: 222px;
  background: linear-gradient(135deg, rgba(255, 255, 255, .9), rgba(235, 250, 248, .68));
  border-bottom-color: rgba(132, 205, 202, .38);
}

.city-chat-sheet .city-chat-header-avatar {
  overflow: hidden;
  padding: 3px;
  background: linear-gradient(145deg, #ddfaf4, #e9e4ff);
}

.city-chat-sheet .city-chat-header-avatar img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  object-position: center 35%;
  transform: scale(1.12);
  filter: drop-shadow(0 5px 8px rgba(8, 127, 131, .16));
}

.city-chat-sheet .city-service-close {
  position: absolute;
  z-index: 5;
  top: 16px;
  right: 16px;
  margin-left: 0;
  background: rgba(255, 255, 255, .78);
  color: #28616a;
  box-shadow: 0 6px 16px rgba(30, 93, 101, .08);
}

.city-chat-sheet .city-service-close:hover {
  transform: rotate(5deg);
}

.city-chat-sheet .city-service-body {
  padding: clamp(15px, 2.6vw, 24px);
}

.city-chat-sheet .city-chat-tabs {
  margin-bottom: 15px;
  border-color: rgba(126, 199, 198, .42);
  background: rgba(239, 252, 252, .72);
  box-shadow: 0 10px 22px rgba(26, 105, 113, .08);
  backdrop-filter: blur(12px);
}

.city-chat-sheet .city-chat-tabs button {
  color: #395e67;
  font-weight: 800;
  transition: transform .25s ease, background-color .25s ease, color .25s ease, box-shadow .25s ease;
}

.city-chat-sheet .city-chat-tabs button:hover {
  transform: translateY(-1px);
}

.city-chat-sheet .city-chat-tabs button.active {
  background: linear-gradient(135deg, #1abbb2, #087f83);
  color: #fff;
  box-shadow: 0 9px 18px rgba(8, 127, 131, .24);
}

.city-chat-sheet #cityChatAssistantView {
  padding: 12px;
  border: 1px solid rgba(132, 205, 202, .4);
  border-radius: 21px;
  background: rgba(255, 255, 255, .54);
  box-shadow: 0 14px 30px rgba(24, 105, 111, .1);
  backdrop-filter: blur(14px);
}

.city-chat-hero {
  display: grid;
  grid-template-columns: 138px minmax(0, 1fr);
  align-items: center;
  min-height: 143px;
  padding: 8px 14px 8px 5px;
  border: 1px solid rgba(137, 204, 203, .42);
  border-radius: 18px;
  background: linear-gradient(110deg, rgba(224, 249, 248, .86), rgba(255, 255, 255, .74));
  box-shadow: 0 8px 18px rgba(35, 110, 116, .06);
}

.city-chat-hero-art {
  width: 138px;
  height: 143px;
  object-fit: contain;
  object-position: center;
  filter: drop-shadow(0 9px 12px rgba(8, 127, 131, .14));
}

.city-chat-hero-copy {
  min-width: 0;
  padding: 4px 4px 4px 0;
}

.city-chat-hero-copy strong {
  display: block;
  margin-bottom: 5px;
  color: #173f49;
  font-size: 18px;
  font-weight: 900;
  letter-spacing: -.02em;
}

.city-chat-hero-copy p {
  margin: 0;
  color: #315d66;
  font-size: 13px;
  line-height: 1.45;
}

.city-chat-hero-copy small {
  display: block;
  margin-top: 6px;
  color: #68838a;
  font-size: 12px;
}

.city-chat-sheet .city-chat-messages {
  min-height: 0;
  max-height: 148px;
  margin-top: 9px;
  padding: 3px;
}

.city-chat-sheet .city-chat-messages .city-chat-message:first-child {
  display: none;
}

.city-chat-sheet .city-chat-message {
  border-color: rgba(142, 203, 203, .46);
  background: rgba(255, 255, 255, .9);
  color: #234e59;
  box-shadow: 0 7px 16px rgba(37, 107, 113, .07);
}

.city-chat-sheet .city-chat-message.user {
  border-color: rgba(242, 159, 179, .55);
  background: rgba(255, 239, 244, .9);
  color: #7a3955;
}

.city-chat-sheet .city-chat-quick button {
  display: grid;
  grid-template-columns: 37px minmax(0, 1fr) auto;
  align-items: center;
  gap: 9px;
  min-height: 58px;
  border-color: rgba(137, 204, 203, .55);
  background: rgba(255, 255, 255, .82);
  color: #1d5a65;
  font-weight: 800;
  box-shadow: 0 5px 12px rgba(35, 110, 116, .06);
  transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease, background-color .25s ease;
}

.city-chat-sheet .city-chat-quick button:hover {
  box-shadow: 0 9px 18px rgba(183, 92, 124, .14);
  transform: translateY(-2px);
}

.city-chat-quick-icon {
  display: grid;
  width: 37px;
  height: 37px;
  place-items: center;
  border-radius: 12px;
  background: #e1f7f4;
  color: #079b9b;
  font-size: 21px;
  font-weight: 900;
  line-height: 1;
}

.city-chat-quick-icon img {
  display: block;
  width: 25px;
  height: 25px;
  object-fit: contain;
}

.city-chat-quick-icon[data-topic="search"],
.city-chat-quick-icon[data-topic="location"] {
  background: #dff7f8;
  color: #0c9c9f;
}

.city-chat-quick-icon[data-topic="buddy"] {
  background: #efe6ff;
  color: #7251c5;
}

.city-chat-quick-icon[data-topic="ride"] {
  background: #fff0d8;
  color: #dd7d22;
  font-size: 19px;
}

.city-chat-quick-icon[data-topic="review"] {
  background: #ffe4ee;
  color: #df5c89;
}

.city-chat-quick-icon[data-topic="language"] {
  background: #e2f5f5;
  color: #138d91;
  font-size: 15px;
}

.city-chat-quick-copy {
  display: grid;
  min-width: 0;
  gap: 2px;
  text-align: left;
}

.city-chat-quick-copy strong {
  overflow: hidden;
  color: #234e59;
  font-size: 12px;
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.city-chat-quick-copy small {
  overflow: hidden;
  color: #7a9297;
  font-size: 10px;
  font-weight: 500;
  line-height: 1.2;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.city-chat-quick-arrow {
  display: grid;
  width: 22px;
  height: 22px;
  flex: 0 0 22px;
  place-items: center;
  transition: transform .25s ease, color .25s ease;
}

.city-chat-quick-arrow img {
  display: block;
  width: 19px;
  height: 19px;
  object-fit: contain;
}

.city-chat-sheet .city-chat-quick button:hover .city-chat-quick-arrow {
  transform: translateX(3px);
}

.city-chat-sheet .city-chat-quick button:active,
.city-chat-sheet .city-chat-compose button:active,
.city-chat-sheet .city-chat-live button:active {
  transform: scale(.98);
}

.city-chat-sheet .city-chat-compose {
  margin-top: 16px;
}

.city-chat-sheet .city-chat-compose input {
  border-color: rgba(111, 190, 190, .72);
  background: rgba(255, 255, 255, .9);
}

.city-chat-sheet .city-chat-compose button,
.city-chat-sheet .city-chat-live button {
  border: 0;
  border-radius: 13px;
  background: linear-gradient(135deg, #1abbb2, #087f83);
  color: #fff;
  font-weight: 900;
  box-shadow: 0 11px 23px rgba(8, 127, 131, .2);
  transition: transform .25s ease, box-shadow .25s ease, filter .25s ease;
}

.city-chat-sheet .city-chat-compose button:hover,
.city-chat-sheet .city-chat-live button:hover {
  box-shadow: 0 14px 27px rgba(8, 127, 131, .28);
  transform: translateY(-2px);
}

.city-chat-sheet .city-chat-live {
  display: grid;
  min-height: 278px;
  place-content: center;
  justify-items: center;
  padding: 24px;
  border-color: rgba(132, 205, 202, .5);
  background: rgba(255, 255, 255, .8);
  color: #315d66;
  text-align: center;
  box-shadow: 0 14px 30px rgba(24, 105, 111, .1);
  backdrop-filter: blur(14px);
}

.city-chat-sheet .city-chat-live::before {
  display: none;
}

.city-chat-live-art {
  width: min(235px, 76%);
  height: 142px;
  margin: -8px auto 3px;
  object-fit: contain;
  object-position: center;
  filter: drop-shadow(0 10px 13px rgba(20, 126, 139, .13));
}

.city-chat-live h3 {
  margin: 0 0 6px;
  color: #173f49;
  font-size: 18px;
  font-weight: 900;
  letter-spacing: -.02em;
}

.city-chat-live-benefits {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
  width: min(100%, 470px);
  margin-top: 22px;
}

.city-chat-live-benefits > div {
  display: grid;
  justify-items: center;
  gap: 2px;
  text-align: center;
}

.city-chat-live-benefits > div > span {
  display: grid;
  width: 28px;
  height: 28px;
  margin-bottom: 3px;
  place-items: center;
  border-radius: 50%;
  background: #e1f7f4;
  color: #08a49f;
  font-size: 19px;
  font-weight: 900;
}

.city-chat-live-benefits > div:nth-child(2) > span {
  background: #e8e6ff;
  color: #6557c3;
}

.city-chat-live-benefits > div:nth-child(3) > span {
  background: #ffe5ee;
  color: #e2638c;
}

.city-chat-live-benefits strong {
  color: #315d66;
  font-size: 10px;
  font-weight: 900;
}

.city-chat-live-benefits small {
  color: #7d969b;
  font-size: 9px;
}

.city-chat-sheet .city-chat-live p {
  max-width: 380px;
  margin: 0;
}

.city-chat-sheet .city-chat-live button {
  min-width: min(260px, 100%);
  padding: 12px 18px;
}

@media (max-width: 720px) {
  .city-chat-tagline {
    top: 15px;
    right: 57px;
    max-width: 142px;
    font-size: 11px;
  }

  .city-chat-tagline span:last-child::after {
    width: 62px;
    height: 4px;
    margin-top: 2px;
  }

  .city-chat-sheet .city-service-header {
    min-height: 64px;
    padding-right: 156px;
  }

  .city-chat-sheet .city-service-header h2 {
    font-size: 18px;
  }

  .city-chat-sheet .city-service-body {
    max-height: calc(100vh - 105px);
    max-height: calc(100svh - 105px);
    padding: 12px;
  }

  .city-chat-sheet #cityChatAssistantView {
    padding: 9px;
  }

  .city-chat-sheet .city-chat-messages {
    min-height: 148px;
  }

  .city-chat-sheet .city-chat-live {
    min-height: 250px;
    padding: 18px;
  }
}

@media (max-width: 720px) {
  .city-chat-sheet .city-service-close {
    top: 12px;
    right: 12px;
  }

  .city-chat-sheet .city-chat-quick {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .city-chat-hero {
    grid-template-columns: 102px minmax(0, 1fr);
    min-height: 122px;
    padding-right: 8px;
  }

  .city-chat-hero-art {
    width: 102px;
    height: 122px;
  }

  .city-chat-hero-copy strong {
    font-size: 16px;
  }

  .city-chat-hero-copy p {
    font-size: 12px;
  }

  .city-chat-sheet .city-chat-messages {
    min-height: 0;
    max-height: 120px;
  }

  .city-chat-quick button {
    grid-template-columns: 31px minmax(0, 1fr) auto;
    gap: 6px;
    min-height: 53px;
    padding: 7px;
  }

  .city-chat-quick-icon {
    width: 31px;
    height: 31px;
    border-radius: 10px;
    font-size: 17px;
  }

  .city-chat-quick-copy strong {
    font-size: 10px;
  }

  .city-chat-quick-copy small {
    font-size: 8px;
  }

  .city-chat-live-art {
    height: 124px;
  }

  .city-chat-live h3 {
    font-size: 16px;
  }

  .city-chat-live-benefits {
    gap: 7px;
    margin-top: 16px;
  }
}

@media (max-width: 380px) {
  .city-chat-sheet .city-chat-quick {
    grid-template-columns: 1fr;
  }
}

/* VIP ride sheet: the booking flow is laid out like a calm concierge desk —
   clear numbered sections, a destination banner, and one obvious final action. */
.city-ride-sheet {
  width: min(1160px, 100%);
  height: min(920px, calc(100vh - 34px));
  max-height: min(920px, calc(100vh - 34px));
  display: flex;
  flex-direction: column;
  border-color: rgba(14, 170, 167, .28);
  background: linear-gradient(145deg, rgba(250, 255, 254, .98), rgba(238, 250, 249, .96));
}

.city-ride-header {
  position: relative;
  box-sizing: border-box;
  flex: 0 0 auto;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  min-height: 92px;
  padding: 16px 280px 16px 26px;
  overflow: hidden;
  background: linear-gradient(110deg, rgba(255, 255, 255, .98) 0%, rgba(239, 252, 249, .9) 58%, rgba(222, 247, 246, .74) 100%);
}

.city-ride-header > *:not(.city-ride-header-scene) {
  position: relative;
  z-index: 2;
}

.city-ride-header-icon {
  display: grid;
  width: 78px;
  height: 78px;
  margin-right: 15px;
  place-items: center;
  border: 1px solid rgba(255, 255, 255, .9);
  border-radius: 24px;
  background: linear-gradient(145deg, #e7fbf7, #f6f0ff);
  box-shadow: 0 0 0 6px rgba(14, 170, 167, .07), 0 12px 24px rgba(14, 121, 129, .14);
}

.city-ride-header-icon img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  transform: scale(1.12);
  filter: drop-shadow(0 8px 9px rgba(9, 70, 83, .17));
}

.city-ride-header .city-service-heading {
  min-width: 0;
}

.city-ride-header h2 {
  margin: 0 0 5px;
  color: var(--dbf-coastal-ink);
  font-size: 28px;
  font-weight: 900;
  letter-spacing: -.035em;
}

.city-ride-header p {
  color: #668087;
  font-size: 14px;
}

.city-ride-header-scene {
  position: absolute;
  z-index: 1;
  inset: 0 0 0 auto;
  width: 48%;
  overflow: hidden;
  pointer-events: none;
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 18%, #000 100%);
  mask-image: linear-gradient(90deg, transparent 0%, #000 18%, #000 100%);
}

.city-ride-header-scene::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(240, 252, 250, .98) 0%, rgba(240, 252, 250, .3) 30%, transparent 75%), linear-gradient(180deg, rgba(255, 255, 255, .08), rgba(224, 247, 244, .36));
}

.city-ride-header-scene img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  opacity: .95;
}

.city-ride-header-scene span {
  position: absolute;
  z-index: 2;
  top: 23px;
  right: 76px;
  max-width: 190px;
  color: #28737a;
  font-family: "Segoe Script", "Brush Script MT", cursive;
  font-size: 17px;
  font-style: italic;
  line-height: 1.08;
  text-align: center;
  text-shadow: 0 1px 0 rgba(255, 255, 255, .85);
  transform: rotate(-3deg);
}

.city-ride-header-scene strong {
  display: block;
  margin-top: 3px;
  font-family: inherit;
  font-size: 10px;
  font-weight: 700;
}

.city-ride-header .city-service-close {
  position: absolute;
  z-index: 4;
  top: 18px;
  right: 20px;
  margin: 0;
  background: rgba(255, 255, 255, .86);
  color: #287078;
  box-shadow: 0 7px 16px rgba(21, 93, 101, .1);
}

.city-ride-header .city-service-close:hover {
  transform: rotate(5deg);
}

.city-ride-body {
  box-sizing: border-box;
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
  padding: 16px 28px 25px;
  background: radial-gradient(circle at 8% 20%, rgba(89, 207, 198, .1), transparent 28%), linear-gradient(180deg, rgba(231, 249, 248, .45), rgba(250, 255, 254, .72));
}

.city-ride-notice {
  display: flex;
  align-items: center;
  gap: 13px;
  margin-bottom: 14px;
  padding: 11px 15px;
  border-color: rgba(105, 199, 190, .44);
  background: linear-gradient(110deg, rgba(229, 250, 247, .96), rgba(248, 255, 253, .88));
  box-shadow: 0 8px 17px rgba(24, 105, 111, .06);
}

.city-ride-notice-icon {
  display: grid;
  flex: 0 0 38px;
  width: 38px;
  height: 38px;
  place-items: center;
  border-radius: 13px;
  background: linear-gradient(145deg, #0fa9a1, #087f83);
  color: #fff;
  font-size: 22px;
  font-weight: 900;
  box-shadow: 0 7px 14px rgba(8, 127, 131, .2);
}

.city-ride-notice strong {
  margin-bottom: 2px;
}

.city-ride-form {
  gap: 14px;
}

.city-ride-form-layout {
  display: grid;
  grid-template-columns: 1fr;
  align-items: start;
  gap: 14px;
}

.city-ride-main-column,
.city-ride-side-column {
  display: grid;
  gap: 14px;
  min-width: 0;
}

.city-ride-main-column {
  display: contents;
}

.city-ride-route-heading {
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
  padding: 2px 3px 0;
}

.city-ride-route-heading > span {
  display: grid;
  flex: 0 0 34px;
  width: 34px;
  height: 34px;
  place-items: center;
  border-radius: 50%;
  background: linear-gradient(145deg, #12aca6, #087f83);
  color: #fff;
  font-size: 16px;
  font-weight: 900;
  box-shadow: 0 6px 13px rgba(8, 127, 131, .18);
}

.city-ride-route-heading h3 {
  margin: 0;
  color: #173f49;
  font-size: 19px;
  font-weight: 900;
  letter-spacing: -.025em;
}

.city-ride-route-heading p {
  margin: 2px 0 0;
  color: #6b858b;
  font-size: 12px;
  line-height: 1.35;
}

.city-ride-default-badge {
  display: inline-flex;
  align-items: center;
  margin-left: 5px;
  padding: 5px 9px;
  border-radius: 999px;
  background: #dff7f4;
  color: #0e9996;
  font-size: 11px;
  font-style: normal;
  font-weight: 900;
  vertical-align: middle;
}

.city-ride-form-section {
  min-width: 0;
  padding: 13px 14px 15px;
  border: 1px solid rgba(137, 204, 203, .46);
  border-radius: 19px;
  background: rgba(255, 255, 255, .79);
  box-shadow: 0 10px 22px rgba(35, 110, 116, .07), inset 0 1px 0 rgba(255, 255, 255, .94);
  backdrop-filter: blur(12px);
}

.city-ride-section-heading {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 12px;
}

.city-ride-section-heading > span {
  display: grid;
  flex: 0 0 34px;
  width: 34px;
  height: 34px;
  place-items: center;
  border-radius: 50%;
  background: linear-gradient(145deg, #12aca6, #087f83);
  color: #fff;
  font-size: 16px;
  font-weight: 900;
  box-shadow: 0 6px 13px rgba(8, 127, 131, .18);
}

.city-ride-section-heading h3 {
  margin: 0;
  color: #173f49;
  font-size: 19px;
  font-weight: 900;
  letter-spacing: -.025em;
}

.city-ride-form .city-service-row {
  gap: 12px;
}

.city-ride-form label {
  color: #315d66;
}

.city-ride-field-group {
  display: grid;
  gap: 5px;
  color: #315d66;
  font-size: 12px;
  font-weight: 800;
}

.city-ride-form input,
.city-ride-form textarea {
  border-color: rgba(157, 209, 207, .66);
  background: rgba(255, 255, 255, .88);
  color: #173f49;
}

.city-ride-input-wrap,
.city-ride-textarea-wrap {
  position: relative;
  display: flex;
  min-width: 0;
  align-items: center;
}

.city-ride-input-wrap .city-ride-field-icon,
.city-ride-textarea-wrap .city-ride-field-icon {
  position: absolute;
  z-index: 1;
  left: 10px;
  display: grid;
  width: 29px;
  height: 29px;
  place-items: center;
  border-radius: 9px;
  background: #e5f8f5;
  color: #0d9b9b;
  font-size: 16px;
  font-weight: 900;
  line-height: 1;
  pointer-events: none;
}

.city-ride-input-wrap input {
  padding-left: 48px;
}

.city-ride-textarea-wrap {
  align-items: flex-start;
}

.city-ride-textarea-wrap .city-ride-field-icon {
  top: 10px;
}

.city-ride-textarea-wrap textarea {
  min-height: 110px;
  padding-left: 48px;
}

.city-ride-form .city-service-field-with-action {
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: stretch;
  gap: 8px;
}

.city-ride-form .city-service-field-with-action .city-ride-input-wrap {
  min-width: 0;
}

.city-ride-form .city-service-field-with-action > button,
.city-ride-form .city-ride-address-tools > button,
.city-ride-coordinate-actions button {
  border: 1px solid rgba(115, 196, 191, .56);
  border-radius: 11px;
  background: linear-gradient(145deg, rgba(238, 252, 249, .98), rgba(221, 246, 243, .95));
  color: #087f83;
  font-size: 12px;
  font-weight: 900;
  transition: transform .23s ease, border-color .23s ease, background-color .23s ease, box-shadow .23s ease;
}

.city-ride-form .city-service-field-with-action > button:hover,
.city-ride-form .city-ride-address-tools > button:hover,
.city-ride-coordinate-actions button:hover {
  box-shadow: 0 7px 15px rgba(183, 92, 124, .13);
  transform: translateY(-2px);
}

/* These controls have explicit, purpose-built image icons in their markup. */
#cityRideLocation::before,
#cityRideAddressSearch::before,
#cityRideCoordinateApply::before,
#cityRideMapPick::before,
#cityRideDropoffLocation::before,
#cityRideDropoffAddressSearch::before,
#cityRideDropoffMapPick::before {
  display: none !important;
  content: none !important;
}

/* Keep older coordinate-picker selectors from introducing duplicate glyphs. */
.city-ride-form .city-ride-address-tools > button {
  justify-self: stretch;
  padding: 10px 12px;
}

.city-ride-coordinate-tools {
  padding: 10px;
  border-color: rgba(137, 204, 203, .5);
  border-radius: 14px;
  background: rgba(238, 251, 249, .78);
}

.city-ride-coordinate-grid {
  gap: 9px;
}

.city-ride-coordinate-grid input {
  padding-left: 42px;
}

.city-ride-coordinate-actions {
  gap: 8px;
}

.city-ride-coordinate-actions button {
  min-height: 38px;
}

.city-ride-trip-section {
  display: grid;
  gap: 12px;
}

.city-ride-trip-section[hidden] {
  display: none;
}

.city-ride-form .city-ride-link-tools {
  display: none;
}

.city-ride-form .city-ride-location-actions {
  grid-template-columns: 1fr;
}

.city-ride-address-status:empty {
  display: none;
}

.city-ride-trip-section .city-ride-section-heading {
  margin-bottom: 0;
}

.city-passenger-control {
  width: max-content;
  border-color: rgba(137, 204, 203, .62);
  border-radius: 12px;
  background: rgba(255, 255, 255, .92);
}

.city-passenger-control button {
  background: #eefaf8;
  color: #087f83;
}

.city-passenger-control button:hover {
  transform: translateY(-1px);
}

.city-ride-share {
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 14px;
  padding: 12px 15px;
  border-color: rgba(105, 199, 190, .5);
  background: linear-gradient(110deg, rgba(231, 251, 248, .95), rgba(248, 255, 253, .9));
}

.city-ride-share-main {
  min-width: 0;
}

.city-ride-share small {
  display: block;
  padding-left: 27px;
}

.city-ride-share-security {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 160px;
  padding-left: 14px;
  border-left: 1px solid rgba(105, 171, 174, .32);
  color: #668087;
  font-size: 11px;
  line-height: 1.35;
}

.city-ride-share-security > span:first-child {
  display: grid;
  width: 32px;
  height: 32px;
  place-items: center;
  border-radius: 50%;
  background: #dff7f4;
  color: #0b9998;
  font-size: 16px;
}

.city-ride-share-security strong {
  color: #315d66;
}

.city-ride-submit {
  min-height: 52px;
  font-size: 15px;
  font-weight: 900;
  letter-spacing: -.01em;
}

.city-ride-submit::after {
  content: "↗";
  display: inline-block;
  margin-left: 7px;
  font-size: 18px;
  transition: transform .25s ease;
}

.city-ride-submit:hover::after {
  transform: translate(3px, -2px);
}

@media (max-width: 900px) {
  .city-ride-form-layout {
    grid-template-columns: 1fr;
  }

  .city-ride-side-column {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 720px) {
  .city-ride-sheet {
    height: calc(100vh - 16px);
    height: calc(100svh - 16px);
    max-height: calc(100vh - 16px);
    max-height: calc(100svh - 16px);
    border-radius: 20px 20px 16px 16px;
  }

  .city-ride-header {
    min-height: 74px;
    padding: 11px 154px 11px 14px;
  }

  .city-ride-header-icon {
    width: 57px;
    height: 57px;
    margin-right: 10px;
    border-radius: 17px;
  }

  .city-ride-header h2 {
    font-size: 20px;
  }

  .city-ride-header p {
    font-size: 11px;
  }

  .city-ride-header-scene {
    width: 55%;
  }

  .city-ride-header-scene span {
    top: 15px;
    right: 51px;
    max-width: 105px;
    font-size: 11px;
  }

  .city-ride-header-scene strong {
    font-size: 7px;
  }

  .city-ride-header .city-service-close {
    top: 12px;
    right: 12px;
  }

  .city-ride-body {
    max-height: calc(100vh - 100px);
    max-height: calc(100svh - 100px);
    padding: 10px;
  }

  .city-ride-notice {
    align-items: flex-start;
    padding: 10px;
  }

  .city-ride-notice-icon {
    flex-basis: 32px;
    width: 32px;
    height: 32px;
  }

  .city-ride-form-layout,
  .city-ride-main-column,
  .city-ride-side-column {
    gap: 10px;
  }

  .city-ride-form-section {
    padding: 11px 10px 12px;
    border-radius: 16px;
  }

  .city-ride-section-heading h3 {
    font-size: 16px;
  }

  .city-ride-route-heading h3 {
    font-size: 16px;
  }

  .city-ride-route-heading p {
    font-size: 11px;
  }

  .city-ride-default-badge {
    padding: 4px 7px;
    font-size: 10px;
  }

  .city-ride-form .city-service-row,
  .city-ride-form .city-service-field-with-action {
    grid-template-columns: 1fr;
  }

  .city-ride-form .city-service-field-with-action > button {
    min-height: 42px;
  }

  .city-ride-share {
    grid-template-columns: 1fr;
  }

  .city-ride-share-security {
    min-width: 0;
    padding: 10px 0 0;
    border-top: 1px solid rgba(105, 171, 174, .32);
    border-left: 0;
  }
}

@media (max-width: 480px) {
  .city-ride-header-scene {
    opacity: .55;
  }

  .city-ride-header {
    padding-right: 118px;
  }

  .city-ride-header-scene span {
    display: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .city-bottom-nav button,
  .city-action-menu button,
  .city-service-sheet button,
  .dbfNearbyLayer button,
  .dbfTourLayer button,
  .dbfTicketLayer button,
  .dbfDiningLayer button {
    transition: none;
  }

  .dbfTourCard,
  .dbfTicketCard,
  .dbfDiningCard,
  .dbfTourCard::before,
  .dbfTicketCard::before,
  .dbfDiningCard::before,
  .dbfTourCardImage,
  .dbfTicketCardMedia img,
  .dbfDiningCardMedia img,
  .dbfTourChoose::after,
  .dbfTourPrimary::after,
  .dbfTicketPrimary::after,
  .dbfDiningPrimary::after,
  .dbfDiningSubmit::after,
  .nearby-map-profile::after,
  .city-service-submit::after,
  .ride-request-contact::after {
    transition: none;
    animation: none;
  }
}

/* Keep the map fully reachable while a map-based picker is active. The
   picker itself remains visible above the map and normal controls return
   after confirmation or cancellation. */
body.dbf-map-picking .panel,
body.dbf-map-picking #cityWeatherCard,
body.dbf-map-picking #nearbyRadarHud,
body.dbf-map-picking .city-bottom-nav,
body.dbf-map-picking .city-action-menu,
body.dbf-map-picking .city-nav-status {
  visibility: hidden !important;
  pointer-events: none !important;
}

body.dbf-map-picking .city-ride-map-picker {
  visibility: visible !important;
  pointer-events: auto !important;
}

@media (max-width: 720px) {
  .panel-toggle {
    z-index: 5;
    cursor: pointer;
    pointer-events: auto;
    touch-action: manipulation;
  }
}

/* Compact ride route: one actionable row per point. */
.city-ride-route-heading {
  gap: 8px;
  padding: 0 2px;
}

.city-ride-route-heading > span,
.city-ride-section-heading > span {
  width: 30px;
  height: 30px;
  flex-basis: 30px;
  font-size: 14px;
}

.city-ride-route-heading h3 {
  font-size: 15px;
}

.city-ride-route-heading p,
.city-ride-default-badge {
  display: none;
}

.city-ride-form-layout {
  gap: 8px;
}

.city-ride-pickup-section,
.city-ride-trip-section {
  display: grid;
  grid-template-columns: 30px minmax(0, 1fr) auto;
  align-items: center;
  gap: 7px;
  padding: 7px 8px;
  border-radius: 14px;
}

.city-ride-pickup-section .city-ride-section-heading,
.city-ride-trip-section .city-ride-section-heading,
.city-ride-pickup-section .city-ride-field-group,
.city-ride-trip-section .city-ride-field-group {
  display: contents;
}

.city-ride-pickup-section .city-ride-section-heading > span,
.city-ride-trip-section .city-ride-section-heading > span {
  grid-column: 1;
  grid-row: 1;
}

.city-ride-pickup-section .city-ride-section-heading h3,
.city-ride-trip-section .city-ride-section-heading h3,
.city-ride-pickup-section .city-ride-field-group > span:first-child,
.city-ride-trip-section .city-ride-field-group > span:first-child {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

.city-ride-pickup-section .city-ride-input-wrap,
.city-ride-trip-section .city-ride-input-wrap {
  grid-column: 2;
  grid-row: 1;
  min-width: 0;
}

.city-ride-pickup-section .city-ride-location-actions,
.city-ride-trip-section .city-ride-location-actions {
  grid-column: 3;
  grid-row: 1;
  min-width: 92px;
  margin-top: 0;
}

.city-ride-pickup-section .city-ride-location-actions button:last-child,
.city-ride-trip-section .city-ride-location-actions button:last-child {
  min-height: 38px;
  padding: 7px 9px;
  font-size: 10px;
}

.city-ride-pickup-section .city-ride-address-status,
.city-ride-trip-section .city-ride-address-status {
  grid-column: 2 / -1;
  grid-row: 2;
}

.city-ride-stop-card {
  display: grid;
  grid-template-columns: 30px minmax(0, 1fr) auto auto;
  align-items: center;
  gap: 7px;
  padding: 7px 8px;
  border-radius: 14px;
}

.city-ride-stop-card-head {
  display: contents;
}

.city-ride-stop-card-head > span {
  grid-column: 1;
  grid-row: 1;
  display: grid;
  width: 30px;
  height: 30px;
  place-items: center;
  border-radius: 50%;
  background: linear-gradient(145deg, #12aca6, #087f83);
  color: #fff;
  font-size: 12px;
  font-weight: 900;
  overflow: hidden;
}

.city-ride-stop-card-head > button {
  grid-column: 4;
  grid-row: 1;
  margin: 0;
}

.city-ride-stop-card > .city-ride-input-wrap {
  grid-column: 2;
  grid-row: 1;
}

.city-ride-stop-card > .city-ride-location-actions {
  grid-column: 3;
  grid-row: 1;
  min-width: 92px;
  margin-top: 0;
}

.city-ride-stop-card > .city-ride-address-status {
  grid-column: 2 / -1;
  grid-row: 2;
}

.city-ride-add-stop {
  min-height: 38px;
  border: 1px dashed #42bcb5 !important;
  border-radius: 12px;
  background: #f4fffd !important;
  color: #087f83 !important;
  font-size: 12px;
  font-weight: 900;
}

.city-ride-add-stop:hover {
  transform: translateY(-1px);
}

/* The collapsed weather control stays small; hourly detail is one tap away. */
.city-weather-card {
  width: min(264px, calc(100vw - 24px));
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  gap: 7px;
  padding: 7px 8px;
  border-radius: 14px;
}
.city-weather-summary-hit { grid-column: 1 / span 2; gap: 8px; }
.city-weather-icon { width: 34px; height: 34px; border-radius: 11px; }
.city-weather-copy { gap: 1px; }
.city-weather-copy strong { font-size: 10px; }
.city-weather-copy > span { font-size: 12px; }
.city-weather-copy small { font-size: 9px; }
.city-weather-card.is-compact .city-weather-copy strong { display: none; }
.city-weather-card.is-compact .city-weather-refresh { display: none; }
.city-weather-toggle { display: grid; width: 26px; height: 26px; font-size: 15px; }
.city-weather-refresh { width: 26px; height: 26px; }
.city-weather-details { gap: 9px; }
.city-weather-near-term { display: grid; gap: 6px; }
.city-weather-near-term-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; }
.city-weather-near-term-hour {
  display: grid;
  grid-template-columns: auto 18px minmax(0, 1fr) auto;
  align-items: center;
  gap: 4px 6px;
  padding: 7px;
  border: 1px solid rgba(14, 170, 167, .14);
  border-radius: 10px;
  background: rgba(239, 250, 249, .72);
  color: #2f6d74;
  font-size: 9px;
}
.city-weather-near-term-hour strong { color: var(--dbf-coastal-ink); font-size: 10px; }
.city-weather-near-term-hour img { display: block; width: 18px; height: 18px; object-fit: contain; }
.city-weather-near-term-hour b { color: var(--dbf-coastal-ink); font-size: 10px; }
.city-weather-near-term-hour small { grid-column: 2 / -1; color: var(--dbf-coastal-deep); font-size: 8px; font-weight: 800; }
.city-weather-plan { width: min(290px, calc(100vw - 24px)); padding: 8px 9px; border-radius: 13px 13px 13px 5px; }
.city-weather-bot-avatar { width: 24px; height: 24px; }
.city-weather-bot-copy span { font-size: 10px; }

@media (max-width: 720px) {
  .city-weather-card {
    left: 10px;
    right: auto;
    bottom: calc(max(8px, env(safe-area-inset-bottom)) + 84px);
    width: min(250px, calc(100vw - 20px));
    grid-template-columns: auto minmax(0, 1fr) auto;
    gap: 6px;
    padding: 6px 7px;
  }
  .city-weather-summary-hit { grid-column: 1 / span 2; }
  .city-weather-toggle { width: 24px; height: 24px; }
  .city-weather-card.is-expanded {
    width: min(320px, calc(100vw - 20px));
    max-height: min(440px, calc(100dvh - 112px));
  }
  .city-weather-card.is-expanded .city-weather-refresh { display: grid; }
  .city-weather-plan { width: min(270px, calc(100vw - 20px)); }
  .city-weather-bot-avatar { display: none; }
}
