Zion Boggan
repos/Docket/app/page.tsx
zionboggan.com ↗
474 lines · tsx
History for this file →
1
import type { Metadata } from "next";
2
import Link from "next/link";
3
 
4
export const metadata: Metadata = {
5
  title: "Docket - The public record of the U.S. government",
6
  description:
7
    "Docket is a neutral, sourced record of official federal government activity: bills, votes, spending, and more. Every fact links to its official .gov source.",
8
};
9
 
10
export const revalidate = 3600;
11
 
12
const SECTIONS = [
13
  {
14
    href: "/bills",
15
    kicker: "Legislation",
16
    title: "Bills",
17
    desc: "Laws and legislation in progress. Status, sponsor, what changed between versions, and the official record.",
18
  },
19
  {
20
    href: "/votes",
21
    kicker: "Roll Calls",
22
    title: "Votes",
23
    desc: "House and Senate roll-call votes. See how every member voted, by name.",
24
  },
25
  {
26
    href: "/laws",
27
    kicker: "Enacted",
28
    title: "Laws",
29
    desc: "Bills that have become law. Each Public Law links to the bill it came from and the official record.",
30
  },
31
  {
32
    href: "/members",
33
    kicker: "Congress",
34
    title: "Representatives",
35
    desc: "Every member of Congress. Party, state, vote record, and bills sponsored.",
36
  },
37
  {
38
    href: "/spending",
39
    kicker: "Fiscal",
40
    title: "Spending",
41
    desc: "Federal awards and contracts from USAspending.gov. Where the dollars go.",
42
  },
43
  {
44
    href: "/states",
45
    kicker: "Regional",
46
    title: "States",
47
    desc: "Bills, members, and federal activity organized by your state.",
48
  },
49
  {
50
    href: "/register",
51
    kicker: "Live Feed",
52
    title: "What's happening",
53
    desc: "A chronological feed of government actions: bills passed, votes taken, dollars awarded. No editorial weighting.",
54
  },
55
] as const;
56
 
57
const MORE_LINKS = [
58
  { href: "/calendar", label: "Calendar" },
59
  { href: "/schedule", label: "Schedule" },
60
  { href: "/executive", label: "Executive orders" },
61
  { href: "/categories", label: "Browse by topic" },
62
  { href: "/search", label: "Search everything" },
63
] as const;
64
 
