*, ::before, ::after {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

::backdrop {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

/*
! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
*/

/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/

*,
::before,
::after {
  box-sizing: border-box;
  /* 1 */
  border-width: 0;
  /* 2 */
  border-style: solid;
  /* 2 */
  border-color: #e5e7eb;
  /* 2 */
}

::before,
::after {
  --tw-content: '';
}

/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
7. Disable tap highlights on iOS
*/

html,
:host {
  line-height: 1.5;
  /* 1 */
  -webkit-text-size-adjust: 100%;
  /* 2 */
  -moz-tab-size: 4;
  /* 3 */
  -o-tab-size: 4;
     tab-size: 4;
  /* 3 */
  font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  /* 4 */
  font-feature-settings: normal;
  /* 5 */
  font-variation-settings: normal;
  /* 6 */
  -webkit-tap-highlight-color: transparent;
  /* 7 */
}

/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/

body {
  margin: 0;
  /* 1 */
  line-height: inherit;
  /* 2 */
}

/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/

hr {
  height: 0;
  /* 1 */
  color: inherit;
  /* 2 */
  border-top-width: 1px;
  /* 3 */
}

/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/

abbr:where([title]) {
  -webkit-text-decoration: underline dotted;
          text-decoration: underline dotted;
}

/*
Remove the default font size and weight for headings.
*/

h1,
h2,
h3,
h4,
h5,
h6 {
  font-size: inherit;
  font-weight: inherit;
}

/*
Reset links to optimize for opt-in styling instead of opt-out.
*/

a {
  color: inherit;
  text-decoration: inherit;
}

/*
Add the correct font weight in Edge and Safari.
*/

b,
strong {
  font-weight: bolder;
}

/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/

code,
kbd,
samp,
pre {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  /* 1 */
  font-feature-settings: normal;
  /* 2 */
  font-variation-settings: normal;
  /* 3 */
  font-size: 1em;
  /* 4 */
}

/*
Add the correct font size in all browsers.
*/

small {
  font-size: 80%;
}

/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/

sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

sub {
  bottom: -0.25em;
}

sup {
  top: -0.5em;
}

/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/

table {
  text-indent: 0;
  /* 1 */
  border-color: inherit;
  /* 2 */
  border-collapse: collapse;
  /* 3 */
}

/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/

button,
input,
optgroup,
select,
textarea {
  font-family: inherit;
  /* 1 */
  font-feature-settings: inherit;
  /* 1 */
  font-variation-settings: inherit;
  /* 1 */
  font-size: 100%;
  /* 1 */
  font-weight: inherit;
  /* 1 */
  line-height: inherit;
  /* 1 */
  letter-spacing: inherit;
  /* 1 */
  color: inherit;
  /* 1 */
  margin: 0;
  /* 2 */
  padding: 0;
  /* 3 */
}

/*
Remove the inheritance of text transform in Edge and Firefox.
*/

button,
select {
  text-transform: none;
}

/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/

button,
input:where([type='button']),
input:where([type='reset']),
input:where([type='submit']) {
  -webkit-appearance: button;
  /* 1 */
  background-color: transparent;
  /* 2 */
  background-image: none;
  /* 2 */
}

/*
Use the modern Firefox focus style for all focusable elements.
*/

:-moz-focusring {
  outline: auto;
}

/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/

:-moz-ui-invalid {
  box-shadow: none;
}

/*
Add the correct vertical alignment in Chrome and Firefox.
*/

progress {
  vertical-align: baseline;
}

/*
Correct the cursor style of increment and decrement buttons in Safari.
*/

::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
  height: auto;
}

/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/

[type='search'] {
  -webkit-appearance: textfield;
  /* 1 */
  outline-offset: -2px;
  /* 2 */
}

/*
Remove the inner padding in Chrome and Safari on macOS.
*/

::-webkit-search-decoration {
  -webkit-appearance: none;
}

/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/

::-webkit-file-upload-button {
  -webkit-appearance: button;
  /* 1 */
  font: inherit;
  /* 2 */
}

/*
Add the correct display in Chrome and Safari.
*/

summary {
  display: list-item;
}

/*
Removes the default spacing and border for appropriate elements.
*/

blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
  margin: 0;
}

fieldset {
  margin: 0;
  padding: 0;
}

legend {
  padding: 0;
}

ol,
ul,
menu {
  list-style: none;
  margin: 0;
  padding: 0;
}

/*
Reset default styling for dialogs.
*/

dialog {
  padding: 0;
}

/*
Prevent resizing textareas horizontally by default.
*/

textarea {
  resize: vertical;
}

/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/

input::-moz-placeholder, textarea::-moz-placeholder {
  opacity: 1;
  /* 1 */
  color: #9ca3af;
  /* 2 */
}

input::placeholder,
textarea::placeholder {
  opacity: 1;
  /* 1 */
  color: #9ca3af;
  /* 2 */
}

/*
Set the default cursor for buttons.
*/

button,
[role="button"] {
  cursor: pointer;
}

/*
Make sure disabled buttons don't get the pointer cursor.
*/

:disabled {
  cursor: default;
}

/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
   This can trigger a poorly considered lint error in some tools but is included by design.
*/

img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
  display: block;
  /* 1 */
  vertical-align: middle;
  /* 2 */
}

/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/

img,
video {
  max-width: 100%;
  height: auto;
}

/* Make elements with the HTML hidden attribute stay hidden by default */

[hidden]:where(:not([hidden="until-found"])) {
  display: none;
}

.container {
  width: 100%;
}

@media (min-width: 640px) {
  .container {
    max-width: 640px;
  }
}

@media (min-width: 768px) {
  .container {
    max-width: 768px;
  }
}

@media (min-width: 1024px) {
  .container {
    max-width: 1024px;
  }
}

@media (min-width: 1280px) {
  .container {
    max-width: 1280px;
  }
}

@media (min-width: 1536px) {
  .container {
    max-width: 1536px;
  }
}

.pointer-events-none {
  pointer-events: none;
}

.static {
  position: static;
}

.fixed {
  position: fixed;
}

.absolute {
  position: absolute;
}

.relative {
  position: relative;
}

.inset-0 {
  inset: 0px;
}

.bottom-4 {
  bottom: 1rem;
}

.left-0 {
  left: 0px;
}

.right-0 {
  right: 0px;
}

.right-4 {
  right: 1rem;
}

.top-0 {
  top: 0px;
}

.top-1\/2 {
  top: 50%;
}

.z-50 {
  z-index: 50;
}

.mx-4 {
  margin-left: 1rem;
  margin-right: 1rem;
}

.mx-auto {
  margin-left: auto;
  margin-right: auto;
}

.mb-2 {
  margin-bottom: 0.5rem;
}

.mb-4 {
  margin-bottom: 1rem;
}

.mb-6 {
  margin-bottom: 1.5rem;
}

.mr-2 {
  margin-right: 0.5rem;
}

.mt-1 {
  margin-top: 0.25rem;
}

.mt-2 {
  margin-top: 0.5rem;
}

.mt-4 {
  margin-top: 1rem;
}

.mt-6 {
  margin-top: 1.5rem;
}

.block {
  display: block;
}

.inline-block {
  display: inline-block;
}

.flex {
  display: flex;
}

.table {
  display: table;
}

.grid {
  display: grid;
}

.hidden {
  display: none;
}

.h-12 {
  height: 3rem;
}

.h-2 {
  height: 0.5rem;
}

.h-8 {
  height: 2rem;
}

.max-h-64 {
  max-height: 16rem;
}

.max-h-96 {
  max-height: 24rem;
}

.min-h-screen {
  min-height: 100vh;
}

.w-1 {
  width: 0.25rem;
}

.w-12 {
  width: 3rem;
}

.w-2 {
  width: 0.5rem;
}

.w-8 {
  width: 2rem;
}

.w-full {
  width: 100%;
}

.max-w-2xl {
  max-width: 42rem;
}

