  :root {
    --dur-tap: 120ms;
    --dur-menu: 180ms;
    --dur-modal: 260ms;
    --dur-page: 300ms;
    --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
    --ease-in: cubic-bezier(0.4, 0, 1, 1);
  }
  @media (prefers-reduced-motion: reduce) {
    :root {
      --dur-tap: 1ms;
      --dur-menu: 1ms;
      --dur-modal: 80ms;
      --dur-page: 1ms;
    }
  }
  button, .tap-scale {
    transition: transform var(--dur-tap) var(--ease-out);
  }
  button:active, .tap-scale:active {
    transform: scale(0.96);
    transition-duration: 60ms;
  }
  @media (prefers-reduced-motion: reduce) {
    button:active, .tap-scale:active { transform: none; }
  }

  @keyframes gfModalIn {
    from { opacity: 0; transform: scale(var(--modal-from-scale, 0.92)) translate(var(--modal-from-x, 0), var(--modal-from-y, 0)); }
    to { opacity: 1; transform: scale(1) translate(0, 0); }
  }
  @keyframes gfModalOut {
    from { opacity: 1; transform: scale(1) translate(0, 0); }
    to { opacity: 0; transform: scale(var(--modal-from-scale, 0.92)) translate(var(--modal-from-x, 0), var(--modal-from-y, 0)); }
  }
  @keyframes gfBackdropIn { from { opacity: 0; } to { opacity: 1; } }
  @keyframes gfBackdropOut { from { opacity: 1; } to { opacity: 0; } }
  @keyframes gfSheetIn { from { transform: translateY(100%); } to { transform: translateY(0); } }
  @keyframes gfSheetOut { from { transform: translateY(0); } to { transform: translateY(100%); } }
  @keyframes gfPageInFromRight { from { transform: translateX(100%); } to { transform: translateX(0); } }
  @keyframes gfPageOutToRight { from { transform: translateX(0); } to { transform: translateX(100%); } }
  @keyframes gfPageOldOutSubtle { from { transform: translateX(0); opacity: 1; } to { transform: translateX(-18%); opacity: 0.6; } }
  @keyframes gfPageOldInSubtle { from { transform: translateX(-18%); opacity: 0.6; } to { transform: translateX(0); opacity: 1; } }
  @keyframes gfMenuIn { from { opacity: 0; transform: translateY(-4px) scaleY(0.96); } to { opacity: 1; transform: translateY(0) scaleY(1); } }
  @keyframes gfMenuOut { from { opacity: 1; transform: translateY(0) scaleY(1); } to { opacity: 0; transform: translateY(-4px) scaleY(0.96); } }
  @media (prefers-reduced-motion: reduce) {
    @keyframes gfModalIn { from { opacity: 0; } to { opacity: 1; } }
    @keyframes gfModalOut { from { opacity: 1; } to { opacity: 0; } }
    @keyframes gfSheetIn { from { opacity: 0; } to { opacity: 1; } }
    @keyframes gfSheetOut { from { opacity: 1; } to { opacity: 0; } }
    @keyframes gfPageInFromRight { from { opacity: 0; } to { opacity: 1; } }
    @keyframes gfPageOutToRight { from { opacity: 1; } to { opacity: 0; } }
  }

  .gf-collapsible {
    display: grid;
    grid-template-rows: 0fr;
    opacity: 0;
    transition: grid-template-rows var(--dur-menu) var(--ease-out), opacity var(--dur-menu) var(--ease-out);
  }
  .gf-collapsible.open {
    grid-template-rows: 1fr;
    opacity: 1;
  }
  .gf-collapsible > div {
    overflow: hidden;
    min-height: 0;
  }

  @keyframes spin {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
  }
  @keyframes gfCircleDraw {
    from { stroke-dashoffset: 201; }
    to { stroke-dashoffset: 0; }
  }
  @keyframes gfTickDraw {
    from { stroke-dashoffset: 40; }
    to { stroke-dashoffset: 0; }
  }
  @keyframes smokeDriftA {
    0% { transform: translate(-10vw, 15vh) scale(0.8); opacity: 0; }
    20% { opacity: 0.16; }
    50% { transform: translate(20vw, -20vh) scale(1.15); opacity: 0.12; }
    80% { opacity: 0.08; }
    100% { transform: translate(60vw, -55vh) scale(1.4); opacity: 0; }
  }
  @keyframes smokeDriftB {
    0% { transform: translate(110vw, 20vh) scale(1.1); opacity: 0; }
    20% { opacity: 0.14; }
    50% { transform: translate(70vw, -15vh) scale(0.9); opacity: 0.1; }
    80% { opacity: 0.06; }
    100% { transform: translate(20vw, -60vh) scale(1.3); opacity: 0; }
  }
  @keyframes smokeDriftC {
    0% { transform: translate(30vw, 110vh) scale(0.9); opacity: 0; }
    20% { opacity: 0.15; }
    55% { transform: translate(55vw, 45vh) scale(1.2); opacity: 0.1; }
    100% { transform: translate(80vw, -30vh) scale(1.5); opacity: 0; }
  }
  @keyframes smokeDriftD {
    0% { transform: translate(90vw, 100vh) scale(1); opacity: 0; }
    25% { opacity: 0.13; }
    60% { transform: translate(40vw, 40vh) scale(1.25); opacity: 0.08; }
    100% { transform: translate(-10vw, -20vh) scale(1.5); opacity: 0; }
  }
  @keyframes smokeDriftE {
    0% { transform: translate(50vw, -20vh) scale(0.85); opacity: 0; }
    20% { opacity: 0.12; }
    50% { transform: translate(10vw, 30vh) scale(1.1); opacity: 0.09; }
    100% { transform: translate(-40vw, 90vh) scale(1.4); opacity: 0; }
  }
  *, *::before, *::after {
    box-sizing: border-box;
  }
  html, body {
    overflow-x: hidden;
    -webkit-text-size-adjust: 100%;
  }
  button, input, select, textarea {
    -webkit-tap-highlight-color: transparent;
  }
  button {
    touch-action: manipulation;
  }
  .admin-bubble:hover, .admin-bubble:active {
    opacity: 1 !important;
  }
  .members-table-view { display: block; }
  .members-cards-view { display: none; }

  @media (max-width: 720px) {
    .members-table-view { display: none; }
    .members-cards-view { display: block; }
  }
  @media (max-width: 640px) {
    .admin-topbar {
      flex-direction: column;
      align-items: stretch !important;
      gap: 14px;
    }
    .admin-tab-panel {
      padding-left: 16px !important;
      padding-right: 16px !important;
      padding-top: 20px !important;
    }
  }

  @media (max-width: 480px) {
    .kiosk-center {
      padding-left: 14px !important;
      padding-right: 14px !important;
    }
    .kiosk-card {
      padding: 24px 20px !important;
    }
  }
  input[type="date"] {
    -webkit-appearance: none;
    appearance: none;
    min-width: 0;
    max-width: 100%;
  }