65
export default function HomePage() {
66
  return (
67
    <div
68
      style={{
69
        background: "var(--dk-hero-glow)",
70
      }}
71
    >
72
      {}
73
      <section
74
        aria-label="Introduction"
75
        style={{
76
          maxWidth: "860px",
77
          margin: "0 auto",
78
          padding: "clamp(56px, 10vw, 120px) 24px clamp(48px, 8vw, 96px)",
79
        }}
80
      >
81
        {}
82
        <p
83
          className="label"
84
          style={{
85
            color: "var(--dk-signal)",
86
            marginBottom: "28px",
87
            display: "flex",
88
            alignItems: "center",
89
            gap: "10px",
90
          }}
91
        >
92
          <span
93
            aria-hidden="true"
94
            style={{
95
              width: "6px",
96
              height: "6px",
97
              borderRadius: "50%",
98
              background: "var(--dk-signal)",
99
              boxShadow: "0 0 0 3px rgba(224,165,59,0.18)",
100
              display: "inline-block",
101
              flexShrink: 0,
102
            }}
103
          />
104
          Docket · Federal Record
105
        </p>
106
 
107
        {}
108
        <h1
109
          className="font-display text-paper"
110
          style={{
111
            fontSize: "clamp(2.8rem, 9vw, 5.5rem)",
112
            fontWeight: 900,
113
            lineHeight: 1.0,
114
            letterSpacing: "-0.01em",
115
            wordSpacing: "0.06em",
116
            textTransform: "uppercase",
117
            maxWidth: "16ch",
118
            marginBottom: "32px",
119
          }}
120
        >
121
          The Public Record of the U.S. Government
122
        </h1>
123
 
124
        {}
125
        <p
126
          className="font-prose"
127
          style={{
128
            fontStyle: "italic",
129
            fontSize: "clamp(1.0625rem, 2vw, 1.25rem)",
130
            lineHeight: 1.55,
131
            color: "var(--dk-ash)",
132
            maxWidth: "48ch",
133
            marginBottom: "40px",
134
          }}
135
        >
136
          Bills, votes, and dollars straight from official government sources.
137
          No spin. No opinion. Every fact links to its{" "}
138
          <span style={{ whiteSpace: "nowrap" }}>
139
            official{" "}
140
            <span className="font-mono not-italic" style={{ fontSize: "0.9em" }}>
141
              .gov
142
            </span>
143
          </span>{" "}
144
          source.
145
        </p>
146
 
147
        {}
148
        <div style={{ display: "flex", flexWrap: "wrap", gap: "12px" }}>
149
          <Link
150
            href="/search"
151
            className="focus-ring no-underline"
152
            style={{
153
              display: "inline-flex",
154
              alignItems: "center",
155
              gap: "9px",
156
              height: "48px",
157
              padding: "0 22px",
158
              background: "var(--dk-signal)",
159
              color: "var(--dk-ink)",
160
              fontFamily: "var(--font-mono), ui-monospace, monospace",
161
              fontSize: "12.5px",
162
              fontWeight: 700,
163
              letterSpacing: "0.1em",
164
              textTransform: "uppercase",
165
              borderRadius: "9px",
166
              border: "1px solid transparent",
167
              transition: "background 0.2s, transform 0.15s",
168
              boxShadow: "0 8px 22px -8px rgba(224,165,59,0.45)",
169
            }}
170
          >
171
            <SearchIcon />
172
            Search everything
173
          </Link>
174
 
175
          <Link
176
            href="/bills"
177
            className="focus-ring no-underline"
178
            style={{
179
              display: "inline-flex",
180
              alignItems: "center",
181
              height: "48px",
182
              padding: "0 22px",
183
              background: "transparent",
184
              color: "var(--dk-paper)",
185
              fontFamily: "var(--font-mono), ui-monospace, monospace",
186
              fontSize: "12.5px",
187
              fontWeight: 400,
188
              letterSpacing: "0.1em",
189
              textTransform: "uppercase",
190
              borderRadius: "9px",
191
              border: "1px solid var(--dk-line)",
192
              transition: "border-color 0.2s, background 0.2s",
193
            }}
194
          >
195
            Browse bills
196
          </Link>
197
        </div>
198
      </section>
199
 
200
      {}
201
      <section
202
        aria-label="Browse sections"
203
        style={{
204
          maxWidth: "860px",
205
          margin: "0 auto",
206
          padding: "0 24px clamp(40px, 8vw, 80px)",
207
        }}
208
      >
209
        {}
210
        <p
211
          className="label"
212
          style={{ color: "var(--dk-ash)", marginBottom: "28px" }}
213
        >
214
          What you can do here
215
        </p>
216
 
217
        <div
218
          style={{
219
            display: "grid",
220
            gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))",
221
            gap: "16px",
222
          }}
223
        >