.max-w-4xl {
  max-width: 56rem;
}

.max-w-md {
  max-width: 28rem;
}

.flex-1 {
  flex: 1 1 0%;
}

.-translate-y-1\/2 {
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.translate-y-full {
  --tw-translate-y: 100%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.transform {
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

@keyframes pulse {
  50% {
    opacity: .5;
  }
}

.animate-pulse {
  animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

.animate-spin {
  animation: spin 1s linear infinite;
}

.resize {
  resize: both;
}

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

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

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

.grid-rows-11 {
  grid-template-rows: repeat(11, minmax(0, 1fr));
}

.flex-col {
  flex-direction: column;
}

.items-center {
  align-items: center;
}

.justify-end {
  justify-content: flex-end;
}

.justify-center {
  justify-content: center;
}

.justify-between {
  justify-content: space-between;
}

.gap-0 {
  gap: 0px;
}

.gap-4 {
  gap: 1rem;
}

.gap-6 {
  gap: 1.5rem;
}

.gap-8 {
  gap: 2rem;
}

.space-x-2 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-x-reverse: 0;
  margin-right: calc(0.5rem * var(--tw-space-x-reverse));
  margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
}

.space-x-4 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-x-reverse: 0;
  margin-right: calc(1rem * var(--tw-space-x-reverse));
  margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
}

.space-y-1 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
}

.space-y-2 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
}

.space-y-3 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
}

.space-y-4 > :not([hidden]) ~ :not([hidden]) {
  --tw-space-y-reverse: 0;
  margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
  margin-bottom: calc(1rem * var(--tw-space-y-reverse));
}

.overflow-y-auto {
  overflow-y: auto;
}

.rounded {
  border-radius: 0.25rem;
}

.rounded-full {
  border-radius: 9999px;
}

.rounded-lg {
  border-radius: 0.5rem;
}

.rounded-md {
  border-radius: 0.375rem;
}

.border {
  border-width: 1px;
}

.border-2 {
  border-width: 2px;
}

.border-4 {
  border-width: 4px;
}

.border-b {
  border-bottom-width: 1px;
}

.border-b-2 {
  border-bottom-width: 2px;
}

.border-t {
  border-top-width: 1px;
}

.border-dashed {
  border-style: dashed;
}

.border-amber-300 {
  --tw-border-opacity: 1;
  border-color: rgb(252 211 77 / var(--tw-border-opacity, 1));
}

.border-amber-800 {
  --tw-border-opacity: 1;
  border-color: rgb(146 64 14 / var(--tw-border-opacity, 1));
}

.border-blue-400 {
  --tw-border-opacity: 1;
  border-color: rgb(96 165 250 / var(--tw-border-opacity, 1));
}

.border-blue-500 {
  --tw-border-opacity: 1;
  border-color: rgb(59 130 246 / var(--tw-border-opacity, 1));
}

.border-gray-200 {
  --tw-border-opacity: 1;
  border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));
}

.border-gray-300 {
  --tw-border-opacity: 1;
  border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));
}

.border-gray-400 {
  --tw-border-opacity: 1;
  border-color: rgb(156 163 175 / var(--tw-border-opacity, 1));
}

.border-green-400 {
  --tw-border-opacity: 1;
  border-color: rgb(74 222 128 / var(--tw-border-opacity, 1));
}

.border-red-400 {
  --tw-border-opacity: 1;
  border-color: rgb(248 113 113 / var(--tw-border-opacity, 1));
}

.border-t-amber-600 {
  --tw-border-opacity: 1;
  border-top-color: rgb(217 119 6 / var(--tw-border-opacity, 1));
}

.bg-amber-100 {
  --tw-bg-opacity: 1;
  background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1));
}

.bg-amber-600 {
  --tw-bg-opacity: 1;
  background-color: rgb(217 119 6 / var(--tw-bg-opacity, 1));
}

.bg-amber-800 {
  --tw-bg-opacity: 1;
  background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1));
}

.bg-amber-900 {
  --tw-bg-opacity: 1;
  background-color: rgb(120 53 15 / var(--tw-bg-opacity, 1));
}

.bg-black {
  --tw-bg-opacity: 1;
  background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
}

.bg-blue-100 {
  --tw-bg-opacity: 1;
  background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1));
}

.bg-blue-500 {
  --tw-bg-opacity: 1;
  background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));
}

.bg-blue-600 {
  --tw-bg-opacity: 1;
  background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));
}

.bg-gray-100 {
  --tw-bg-opacity: 1;
  background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));
}

.bg-gray-300 {
  --tw-bg-opacity: 1;
  background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));
}

.bg-gray-500 {
  --tw-bg-opacity: 1;
  background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1));
}

.bg-gray-800 {
  --tw-bg-opacity: 1;
  background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));
}

.bg-green-100 {
  --tw-bg-opacity: 1;
  background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1));
}

.bg-green-500 {
  --tw-bg-opacity: 1;
  background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1));
}

.bg-green-600 {
  --tw-bg-opacity: 1;
  background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1));
}

.bg-red-100 {
  --tw-bg-opacity: 1;
  background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));
}

.bg-red-50 {
  --tw-bg-opacity: 1;
  background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
}

.bg-red-500 {
  --tw-bg-opacity: 1;
  background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1));
}

.bg-white {
  --tw-bg-opacity: 1;
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
}

.bg-yellow-500 {
  --tw-bg-opacity: 1;
  background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));
}

.bg-opacity-50 {
  --tw-bg-opacity: 0.5;
}

.bg-opacity-75 {
  --tw-bg-opacity: 0.75;
}

.bg-gradient-to-br {
  background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));
}

.from-amber-50 {
  --tw-gradient-from: #fffbeb var(--tw-gradient-from-position);
  --tw-gradient-to: rgb(255 251 235 / 0) var(--tw-gradient-to-position);
  --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
}

.to-amber-100 {
  --tw-gradient-to: #fef3c7 var(--tw-gradient-to-position);
}

.p-4 {
  padding: 1rem;
}

.p-6 {
  padding: 1.5rem;
}

.p-8 {
  padding: 2rem;
}

.px-2 {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}

