rxform 0.1.2

Rust implementation of pyxform: convert XLSForm spreadsheets to ODK XForm XML
Documentation
@import "tailwindcss";

@source "../docs/index.html";

@theme {
  --font-display: "Fraunces", "Georgia", serif;
  --font-body: "IBM Plex Sans", "Helvetica Neue", sans-serif;
  --font-mono: "IBM Plex Mono", "SFMono-Regular", monospace;

  --color-ink: #1b2a41;
  --color-inksoft: #46587a;
  --color-paper: #faf6ee;
  --color-card: #fffdf8;
  --color-line: #e3dbc9;
  --color-amber: #a86f1f;
  --color-blue: #3b6ea5;
  --color-green: #2f7d49;
  --color-purple: #7a4bd6;
  --color-red: #b3403a;
  --color-term: #131a26;
  --color-termtext: #d5e2f2;
}

/* ---------- surface variables: light is the canonical datasheet ---------- */
@layer base {
  :root {
    --bg: var(--color-paper);
    --surface: var(--color-card);
    --text: var(--color-ink);
    --muted: var(--color-inksoft);
    --rule: var(--color-line);
    --grid-line: rgba(59, 110, 165, 0.09);
    --accent: var(--color-amber);
    --cellhead: #f1ead9;
  }
  @media (prefers-color-scheme: dark) {
    :root {
      --bg: #10141d;
      --surface: #161c28;
      --text: #e6ecf5;
      --muted: #9fadc4;
      --rule: #2a3347;
      --grid-line: rgba(110, 163, 221, 0.08);
      --accent: #d3a04c;
      --cellhead: #1d2534;
    }
  }
  html {
    scroll-behavior: smooth;
  }
  body {
    background-color: var(--bg);
    color: var(--text);
    font-family: var(--font-body);
    -webkit-font-smoothing: antialiased;
  }
  ::selection {
    background: var(--accent);
    color: var(--bg);
  }
}

/* ---------- worksheet-grid backdrop ---------- */
@utility sheet-grid {
  background-image:
    linear-gradient(var(--grid-line) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
  background-size: 56px 32px;
}

@utility rule-y {
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}

/* ---------- entrance choreography ---------- */
@keyframes rise {
  from {
    opacity: 0;
    transform: translateY(14px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
@utility rise-* {
  animation: rise 0.7s cubic-bezier(0.2, 0.7, 0.2, 1) both;
  animation-delay: calc(--value(integer) * 90ms);
}

@keyframes caret {
  0%, 45% { opacity: 1; }
  50%, 100% { opacity: 0; }
}
@utility caret-blink {
  animation: caret 1.1s steps(1) infinite;
}

/* scroll reveals (progressive enhancement, JS adds .in) */
@utility reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.7s ease, transform 0.7s cubic-bezier(0.2, 0.7, 0.2, 1);
}
.reveal.in {
  opacity: 1;
  transform: none;
}
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
  [class*="rise-"] { animation: none; }
}