224
          {SECTIONS.map((s) => (
225
            <Link
226
              key={s.href}
227
              href={s.href}
228
              className="focus-ring no-underline"
229
              style={{
230
                display: "block",
231
                border: "1px solid var(--dk-line)",
232
                borderRadius: "10px",
233
                background: "var(--dk-surface)",
234
                padding: "28px 24px",
235
                transition: "border-color 0.2s, background 0.2s",
236
              }}
237
            >
238
              {}
239
              <p
240
                className="label"
241
                style={{ color: "var(--dk-signal)", marginBottom: "10px", fontSize: "12px", letterSpacing: "0.14em" }}
242
              >
243
                {s.kicker}
244
              </p>
245
              {}
246
              <p
247
                className="font-display text-paper"
248
                style={{
249
                  fontSize: "1.375rem",
250
                  fontWeight: 800,
251
                  letterSpacing: "-0.02em",
252
                  textTransform: "uppercase",
253
                  lineHeight: 1.05,
254
                  marginBottom: "12px",
255
                }}
256
              >
257
                {s.title}
258
              </p>
259
              {}
260
              <p
261
                className="font-prose"
262
                style={{
263
                  fontSize: "1rem",
264
                  lineHeight: 1.55,
265
                  color: "var(--dk-ash)",
266
                }}
267
              >
268
                {s.desc}
269
              </p>
270
            </Link>
271
          ))}
272
        </div>
273
      </section>
274
 
275
      {}
276
      <section
277
        aria-label="More sections"
278
        style={{
279
          maxWidth: "860px",
280
          margin: "0 auto",
281
          padding: "0 24px clamp(32px, 6vw, 56px)",
282
          borderTop: "1px solid var(--dk-line)",
283
        }}
284
      >
285
        <p
286
          className="label"
287
          style={{ color: "var(--dk-ash-2)", marginBottom: "20px", marginTop: "32px" }}
288
        >
289
          More
290
        </p>
291
        <ul
292
          style={{ display: "flex", flexWrap: "wrap", gap: "10px", listStyle: "none", padding: 0, margin: 0 }}
293
        >
294
          {MORE_LINKS.map((l) => (
295
            <li key={l.href}>
296
              <Link
297
                href={l.href}
298
                className="focus-ring no-underline"
299
                style={{
300
                  display: "inline-flex",
301
                  alignItems: "center",
302
                  minHeight: "44px",
303
                  padding: "0 16px",
304
                  border: "1px solid var(--dk-line)",
305
                  borderRadius: "8px",
306
                  background: "var(--dk-surface)",
307
                  fontFamily: "var(--font-mono), ui-monospace, monospace",
308
                  fontSize: "12px",
309
                  letterSpacing: "0.1em",
310
                  textTransform: "uppercase",
311
                  color: "var(--dk-ash)",
312
                  transition: "border-color 0.2s, color 0.2s",
313
                }}
314
              >
315
                {l.label}
316
              </Link>
317
            </li>
318
          ))}
319
        </ul>
320
      </section>
321
 
322
      {}
323
      <section
324
        aria-label="How to cite this site"
325
        style={{
326
          maxWidth: "860px",
327
          margin: "0 auto",
328
          padding: "0 24px clamp(24px, 5vw, 40px)",
329
        }}
330
      >
331
        <div
332
          style={{
333
            border: "1px solid var(--dk-line)",
334
            borderRadius: "10px",
335
            background: "var(--dk-surface)",
336
            padding: "clamp(24px, 4vw, 40px)",
337
          }}
338
        >
339
          {}
340
          <p className="label" style={{ color: "var(--dk-signal)", marginBottom: "20px", fontSize: "12px", letterSpacing: "0.14em" }}>
341
            Citations
342
          </p>
343
 
344
          <h2
345
            className="font-display text-paper"
346
            style={{
347
              fontSize: "clamp(1.5rem, 3.5vw, 2rem)",
348
              fontWeight: 900,
349
              letterSpacing: "-0.02em",
350
              textTransform: "uppercase",
351
              lineHeight: 1.0,
352
              marginBottom: "20px",
353
            }}
354
          >
355
            How to cite this site
356
          </h2>
357
 
358
          <p
359
            className="font-prose"
360
            style={{
361
              fontSize: "1.0625rem",
362
              lineHeight: 1.6,
363
              color: "var(--dk-ash)",
364
              maxWidth: "56ch",
365
            }}
366
          >
367
            On any bill, vote, or member page, scroll to the bottom and use the{" "}
