● Zion Boggan
repos/Docket/app/votes/page.tsx
zionboggan.com ↗
113 lines · tsx
History for this file →
1
import type { Metadata } from "next";
2
import Link from "next/link";
3
import { Suspense } from "react";
4
import { PageHeader } from "@/components/ui";
5
import { CiteThis } from "@/components/cite-this";
6
import { VotesBrowser } from "@/components/votes-browser";
7
 
8
export const metadata: Metadata = {
9
  title: "Votes",
10
  description:
11
    "Recorded roll-call votes of the U.S. House and Senate. Filter by chamber or keyword. Every vote links to its official record.",
12
};
13
 
14
export const revalidate = 300;
15
 
16
export default function VotesPage() {
17
  return (
18
    <div
19
      className="mx-auto w-full max-w-[860px] px-6 sm:px-8"
20
      style={{
21
        paddingTop: "clamp(32px, 6vw, 56px)",
22
        paddingBottom: "clamp(48px, 8vw, 80px)",
23
      }}
24
    >
25
      {}
26
      <nav aria-label="Breadcrumb" className="mb-10">
27
        <ol className="flex flex-wrap items-center gap-2" style={{ marginBottom: "12px" }}>
28
          <li>
29
            <Link
30
              href="/"
31
              className="focus-ring label no-underline hover:underline"
32
              style={{ color: "var(--dk-signal)", fontSize: "12px", letterSpacing: "0.12em" }}
33
            >
34
              Home
35
            </Link>
36
          </li>
37
          <li aria-hidden="true" className="label" style={{ color: "var(--dk-ash-2)", fontSize: "12px" }}>
38
            /
39
          </li>
40
          <li
41
            className="label"
42
            style={{ color: "var(--dk-ash)", fontSize: "12px", letterSpacing: "0.12em" }}
43
            aria-current="page"
44
          >
45
            Votes
46
          </li>
47
        </ol>
48
        <Link
49
          href="/"
50
          className="focus-ring tap no-underline hover:underline"
51
          style={{
52
            display: "inline-flex",
53
            alignItems: "center",
54
            gap: "8px",
55
            fontFamily: "var(--font-mono), ui-monospace, monospace",
56
            fontSize: "13px",
57
            letterSpacing: "0.08em",
58
            color: "var(--dk-signal)",
59
          }}
60
        >
61
          ← Back to home
62
        </Link>
63
      </nav>
64
 
65
      <PageHeader
66
        eyebrow="Roll-call register"
67
        title="Votes, on the record"
68
        lead="Each row is a recorded vote in the House or Senate -what it was about, the tally, and a link to the official roll call. Open any vote to see how every member voted."
69
      />
70
 
71
      <Suspense fallback={<VotesSkeleton />}>
72
        <VotesBrowser />
73
      </Suspense>
74
 
75
      {}
76
      <div
77
        style={{
78
          marginTop: "clamp(40px, 7vw, 72px)",
79
          borderTop: "1px solid var(--dk-line)",
80
          paddingTop: "clamp(24px, 4vw, 40px)",
81
        }}
82
      >
83
        <p className="label mb-8" style={{ color: "var(--dk-ash-2)" }}>
84
          Roll-call votes from clerk.house.gov and senate.gov XML feeds. Order is
85
          by date -no editorial weighting.
86
        </p>
87
        <p className="label mb-4" style={{ color: "var(--dk-ash)" }}>
88
          Cite this page
89
        </p>
90
        <CiteThis
91
          kind="page"
92
          title="Votes -Roll-call register"
93
          permalink="https://usdocket.org/votes"
94
          sourceUrl="https://clerk.house.gov/evs/ https://www.senate.gov/legislative/votes_new.htm"
95
        />
96
      </div>
97
    </div>
98
  );
99
}
100
 
101
function VotesSkeleton() {
102
  return (
103
    <div className="mt-8">
104
      <div className="h-14 w-full animate-pulse rounded-sm bg-graphite" />
105
      <div className="mt-8 mb-4 h-4 w-40 animate-pulse rounded-sm bg-graphite" />
106
      <div className="space-y-1">
107
        {Array.from({ length: 16 }).map((_, i) => (
108
          <div key={i} className="h-12 w-full animate-pulse rounded-sm bg-graphite" />
109
        ))}
110
      </div>
111
    </div>
112
  );
113
}