.px-3 {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.px-4 {
  padding-left: 1rem;
  padding-right: 1rem;
}

.px-6 {
  padding-left: 1.5rem;
  padding-right: 1.5rem;
}

.py-1 {
  padding-top: 0.25rem;
  padding-bottom: 0.25rem;
}

.py-2 {
  padding-top: 0.5rem;
  padding-bottom: 0.5rem;
}

.py-3 {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}

.py-4 {
  padding-top: 1rem;
  padding-bottom: 1rem;
}

.py-8 {
  padding-top: 2rem;
  padding-bottom: 2rem;
}

.pt-4 {
  padding-top: 1rem;
}

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

.font-mono {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}

.text-2xl {
  font-size: 1.5rem;
  line-height: 2rem;
}

.text-3xl {
  font-size: 1.875rem;
  line-height: 2.25rem;
}

.text-4xl {
  font-size: 2.25rem;
  line-height: 2.5rem;
}

.text-6xl {
  font-size: 3.75rem;
  line-height: 1;
}

.text-lg {
  font-size: 1.125rem;
  line-height: 1.75rem;
}

.text-sm {
  font-size: 0.875rem;
  line-height: 1.25rem;
}

.text-xl {
  font-size: 1.25rem;
  line-height: 1.75rem;
}

.text-xs {
  font-size: 0.75rem;
  line-height: 1rem;
}

.font-bold {
  font-weight: 700;
}

.font-medium {
  font-weight: 500;
}

.font-semibold {
  font-weight: 600;
}

.text-amber-200 {
  --tw-text-opacity: 1;
  color: rgb(253 230 138 / var(--tw-text-opacity, 1));
}

.text-amber-600 {
  --tw-text-opacity: 1;
  color: rgb(217 119 6 / var(--tw-text-opacity, 1));
}

.text-amber-700 {
  --tw-text-opacity: 1;
  color: rgb(180 83 9 / var(--tw-text-opacity, 1));
}

.text-amber-800 {
  --tw-text-opacity: 1;
  color: rgb(146 64 14 / var(--tw-text-opacity, 1));
}

.text-blue-600 {
  --tw-text-opacity: 1;
  color: rgb(37 99 235 / var(--tw-text-opacity, 1));
}

.text-blue-800 {
  --tw-text-opacity: 1;
  color: rgb(30 64 175 / var(--tw-text-opacity, 1));
}

.text-gray-400 {
  --tw-text-opacity: 1;
  color: rgb(156 163 175 / var(--tw-text-opacity, 1));
}

.text-gray-500 {
  --tw-text-opacity: 1;
  color: rgb(107 114 128 / var(--tw-text-opacity, 1));
}

.text-gray-600 {
  --tw-text-opacity: 1;
  color: rgb(75 85 99 / var(--tw-text-opacity, 1));
}

.text-gray-700 {
  --tw-text-opacity: 1;
  color: rgb(55 65 81 / var(--tw-text-opacity, 1));
}

.text-gray-800 {
  --tw-text-opacity: 1;
  color: rgb(31 41 55 / var(--tw-text-opacity, 1));
}

.text-gray-900 {
  --tw-text-opacity: 1;
  color: rgb(17 24 39 / var(--tw-text-opacity, 1));
}

.text-green-600 {
  --tw-text-opacity: 1;
  color: rgb(22 163 74 / var(--tw-text-opacity, 1));
}

.text-red-600 {
  --tw-text-opacity: 1;
  color: rgb(220 38 38 / var(--tw-text-opacity, 1));
}

.text-red-800 {
  --tw-text-opacity: 1;
  color: rgb(153 27 27 / var(--tw-text-opacity, 1));
}

.text-white {
  --tw-text-opacity: 1;
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
}

.opacity-0 {
  opacity: 0;
}

.opacity-100 {
  opacity: 1;
}

.shadow-lg {
  --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-xl {
  --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.filter {
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.transition {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-colors {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-opacity {
  transition-property: opacity;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-transform {
  transition-property: transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.duration-300 {
  transition-duration: 300ms;
}

/* 棋子样式 */

.chess-piece {
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  border-width: 2px;
  cursor: pointer;
  transition: all 0.2s ease;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: bold;
  font-size: 1.125rem;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
  position: relative;
  z-index: 5;
}

.chess-piece:hover {
  transform: scale(1.1);
  z-index: 10;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}

.chess-piece.selected {
  box-shadow: 0 0 0 4px rgba(250, 204, 21, 0.75);
  animation: glow 1s ease-in-out infinite alternate;
}

/* 棋盘格子样式 */

.chess-cell {
  border: 1px solid #8b4513;
  background-color: #f4e4bc;
  position: relative;
  aspect-ratio: 1;
  min-height: 2.5rem;
}

/* （“整格填充”式高亮已废弃：交叉点棋盘改用点位标记，见文件后部 .chess-cell.* 覆盖） */

/* 动画效果 */

@keyframes pulse {
  0%, 100% {
    opacity: 0.5;
    transform: scale(1);
  }

  50% {
    opacity: 0.8;
    transform: scale(1.05);
  }
}

@keyframes glow {
  from {
    box-shadow: 0 0 5px rgba(59, 130, 246, 0.5);
  }

  to {
    box-shadow: 0 0 20px rgba(59, 130, 246, 0.8);
  }
}

/* 玩家区域 */

.player-area {
  opacity: 0.1;
  transition: opacity 0.3s ease;
}

.player-area.active {
  opacity: 1;
}

/* 通用过渡效果 */

.game-transition {
  transition: all 0.3s ease-in-out;
}

/* 响应式调整 */

@media (max-width: 768px) {
  .chess-piece {
    font-size: 0.875rem;
    width: 2rem;
    height: 2rem;
  }

  .chess-cell {
    min-height: 2rem;
  }
}

@media (max-width: 640px) {
  .chess-piece {
    font-size: 0.75rem;
    width: 1.75rem;
    height: 1.75rem;
  }

  .chess-cell {
    min-height: 1.75rem;
  }
}

.hover\:bg-amber-700:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(180 83 9 / var(--tw-bg-opacity, 1));
}

/* ===== 联机对局面板（不依赖 Tailwind，避免编译后的工具类缺失导致按钮不可见） ===== */
.online-panel {
  background: #fff;
  border-radius: .5rem;
  box-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);
  padding: 1.5rem;
  margin-top: 1.5rem;
}
.online-title { font-size: 1.125rem; font-weight: 700; margin: 0 0 1rem; }
.online-label { display: block; font-size: .875rem; color: #4b5563; margin: .6rem 0 .35rem; }
.online-input {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid #d1d5db;
  border-radius: .375rem;
  padding: .5rem .75rem;
  font-size: .875rem;
  background: #fff;
  color: #111827;
}
.online-input--code { flex: 1; min-width: 0; }
.online-row { display: flex; gap: .5rem; margin-top: .6rem; }
/* 悔棋/认输/求和：三个等宽（否则 .online-btn--leave 的 width:100% 会让悔棋独占、认输被挤窄） */
.online-row--acts > .online-btn { flex: 1 1 0; width: auto; margin-top: 0; }
.online-btn {
  border: 0;
  border-radius: .375rem;
  color: #fff;
  padding: .55rem .75rem;
  font-size: .875rem;
  line-height: 1.2;
  cursor: pointer;
  transition: filter .15s;
}
.online-btn:disabled { opacity: .5; cursor: not-allowed; }
.online-btn:not(:disabled):hover { filter: brightness(1.1); }
.online-btn--create { background: #6366f1; flex: 1; }
.online-btn--join { background: #14b8a6; flex: 1; }
.online-btn--start { background: #16a34a; width: 100%; margin-top: .75rem; }
.online-btn--copy { background: #0ea5e9; width: 100%; margin-top: .5rem; }
.online-btn--leave { background: #9ca3af; width: 100%; margin-top: .5rem; }
.online-status { font-size: .8rem; margin-top: .6rem; color: #4b5563; white-space: pre-line; }
.online-status--error { color: #dc2626; }
.online-status--ok { color: #15803d; }
.online-check { display: flex; align-items: center; gap: .4rem; font-size: .875rem; color: #4b5563; margin: .6rem 0 .35rem; }
.online-check input { width: auto; }

/* 简版控制区 */
.piece-counts { display: grid; grid-template-columns: 1fr 1fr; gap: .35rem; margin: .1rem 0 .6rem; font-size: .8rem; }
.pc { display: flex; align-items: center; justify-content: space-between; padding: .25rem .45rem; border-radius: .25rem; background: #f3f4f6; }
.pc--red { color: #dc2626; }
.pc--blue { color: #2563eb; }
.pc--green { color: #16a34a; }
.pc--black { color: #111827; }
.move-history { max-height: 68vh; display: flex; flex-direction: column; gap: .15rem; }

/* 回放控制条 */
.replay-bar { position: fixed; left: 50%; bottom: 1rem; transform: translateX(-50%); display: flex; align-items: center; gap: .5rem; background: #fff; padding: .5rem .75rem; border-radius: .5rem; box-shadow: 0 10px 15px -3px rgb(0 0 0 / .3); z-index: 1100; }
.replay-bar.hidden { display: none; }
.replay-bar .online-btn { margin-top: 0; }
.replay-bar #replayStatus { margin: 0; white-space: nowrap; }
.online-roster { font-size: .8rem; margin-top: .25rem; color: #374151; }
.online-roster > div { margin-top: .15rem; }

/* 网格棋盘：格子尺寸由 JS 统一控制，禁用媒体查询里的 min-height 以免撑破网格 */
.chess-cell { min-height: 0; }

/* ===== 弹窗 ===== */
.modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, .5); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: 1rem; }
.modal-overlay.hidden { display: none; }
.modal-box { background: #fff; border-radius: .5rem; box-shadow: 0 20px 25px -5px rgb(0 0 0 / .3); padding: 1.5rem; width: 100%; max-width: 26rem; max-height: 90vh; overflow-y: auto; }
.modal-box--wide { max-width: 42rem; }
.modal-title { font-size: 1.25rem; font-weight: 700; margin: 0; }
.modal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; }
.modal-x { border: 0; background: transparent; font-size: 1.2rem; line-height: 1; cursor: pointer; color: #6b7280; padding: .25rem .5rem; border-radius: .375rem; }
.modal-x:hover { background: #f3f4f6; color: #111827; }

/* ===================== 主题：重做外观（木质棋盘 + 四色） ===================== */
:root{
  --bg:#f4efe6; --ink:#2a2622; --muted:#6b6259;
  --walnut:#4a2b16; --walnut-2:#6b3e1f; --wood-line:#8a5a2b;
  --board-a:#f3d9a8; --board-b:#eccf95; --board-frame:#7a4a1e;
  --grain:rgba(120,80,30,.055);
  --red:#b23b2e; --blue:#2c5d9f; --green:#1f7a55; --black:#33302c;
  --primary:#2e7d5b; --accent:#0f766e; --slate:#64748b; --slate-2:#475569; --danger:#b23b2e;
  --card-r:14px; --btn-r:11px;
  --shadow:0 6px 18px -6px rgba(60,40,20,.35), 0 2px 6px -2px rgba(60,40,20,.2);
}
*{ -webkit-tap-highlight-color:transparent; touch-action:manipulation; }
body{
  background:radial-gradient(1200px 600px at 50% -10%, #fff8ec 0%, var(--bg) 60%) fixed, var(--bg);
  color:var(--ink);
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Noto Sans SC",system-ui,"Segoe UI",Roboto,sans-serif;
  padding-bottom:calc(env(safe-area-inset-bottom,0px));
}
header.bg-amber-800{ background:linear-gradient(135deg,var(--walnut) 0%,var(--walnut-2) 100%) !important; box-shadow:0 6px 20px -8px rgba(40,20,5,.6); }
/* APK：WebView 边到边（viewport-fit=cover）时给顶部安全区留白，标题不被状态栏压住；网页端 env() 为 0，无影响 */
html.native-app header.bg-amber-800{ padding-top:calc(env(safe-area-inset-top, 0px) + .75rem); }
header.bg-amber-800 h1{ letter-spacing:.12em; }
header.bg-amber-800 p{ color:#ecd9b8 !important; letter-spacing:.14em; }

main{ max-width:1200px; }
main .bg-white.rounded-lg{ border-radius:var(--card-r); box-shadow:var(--shadow); border:1px solid rgba(138,90,43,.14); }
main h3{ color:var(--walnut-2); letter-spacing:.04em; }
#currentPlayer{ font-weight:800; }
#gameStatus{ color:var(--muted); }

/* 按钮 */
.online-btn{ border:0; border-radius:var(--btn-r); color:#fff; font-weight:650; letter-spacing:.03em; min-height:44px; padding:.6rem .9rem; cursor:pointer;
  box-shadow:0 3px 0 rgba(0,0,0,.12), 0 6px 14px -8px rgba(0,0,0,.5); transition:transform .08s ease, filter .15s ease, box-shadow .15s ease; }
.online-btn:not(:disabled):hover{ filter:brightness(1.06); }
.online-btn:not(:disabled):active{ transform:translateY(2px); box-shadow:0 1px 0 rgba(0,0,0,.15); }
.online-btn:disabled{ opacity:.45; box-shadow:none; cursor:not-allowed; }
.online-btn--start{ background:linear-gradient(180deg,#35926b,var(--primary)); }
.online-btn--create{ background:linear-gradient(180deg,#149487,var(--accent)); }
.online-btn--join{ background:linear-gradient(180deg,#3468ab,var(--blue)); }
.online-btn--copy{ background:linear-gradient(180deg,#71809a,var(--slate)); }
.online-btn--leave{ background:linear-gradient(180deg,#a9b3c2,var(--slate-2)); }
.online-btn--danger{ background:linear-gradient(180deg,#c24536,var(--danger)); }

/* 输入/下拉 */
.online-input{ border-radius:10px; border:1px solid #d8cdbb; background:#fffdf8; color:var(--ink); min-height:42px; }
.online-input:focus{ outline:2px solid rgba(15,118,110,.35); border-color:var(--accent); }
.online-check{ color:var(--muted); }

/* 玩家信息 2x2 */
.piece-counts{ gap:.4rem; }
.pc{ border:1px solid rgba(0,0,0,.06); font-weight:600; }
.pc b{ font-variant-numeric:tabular-nums; }
.pc--red{ background:#fbeae7; color:var(--red); }
.pc--blue{ background:#e8f0fb; color:var(--blue); }
.pc--green{ background:#e6f5ee; color:var(--green); }
.pc--black{ background:#efece7; color:var(--black); }

/* 移动历史 */
.move-history{ gap:.3rem; }
.move-history > div{ padding:.28rem .5rem; border-radius:8px; background:#faf6ef; border:1px solid rgba(138,90,43,.10); }

/* 棋盘 */
#chessBoard{ background:
  repeating-linear-gradient(91deg, var(--grain) 0 1.5px, transparent 1.5px 10px, var(--grain) 10px 11.5px, transparent 11.5px 24px),
  repeating-linear-gradient(89deg, transparent 0 15px, var(--grain) 15px 16px, transparent 16px 33px),
  linear-gradient(160deg,var(--board-a),var(--board-b)) !important;
  border:6px solid var(--board-frame) !important; border-radius:16px !important;
  box-shadow:var(--shadow), inset 0 0 0 3px rgba(255,255,255,.35) !important; }
@keyframes checkPulse{ 0%,100%{ box-shadow:inset 0 0 0 3px rgba(200,40,40,.85); } 50%{ box-shadow:inset 0 0 0 3px rgba(200,40,40,.28); } }

/* 棋盘装饰层：九宫斜线 / 炮兵起始标记 / 坐标标注（纯视觉） */
.board-overlay{ position:relative; pointer-events:none; z-index:1;
  --ov-line:rgba(90,58,26,.55); --ov-label:rgba(90,58,26,.72); --ov-river:rgba(90,58,26,.52); }
html[data-theme="dark"] .board-overlay{ --ov-line:rgba(200,175,140,.42); --ov-label:rgba(210,192,165,.75); --ov-river:rgba(200,175,140,.5); }
.board-overlay .palace-line{ position:absolute; height:0; border-top:1.5px solid var(--ov-line); }
.board-overlay .axis-label{ position:absolute; transform:translate(-50%,-50%); line-height:1; font-weight:700;
  color:var(--ov-label); font-family:ui-monospace,Menlo,Consolas,monospace; }
@media (prefers-reduced-motion: reduce){ .chess-cell.check{ animation:none; } }

/* 非法走子：棋子抖动反馈 */
@keyframes shakeX{ 0%,100%{ transform:translateX(0); } 20%{ transform:translateX(-18%); } 40%{ transform:translateX(18%); } 60%{ transform:translateX(-12%); } 80%{ transform:translateX(12%); } }
.chess-piece.shake{ animation:shakeX .4s ease; }
/* 拖拽中的“跟随影子” */
.chess-piece.drag-ghost{ position:fixed; z-index:70; transform:scale(1.08); box-shadow:0 12px 24px rgba(0,0,0,.35) !important; }
@media (prefers-reduced-motion: reduce){ .chess-piece.shake{ animation:none; } }

/* 落子弹跳 */
@keyframes landBounce{ 0%{ transform:scale(1.16); } 55%{ transform:scale(.94); } 100%{ transform:scale(1); } }
.chess-piece.land{ animation:landBounce .26s ease-out; }
@media (prefers-reduced-motion: reduce){ .chess-piece.land{ animation:none; } }

/* ===== 交叉点棋盘：棋子落在线的交叉点，格子仅作占位（无边框/底色） ===== */
.chess-cell{ background:none !important; border:0 !important; box-shadow:none !important; border-radius:0 !important;
  display:flex; align-items:center; justify-content:center; }
html[data-theme="dark"] .chess-cell{ background:none !important; border:0 !important; }
.board-overlay .board-line{ position:absolute; background:var(--ov-line); border-radius:1px; }
.board-overlay .board-frame-line{ position:absolute; box-sizing:border-box; pointer-events:none;
  border:1.5px solid var(--ov-line); opacity:.9; }

/* 各种高亮改为“围绕交叉点”的点位标记（原来是整格填充） */
.chess-cell.playable:hover{ background:radial-gradient(circle at 50% 50%, rgba(255,255,255,.45) 0 34%, transparent 36%) !important; }
html[data-theme="dark"] .chess-cell.playable:hover{ background:radial-gradient(circle at 50% 50%, rgba(255,255,255,.16) 0 34%, transparent 36%) !important; }
.chess-cell.selected{ background:none !important; }
.chess-cell.possible-move{ background:none !important; }
.chess-cell.possible-move::after{ content:""; position:absolute; left:50%; top:50%; width:30%; height:30%; transform:translate(-50%,-50%); border-radius:50%; background:rgba(46,125,91,.6); }
.chess-cell.enemy-piece{ background:none !important; }
.chess-cell.enemy-piece::after{ content:""; position:absolute; left:50%; top:50%; width:82%; height:82%; transform:translate(-50%,-50%); border-radius:50%; border:2.5px solid rgba(200,50,40,.85); box-sizing:border-box; }
.chess-cell.check{ background:none !important; box-shadow:none !important; animation:none !important; }
.chess-cell.check::after{ content:""; position:absolute; left:50%; top:50%; width:94%; height:94%; transform:translate(-50%,-50%); border-radius:50%; box-shadow:0 0 0 3px rgba(200,40,40,.9), 0 0 16px 6px rgba(200,40,40,.5); animation:checkPulse 1.1s ease-in-out infinite; }
.chess-cell.last-move-from, .chess-cell.last-move-to{ background:none !important; box-shadow:none !important; }
.chess-cell.last-move-from::before, .chess-cell.last-move-to::before{ content:""; position:absolute; left:50%; top:50%; width:58%; height:58%; transform:translate(-50%,-50%); border-radius:50%; background:rgba(217,119,6,.30); }
/* 预备走子：起点/落点用紫色虚线框标示（与“最后一步/将军/选中”区分；用 outline 不与其他伪元素/阴影冲突） */
.chess-cell.premove-from, .chess-cell.premove-to{ outline:2px dashed #8b5cf6; outline-offset:-3px; background-image:linear-gradient(rgba(139,92,246,.16), rgba(139,92,246,.16)); }
html[data-theme="dark"] .chess-cell.premove-from, html[data-theme="dark"] .chess-cell.premove-to{ outline-color:#a78bfa; }
@media (prefers-reduced-motion: reduce){ .chess-cell.check::after{ animation:none; } }
/* 河界不再填色：河界是“同底色空白带”，只靠线格断开 + 河界文字标示（见 .river-text） */
.chess-piece{ border-width:2px; border-style:solid; font-weight:800; font-family:"KaiTi","STKaiti","Kaiti SC","Noto Serif SC",serif;
  box-shadow:0 6px 14px -4px rgba(60,30,10,.45), 0 2px 3px rgba(0,0,0,.26),
    inset 0 -4px 8px rgba(0,0,0,.20), inset 0 4px 6px rgba(255,255,255,.95),
    inset 0 0 0 1px rgba(255,255,255,.22) !important; }
/* 棋子内圈“刻线”（传统棋子中间那道圈），纯装饰 */
.chess-piece::before{ content:""; position:absolute; inset:9%; border-radius:50%; pointer-events:none;
  box-shadow:inset 0 0 0 1.5px rgba(0,0,0,.16), 0 1px 0 rgba(255,255,255,.6); }
/* 四色「非颜色」区分：红/蓝、绿/黑 棋子用字完全相同（帅/士/相/兵 vs 将/仕/象/卒）、
   只靠颜色区分，色觉障碍或小屏下难以分辨。给四种颜色各配一种**边沿描线样式**做冗余线索：
   红=实线 / 蓝=虚线 / 绿=点线 / 黑=双线。 */
.chess-piece[data-player="0"]{ border-style:solid; }
.chess-piece[data-player="1"]{ border-style:dashed; }
.chess-piece[data-player="2"]{ border-style:dotted; border-width:3px; }
.chess-piece[data-player="3"]{ border-style:double; border-width:4px; }
.chess-piece.selected{ box-shadow:0 0 0 3px rgba(46,125,91,.8), 0 6px 14px -4px rgba(0,0,0,.4) !important; }
.chess-piece[data-player="0"]{ color:var(--red) !important; border-color:#c9544a !important;
  background:radial-gradient(circle at 50% 122%, rgba(90,30,20,.16), transparent 60%), repeating-radial-gradient(circle at 50% 47%, rgba(120,60,40,.05) 0 1px, transparent 1px 5px), radial-gradient(circle at 32% 26%, #fff, #f6dcd7) !important; }
.chess-piece[data-player="1"]{ color:var(--blue) !important; border-color:#4a7cc4 !important;
  background:radial-gradient(circle at 50% 122%, rgba(30,50,100,.16), transparent 60%), repeating-radial-gradient(circle at 50% 47%, rgba(40,70,120,.05) 0 1px, transparent 1px 5px), radial-gradient(circle at 32% 26%, #fff, #d9e6f8) !important; }
.chess-piece[data-player="2"]{ color:var(--green) !important; border-color:#3fa079 !important;
  background:radial-gradient(circle at 50% 122%, rgba(20,70,50,.16), transparent 60%), repeating-radial-gradient(circle at 50% 47%, rgba(30,100,70,.05) 0 1px, transparent 1px 5px), radial-gradient(circle at 32% 26%, #fff, #d7efe4) !important; }
.chess-piece[data-player="3"]{ color:var(--black) !important; border-color:#6b6259 !important;
  background:radial-gradient(circle at 50% 122%, rgba(50,45,40,.16), transparent 60%), repeating-radial-gradient(circle at 50% 47%, rgba(60,55,48,.05) 0 1px, transparent 1px 5px), radial-gradient(circle at 32% 26%, #fff, #e3ddd4) !important; }

#messageToast{ border-radius:12px; box-shadow:var(--shadow); font-weight:600; max-width:calc(100vw - 2rem); }

/* 轮到该方：整方棋子加“实心一圈”——紧贴棋子外缘、无间隙（只大一圈） */
.chess-piece::after{
  content:""; position:absolute; inset:-2px; border-radius:50%; pointer-events:none;
  opacity:0; transition:opacity .2s ease;
}
.chess-piece.turn-active::after{
  opacity:1; box-shadow:0 0 0 .2em rgba(217,119,6,.92);
}
/* 联机：轮到“我”时，光环换成青绿并呼吸，突出“该你走了” */
@keyframes myTurnPulse{
  0%,100%{ box-shadow:0 0 0 .2em rgba(22,163,74,.95); }
  50%{ box-shadow:0 0 0 .32em rgba(22,163,74,.55); }
}
.chess-piece.my-turn::after{ animation:myTurnPulse 1.6s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce){
  .chess-piece.my-turn::after{ animation:none; box-shadow:0 0 0 .2em rgba(22,163,74,.95); }
}
.replay-bar{ border:1px solid rgba(138,90,43,.18); }
.modal-box{ border-radius:16px; box-shadow:0 24px 60px -20px rgba(40,20,5,.6); }
#confirmModalText{ white-space:pre-line; margin:.2rem 0 .2rem; }

/* 移动端 / 安卓适配 */
@media (max-width: 1023px){
  main{ padding-left:12px !important; padding-right:12px !important; }
  main > .flex{ flex-direction:column !important; gap:14px !important; }
  #boardCol{ order:-1; }
  .lg\:w-1\/4, .lg\:w-2\/4{ width:100% !important; }
  .online-btn{ min-height:46px; }
  .modal-box{ max-height:92vh; }
}
@media (hover:none) and (pointer:coarse){
  .chess-piece:active{ transform:scale(1.12); }
}

.setup-group { margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid #e5e7eb; }
.setup-group:last-of-type { border-bottom: 0; }
.setup-label { font-weight: 600; font-size: .95rem; margin-bottom: .5rem; }
.setup-mode.active { outline: 3px solid #111827; outline-offset: 1px; }
.modal-actions { display: flex; gap: .5rem; margin-top: 1rem; }
.modal-actions:empty { display: none; }
.modal-actions .online-btn { flex: 1; margin-top: 0; }
.rules-body { font-size: .9rem; color: #374151; line-height: 1.7; }
.rules-body h4 { font-weight: 700; margin: .8rem 0 .3rem; color: #111827; }
.rules-body ul { margin: .2rem 0; padding-left: 1.2rem; list-style: disc; }
.rules-body code { background: #f3f4f6; padding: 0 .2rem; border-radius: .2rem; }



.hover\:bg-amber-800:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1));
}

.hover\:bg-blue-600:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1));
}

.hover\:bg-blue-700:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1));
}

.hover\:bg-gray-600:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1));
}

.hover\:bg-green-700:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(21 128 61 / var(--tw-bg-opacity, 1));
}

.hover\:bg-red-600:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1));
}

.hover\:bg-yellow-600:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1));
}

.hover\:text-gray-600:hover {
  --tw-text-opacity: 1;
  color: rgb(75 85 99 / var(--tw-text-opacity, 1));
}

.hover\:text-gray-800:hover {
  --tw-text-opacity: 1;
  color: rgb(31 41 55 / var(--tw-text-opacity, 1));
}

.hover\:text-red-800:hover {
  --tw-text-opacity: 1;
  color: rgb(153 27 27 / var(--tw-text-opacity, 1));
}

.focus\:outline-none:focus {
  outline: 2px solid transparent;
  outline-offset: 2px;
}

.focus\:ring-2:focus {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus\:ring-blue-500:focus {
  --tw-ring-opacity: 1;
  --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1));
}

.focus\:ring-gray-500:focus {
  --tw-ring-opacity: 1;
  --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1));
}

.focus\:ring-green-500:focus {
  --tw-ring-opacity: 1;
  --tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1));
}

.focus\:ring-yellow-500:focus {
  --tw-ring-opacity: 1;
  --tw-ring-color: rgb(234 179 8 / var(--tw-ring-opacity, 1));
}

.disabled\:cursor-not-allowed:disabled {
  cursor: not-allowed;
}

.disabled\:bg-gray-400:disabled {
  --tw-bg-opacity: 1;
  background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1));
}

@media (min-width: 768px) {
  .md\:grid-cols-2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 1024px) {
  .lg\:block {
    display: block;
  }

  .lg\:w-1\/4 {
    width: 25%;
  }

  .lg\:w-2\/4 {
    width: 50%;
  }

  .lg\:flex-row {
    flex-direction: row;
  }
}

/* ===================== 应用设置：深色模式 ===================== */
html[data-theme="dark"]{
  --bg:#141210; --ink:#ece5d8; --muted:#a79b8b;
  --walnut:#3a2413; --walnut-2:#5a3a1e; --wood-line:#7a5a35;
  --board-a:#2b2622; --board-b:#231e1a; --board-frame:#5a3a1e;
  --grain:rgba(255,255,255,.035);
  --red:#e26a5f; --blue:#6fa4e8; --green:#53c894; --black:#cbc4b8;
  --primary:#2e7d5b; --accent:#128f85; --slate:#6b7a90; --slate-2:#4d5866; --danger:#d05a4b;
  --shadow:0 8px 24px -8px rgba(0,0,0,.75), 0 2px 6px -2px rgba(0,0,0,.6);
}
html[data-theme="dark"] body{ background:radial-gradient(1200px 600px at 50% -10%, #221d18 0%, var(--bg) 60%) fixed, var(--bg); }
html[data-theme="dark"] .bg-white{ background:#211d19 !important; color:var(--ink); }
html[data-theme="dark"] .bg-gray-100{ background:var(--bg) !important; }
html[data-theme="dark"] .text-gray-600{ color:var(--muted) !important; }
html[data-theme="dark"] .text-gray-800{ color:var(--ink) !important; }
html[data-theme="dark"] main h3{ color:#dcc6a4; }
html[data-theme="dark"] header.bg-amber-800 p{ color:#cdb695 !important; }
html[data-theme="dark"] .modal-box{ background:#211d19; color:var(--ink); }
html[data-theme="dark"] .replay-bar{ background:#1c1815; border-color:rgba(160,120,70,.25); }
html[data-theme="dark"] .online-input{ background:#1a1613; border-color:#3a3128; color:var(--ink); }
html[data-theme="dark"] .online-roster{ color:#c9c0b2; }
html[data-theme="dark"] #gameStatus{ color:var(--muted); }
html[data-theme="dark"] .move-history > div{ background:#1a1613; border-color:#3a3128; }
html[data-theme="dark"] .setup-group{ border-bottom-color:#3a3128; }
html[data-theme="dark"] .rules-body{ color:#d4cabc; }
html[data-theme="dark"] .rules-body h4{ color:#ece5d8; }
html[data-theme="dark"] .rules-body code{ background:#2a241e; }
html[data-theme="dark"] .setup-mode.active{ outline-color:#ece5d8; }
html[data-theme="dark"] #chessBoard{ box-shadow:var(--shadow), inset 0 0 0 3px rgba(255,255,255,.06) !important; }
html[data-theme="dark"] .chess-cell{ border-color:rgba(170,130,80,.45) !important; }
html[data-theme="dark"] .chess-cell.playable:hover{ background:rgba(255,255,255,.10); }
html[data-theme="dark"] .pc{ border-color:rgba(255,255,255,.10); }
html[data-theme="dark"] .pc--red{ background:#3a201d; }
html[data-theme="dark"] .pc--blue{ background:#1d2a3a; }
html[data-theme="dark"] .pc--green{ background:#173026; }
html[data-theme="dark"] .pc--black{ background:#2a2723; }

/* ===================== 吃子托盘 ===================== */
.captured-tray{ margin-top:.5rem; display:flex; flex-direction:column; gap:.25rem; }
.cap-row{ display:flex; align-items:center; flex-wrap:wrap; gap:.2rem; }
.cap-label{ font-size:.72rem; color:var(--muted); margin-right:.25rem; }
.cap{ display:inline-flex; align-items:center; justify-content:center; width:1.35rem; height:1.35rem; border-radius:50%;
  font-family:"KaiTi","STKaiti","Kaiti SC",serif; font-weight:800; font-size:.82rem;
  border:1px solid rgba(0,0,0,.15); background:rgba(0,0,0,.03); }
.cap--0{ color:var(--red); }
.cap--1{ color:var(--blue); }
.cap--2{ color:var(--green); }
.cap--3{ color:var(--black); }
html[data-theme="dark"] .cap{ background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.12); }

/* ===================== 移动历史：悔棋 / 回放列表 ===================== */
.move-subhead{ margin-top:.5rem; padding-top:.4rem; border-top:1px dashed rgba(138,90,43,.35); font-size:.72rem; color:var(--muted); }
.move-line--undo{ opacity:.8; font-style:italic; }
.replay-move{ cursor:pointer; }
.replay-move:hover{ text-decoration:underline; }
.replay-move--past{ opacity:.5; }
.replay-move--active{ background:rgba(46,125,91,.18); border-radius:6px; font-weight:700; }
html[data-theme="dark"] .replay-move--active{ background:rgba(83,200,148,.22); }

/* ===================== 文字链接按钮（安装到桌面等，低调） ===================== */
.link-btn{ background:none; border:0; padding:0 .2rem; margin-left:.4rem; color:var(--accent);
  font-size:.78rem; text-decoration:underline; cursor:pointer; }
.link-btn.hidden{ display:none; }
html[data-theme="dark"] .link-btn{ color:#7fd0c4; }

/* ===================== 求和询问（非阻塞） ===================== */
.draw-prompt{ position:fixed; inset:0; background:rgba(0,0,0,.45); display:flex; align-items:center;
  justify-content:center; z-index:1200; padding:1rem; }
.draw-prompt.hidden{ display:none; }
.draw-prompt__box{ background:#fff; border-radius:14px; box-shadow:var(--shadow); padding:1.1rem 1.2rem; max-width:22rem; width:100%; }
.draw-prompt__text{ font-weight:650; margin-bottom:.6rem; }
html[data-theme="dark"] .draw-prompt__box{ background:#211d19; color:var(--ink); }

/* ===================== 对局设置弹窗更紧凑（避免上下滚动） ===================== */
#setupModal .modal-box{ padding:1.1rem; }
#setupModal .setup-group{ margin-bottom:.6rem; padding-bottom:.6rem; }
#setupModal .setup-label{ margin-bottom:.35rem; font-size:.9rem; }
#setupModal .online-btn{ min-height:40px; padding:.5rem .8rem; }
#setupModal .online-row:not(:has(> :not(.hidden))),
#setupModal .modal-actions:not(:has(> :not(.hidden))){ display:none; }
#setupModal .setup-group:not(:has(+ .setup-group:not(.hidden))){ border-bottom:0; padding-bottom:0; margin-bottom:0; }

/* ===================== 房主：玩家管理 ===================== */
.room-admin{ margin-top:.5rem; display:flex; flex-direction:column; gap:.25rem; }
.admin-row{ display:flex; align-items:center; gap:.35rem; font-size:.78rem; }
.admin-name{ flex:1; color:var(--muted); }
.mini-btn{ border:0; border-radius:7px; padding:.18rem .45rem; font-size:.72rem; cursor:pointer; color:#fff;
  background:linear-gradient(180deg,#3468ab,var(--blue)); }
.mini-btn--danger{ background:linear-gradient(180deg,#c24536,var(--danger)); }
.mini-btn:active{ transform:translateY(1px); }
.admin-empty{ font-size:.72rem; color:var(--muted); }

/* ===================== 联机大厅（设置弹窗内） ===================== */
.lobby-head{ display:flex; align-items:center; justify-content:space-between; gap:.4rem; margin-bottom:.35rem; }
.lobby-code{ font-size:.85rem; color:var(--muted); }
.lobby-code b{ color:var(--ink); letter-spacing:.06em; font-weight:800; }
#lobbyRoster{ margin-top:.15rem; }
#lobbyHint{ margin-top:.35rem; }

/* ===================== 棋盘皮肤（独立于深色模式；皮肤优先） ===================== */
html[data-skin="jade"]{ --board-a:#e9f4e5; --board-b:#d6ecd0; --board-frame:#2f6b4f; --grain:rgba(47,107,79,.05); }
html[data-skin="ink"]{ --board-a:#e9e6e0; --board-b:#dbd6cd; --board-frame:#3a3630; --grain:rgba(58,54,48,.05); }
html[data-skin="lake"]{ --board-a:#e5eef9; --board-b:#d2e3f4; --board-frame:#2b5d8a; --grain:rgba(43,93,138,.05); }

/* ===================== 每步倒计时 ===================== */
.turn-timer{ font-variant-numeric:tabular-nums; font-weight:700; color:var(--muted); letter-spacing:.04em; }
.turn-timer.timer--red{ color:#dc2626; animation: timerPulse 1s ease-in-out infinite; }
html[data-theme="dark"] .turn-timer.timer--red{ color:#f87171; }
@keyframes timerPulse{ 0%,100%{opacity:1;} 50%{opacity:.45;} }

/* ===================== 河界文字「楚河/汉界」（同底色空白带上的字） ===================== */
.board-overlay .river-text{ position:absolute; transform:translate(-50%,-50%); font-weight:800;
  letter-spacing:.5em; text-indent:.5em; white-space:nowrap; line-height:1;
  font-family:"KaiTi","STKaiti","Kaiti SC","Noto Serif SC",serif; color:var(--ov-river);
  text-shadow:0 1px 0 rgba(255,255,255,.55), 0 -1px 1px rgba(0,0,0,.10); }
.board-overlay .river-text--v{ writing-mode:vertical-rl; text-orientation:upright; letter-spacing:.42em; text-indent:.42em; }
html[data-theme="dark"] .board-overlay .river-text{ text-shadow:0 1px 0 rgba(0,0,0,.5), 0 -1px 1px rgba(255,255,255,.06); }

/* ===================== 聊天 ===================== */
.chat-log{ min-height:6rem; max-height:40vh; overflow-y:auto; background:#faf6ef; border:1px solid rgba(138,90,43,.16);
  border-radius:10px; padding:.5rem .6rem; font-size:.86rem; display:flex; flex-direction:column; gap:.2rem; }
.chat-line{ word-break:break-word; line-height:1.5; }
.chat-line b{ font-weight:700; }
.chip-row{ display:flex; flex-wrap:wrap; gap:.3rem; margin-top:.45rem; }
.chip{ border:1px solid rgba(138,90,43,.25); background:#fffdf8; color:var(--ink); border-radius:999px;
  padding:.2rem .6rem; font-size:.78rem; cursor:pointer; }
.chip:hover{ background:#f3ead9; }
.chip--emoji{ font-size:1rem; padding:.15rem .45rem; }
.chat-input-row{ display:flex; gap:.4rem; margin-top:.5rem; }
.chat-input-row .online-input{ flex:1; }
.chat-input-row .online-btn{ flex:0 0 auto; }
html[data-theme="dark"] .chat-log{ background:#1a1613; border-color:#3a3128; }
html[data-theme="dark"] .chip{ background:#241f1a; border-color:#3a3128; color:var(--ink); }
html[data-theme="dark"] .chip:hover{ background:#2e271f; }

/* ===================== 事件横幅（将军 / 困毙 / 将死） ===================== */
.event-banner{
  position:absolute; inset:0; display:none; flex-direction:column;
  align-items:center; justify-content:center; gap:.45rem;
  pointer-events:none; z-index:40;
}
.event-banner--show{ display:flex; }
.event-banner[data-type="check"]{ color:#b45309; }
.event-banner[data-type="danger"]{ color:#c02626; }
.event-banner[data-type="info"]{ color:#3f4fbf; }
.event-banner__ring{
  width:38%; min-width:84px; max-width:200px; aspect-ratio:1/1;
  display:flex; align-items:center; justify-content:center;
  border-radius:50%; border:3px solid currentColor;
  background:radial-gradient(closest-side, rgba(255,255,255,.95), rgba(255,255,255,.72) 66%, rgba(255,255,255,0) 72%);
  box-shadow:0 0 0 6px rgba(255,255,255,.30), 0 10px 26px rgba(0,0,0,.18);
}
.event-banner--show .event-banner__ring{
  animation:eventPop .42s cubic-bezier(.2,1.5,.4,1) both, eventPulse 1.6s ease-in-out .5s infinite;
}
.event-banner__text{
  font-family:"KaiTi","STKaiti","Kaiti SC","Noto Serif SC",serif;
  font-size:clamp(22px,6.2vmin,50px); font-weight:800; letter-spacing:.1em; text-indent:.1em;
  text-shadow:0 2px 6px rgba(0,0,0,.18); white-space:nowrap;
}
.event-banner__sub{ font-size:.82rem; font-weight:700; color:#5c5c66; text-shadow:0 1px 2px rgba(255,255,255,.7); }
.event-banner--out{ animation:eventOut .34s ease forwards; }
.event-banner--out .event-banner__ring{ animation:none; }
@keyframes eventPop{ from{ transform:scale(.35); opacity:0; } to{ transform:scale(1); opacity:1; } }
@keyframes eventPulse{ 0%,100%{ transform:scale(1); } 50%{ transform:scale(1.06); } }
@keyframes eventOut{ to{ opacity:0; transform:scale(.9); } }
html[data-theme="dark"] .event-banner__ring{
  background:radial-gradient(closest-side, rgba(30,26,22,.95), rgba(30,26,22,.70) 66%, rgba(30,26,22,0) 72%);
  box-shadow:0 0 0 6px rgba(0,0,0,.35), 0 10px 26px rgba(0,0,0,.5);
}
html[data-theme="dark"] .event-banner__sub{ color:#d7d2ca; }
html[data-theme="dark"] .event-banner[data-type="check"]{ color:#f0b24a; }
html[data-theme="dark"] .event-banner[data-type="danger"]{ color:#ff6b6b; }
html[data-theme="dark"] .event-banner[data-type="info"]{ color:#8fa2ff; }
@media (prefers-reduced-motion: reduce){
  .event-banner--show .event-banner__ring{ animation:none; }
  .event-banner--out{ animation:none; }
}

/* ============================================================
   控制区头部：「轮到谁」胶囊 + 状态 + 倒计时（一行拿下，省高度）
   ============================================================ */
.ctrl-head{ display:flex; align-items:center; gap:.5rem; flex-wrap:wrap; }
.turn-pill{
  display:inline-flex; align-items:center; gap:.3rem;
  padding:.22rem .62rem; border-radius:999px; border:2px solid transparent;
  font-weight:800; font-size:.95rem; line-height:1.25; background:#f3f4f6; color:#374151;
  transition:background .2s ease, color .2s ease, border-color .2s ease;
}
/* 四色胶囊（由 GameEngine.updateCurrentPlayerDisplay 写入 data-p） */
.turn-pill[data-p="0"]{ background:#fee2e2; color:#b91c1c; border-color:#fca5a5; }
.turn-pill[data-p="1"]{ background:#dbeafe; color:#1d4ed8; border-color:#93c5fd; }
.turn-pill[data-p="2"]{ background:#dcfce7; color:#15803d; border-color:#86efac; }
.turn-pill[data-p="3"]{ background:#e5e7eb; color:#111827; border-color:#9ca3af; }
.ctrl-status{ font-size:.8rem; color:var(--muted,#6b7280); }
.turn-timer-wrap{ margin-left:auto; }
.turn-timer-wrap.hidden{ display:none; }

/* 倒计时进度条（与倒计时同步显隐） */
.turn-bar-row{ height:4px; border-radius:999px; background:#eceae5; overflow:hidden; margin-top:.5rem; }
.turn-bar-row.hidden{ display:none; }
.turn-bar-row > i{ display:block; height:100%; width:100%; border-radius:999px;
  background:linear-gradient(90deg,#16a34a,#84cc16); transition:width 1s linear; }
.turn-bar-row > i.timer--red{ background:linear-gradient(90deg,#dc2626,#f97316); }

/* 落点提示：默认仍是原来的「可走=小圆点 / 可吃=红环」（触屏没有 hover，保持原样）。
   桌面（精确指针）把鼠标悬停在合法落点上时，才在该点显示半透明棋子预览 —— 即"阴影跟着鼠标走"。
   用伪元素实现：随 class/悬停状态自动显隐，不需要任何 JS 清理。 */
.chess-cell.possible-move:hover{ --hint-c:#475569; }
.chess-cell.possible-move:hover[data-hp="0"]{ --hint-c:#b91c1c; }
.chess-cell.possible-move:hover[data-hp="1"]{ --hint-c:#1d4ed8; }
.chess-cell.possible-move:hover[data-hp="2"]{ --hint-c:#15803d; }
.chess-cell.possible-move:hover[data-hp="3"]{ --hint-c:#334155; }
/* any-* 而非 hover/pointer：触屏笔记本上主指针可能被判为 coarse，用它会导致鼠标悬停也不出预览。
   纯触屏手机（无鼠标）any-hover 不成立 → 依旧只有小圆点/红环。 */
@media (any-hover: hover) and (any-pointer: fine){
  .chess-cell.possible-move:hover::before{
    content: attr(data-hint);
    position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
    width:2.5rem; height:2.5rem; border-radius:50%; box-sizing:border-box;
    display:flex; align-items:center; justify-content:center;
    font-family:"KaiTi","STKaiti","Kaiti SC","Noto Serif SC",serif; font-weight:800; font-size:1.25rem;
    opacity:.42; pointer-events:none; border:2px solid var(--hint-c);
    background:rgba(255,255,255,.5); color:var(--hint-c);
    box-shadow:0 4px 10px -4px rgba(0,0,0,.35);
  }
  .chess-cell.possible-move:hover::after{ display:none; }   /* 悬停时不再叠小圆点 */
  html[data-theme="dark"] .chess-cell.possible-move:hover::before{ background:rgba(255,255,255,.14); }
}

/* ============================================================
   小屏（≤1023px）：收紧主界面，尽量一屏放下
   ============================================================ */
@media (max-width: 1023px){
  header{ padding-top:6px; padding-bottom:6px; }
  header h1{ font-size:1.15rem; }
  header p{ display:none; }                       /* 小屏收起副标题（版本号） */
  main{ padding-top:8px !important; padding-bottom:8px !important; }
  main > .flex{ gap:10px !important; }

  .online-btn{ min-height:40px; padding:.45rem .55rem; font-size:.82rem; }
  .online-row{ gap:.4rem; margin-top:.45rem; }
  .online-btn--start,
  .online-btn--copy,
  .online-btn--leave{ width:auto; margin-top:0; }
  .online-row--tools .online-btn,
  .online-btn--leave{ flex:1; }                    /* 一行放三个 / 悔棋不再独占整行 */
  .online-btn--start{ flex:1; }

  /* 玩家信息：2×2 → 一行四格 */
  .piece-counts{ grid-template-columns:repeat(4,1fr); gap:.25rem; margin-bottom:.3rem; }
  .pc{ flex-direction:column; align-items:center; gap:0; padding:.22rem .1rem; font-size:.7rem; }

  /* 移动历史：竖向长列表 → 单行横向滚动条（省高度，仍能看到最近几手） */
  .move-history{ flex-direction:row; max-height:none; overflow-x:auto; overflow-y:hidden; gap:.3rem; padding-bottom:2px; }
  .move-history > div{ flex:0 0 auto; }
  .move-history > p{ white-space:nowrap; }
  /* 例外：回放走法列表复用同一个 #moveHistory（Replay._renderMoveList），它是带序号的竖列表，
     必须保持竖向滚动——否则横向条会毁掉回放点选。 */
  .move-history:has(.replay-move){ flex-direction:column; overflow-x:hidden; overflow-y:auto; max-height:38vh; }
  .move-history:has(.replay-move) > div{ flex:initial; }

  /* 棋盘外框内边距收小 */
  #chessBoard{ padding:8px !important; }
}
/* 小屏再收紧一档：压缩卡片内边距与标题，不减少任何功能 */
@media (max-width: 1023px){
  main .bg-white.rounded-lg.p-4{ padding:.6rem .7rem; }
  main .bg-white h3{ font-size:.9rem; margin-bottom:.25rem; }
  main > .flex{ gap:8px !important; }
  header{ padding-top:4px; padding-bottom:4px; }
  header h1{ font-size:1.05rem; }
  .move-history{ margin-top:.15rem; }
  .captured-tray{ margin-top:.15rem; }
}