368
            <strong style={{ color: "var(--dk-paper)" }}>Cite this record</strong>{" "}
369
            panel. It fills in the author, date, title, permalink, and the official
370
            government source automatically - in APA, MLA, or Chicago format.
371
          </p>
372
 
373
          <div
374
            style={{
375
              marginTop: "24px",
376
              borderTop: "1px solid var(--dk-line)",
377
              paddingTop: "20px",
378
              fontFamily: "var(--font-mono), ui-monospace, monospace",
379
              fontSize: "13px",
380
              color: "var(--dk-ash)",
381
              fontStyle: "italic",
382
            }}
383
          >
384
            <span style={{ color: "var(--dk-ash-2)", fontStyle: "normal", fontSize: "12px", letterSpacing: "0.08em", textTransform: "uppercase" }}>Example APA · </span>
385
            <span style={{ fontStyle: "normal" }}>
386
              Docket. (2025). H.R. 22 - [Title]. usdocket.org. Retrieved from https://congress.gov/...
387
            </span>
388
          </div>
389
        </div>
390
      </section>
391
 
392
      {}
393
      <section
394
        aria-label="About this site"
395
        style={{
396
          maxWidth: "860px",
397
          margin: "0 auto",
398
          padding: "clamp(16px, 3vw, 24px) 24px clamp(56px, 10vw, 96px)",
399
        }}
400
      >
401
        <div
402
          style={{
403
            border: "1px solid var(--dk-line)",
404
            borderRadius: "10px",
405
            background: "var(--dk-surface)",
406
            padding: "clamp(24px, 4vw, 36px)",
407
          }}
408
        >
409
          <p className="label" style={{ color: "var(--dk-ash-2)", marginBottom: "16px", fontSize: "12px", letterSpacing: "0.14em" }}>
410
            About this site
411
          </p>
412
          <p
413
            className="font-prose"
414
            style={{
415
              fontSize: "1rem",
416
              lineHeight: 1.6,
417
              color: "var(--dk-ash)",
418
              maxWidth: "62ch",
419
            }}
420
          >
421
            Docket is neutral by design. It does not editorialize, rank by political
422
            popularity, or surface opinion. The feed is ordered by action date and
423
            dollar magnitude only - the same factors as the official record. Party
424
            colors appear only in desaturated, equal-weight tones. No comment
425
            section. No ads. All source links open the official .gov record directly.
426
          </p>
427
          <div
428
            style={{
429
              marginTop: "20px",
430
              display: "flex",
431
              flexWrap: "wrap",
432
              gap: "20px",
433
            }}
434
          >
435
            <Link
436
              href="/how-we-pick"
437
              className="focus-ring label underline underline-offset-4"
438
              style={{ color: "var(--dk-signal)", fontSize: "12px", letterSpacing: "0.1em" }}
439
            >
440
              How we pick what to show
441
            </Link>
442
            <Link
443
              href="/who-pays"
444
              className="focus-ring label underline underline-offset-4"
445
              style={{ color: "var(--dk-signal)", fontSize: "12px", letterSpacing: "0.1em" }}
446
            >
447
              Who pays for this
448
            </Link>
449
          </div>
450
        </div>
451
      </section>
452
    </div>
453
  );
454
}
455
 
456
function SearchIcon() {
457
  return (
458
    <svg
459
      aria-hidden="true"
460
      width="16"
461
      height="16"
462
      viewBox="0 0 16 16"
463
      fill="none"
464
      stroke="currentColor"
465
      strokeWidth="1.75"
466
      strokeLinecap="round"
467
      strokeLinejoin="round"
468
      style={{ flexShrink: 0 }}
469
    >
470
      <circle cx="6.5" cy="6.5" r="4.5" />
471
      <line x1="10.5" y1="10.5" x2="14" y2="14" />
472
    </svg>
473
  );
474
}