chore: remove reference design
@@ -1,15 +0,0 @@
|
|||||||
# v0 sandbox internal files
|
|
||||||
__v0_runtime_loader.js
|
|
||||||
__v0_devtools.tsx
|
|
||||||
__v0_jsx-dev-runtime.ts
|
|
||||||
.snowflake/
|
|
||||||
.v0-trash/
|
|
||||||
.vercel/
|
|
||||||
|
|
||||||
# Environment variables
|
|
||||||
.env*.local
|
|
||||||
|
|
||||||
# Common ignores
|
|
||||||
node_modules
|
|
||||||
.next/
|
|
||||||
.DS_Store
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
import { notFound } from 'next/navigation'
|
|
||||||
import Link from 'next/link'
|
|
||||||
import Image from 'next/image'
|
|
||||||
import { DOSSIERS, getDossier } from '@/lib/dossiers'
|
|
||||||
import { CONTENT } from '@/lib/dossier-content'
|
|
||||||
import { SiteHeader, SiteFooter } from '@/components/site-chrome'
|
|
||||||
import {
|
|
||||||
Stamp,
|
|
||||||
OverlayStamp,
|
|
||||||
FieldRow,
|
|
||||||
SectionTitle,
|
|
||||||
Perforation,
|
|
||||||
} from '@/components/doc-elements'
|
|
||||||
|
|
||||||
export function generateStaticParams() {
|
|
||||||
return DOSSIERS.map((d) => ({ slug: d.slug }))
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async function DossierPage({
|
|
||||||
params,
|
|
||||||
}: {
|
|
||||||
params: Promise<{ slug: string }>
|
|
||||||
}) {
|
|
||||||
const { slug } = await params
|
|
||||||
const dossier = getDossier(slug)
|
|
||||||
const content = CONTENT[slug]
|
|
||||||
if (!dossier || !content) notFound()
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="min-h-screen">
|
|
||||||
<SiteHeader />
|
|
||||||
|
|
||||||
<div className="banner-classified border-y border-foreground/30">
|
|
||||||
<div className="mx-auto flex max-w-4xl items-center justify-between gap-4 px-4 py-1.5 text-[0.65rem] font-700 uppercase tracking-[0.2em] sm:px-6">
|
|
||||||
<span>{dossier.classification}</span>
|
|
||||||
<span className="hidden sm:inline">Дело № {dossier.code}</span>
|
|
||||||
<span>Экз. № 1</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<main className="mx-auto max-w-4xl px-4 py-8 sm:px-6">
|
|
||||||
<Link
|
|
||||||
href="/"
|
|
||||||
className="font-heading text-xs font-600 uppercase tracking-wider text-muted-foreground hover:text-primary"
|
|
||||||
>
|
|
||||||
← Вернуться в картотеку
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
<article className="paper relative mt-4 -rotate-[0.3deg] p-6 sm:p-10">
|
|
||||||
<span className="tape -top-3 left-1/2 hidden -translate-x-1/2 rotate-1 sm:block" aria-hidden="true" />
|
|
||||||
|
|
||||||
{/* corner stamp */}
|
|
||||||
<div className="pointer-events-none absolute right-3 top-4 rotate-[9deg] sm:right-8 sm:top-10">
|
|
||||||
<OverlayStamp className="text-xl sm:text-3xl">
|
|
||||||
{dossier.classification}
|
|
||||||
</OverlayStamp>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<header className="pb-5">
|
|
||||||
<p className="font-mono text-[0.7rem] uppercase tracking-[0.25em] text-muted-foreground">
|
|
||||||
{dossier.category} · Дело № {dossier.code} · Угроза{' '}
|
|
||||||
{dossier.threat}
|
|
||||||
</p>
|
|
||||||
<h1 className="mt-3 max-w-2xl text-balance font-heading text-3xl font-700 uppercase leading-[0.95] tracking-tight sm:text-5xl">
|
|
||||||
{dossier.name}
|
|
||||||
</h1>
|
|
||||||
<p className="mt-3 max-w-2xl text-sm italic leading-relaxed text-muted-foreground">
|
|
||||||
{dossier.fullName}
|
|
||||||
</p>
|
|
||||||
<hr className="rule rule-red mt-5" />
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{/* Spec table */}
|
|
||||||
<section className="mt-2">
|
|
||||||
<dl>
|
|
||||||
{content.fields.map((f) => (
|
|
||||||
<FieldRow key={f.label} label={f.label}>
|
|
||||||
{f.value}
|
|
||||||
</FieldRow>
|
|
||||||
))}
|
|
||||||
</dl>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Blueprint */}
|
|
||||||
{content.hasBlueprint && (
|
|
||||||
<figure className="paper paper-strong mt-8 p-3">
|
|
||||||
<Image
|
|
||||||
src="/blueprint-lopata.png"
|
|
||||||
alt={`Технический чертёж изделия ${dossier.name}`}
|
|
||||||
width={1200}
|
|
||||||
height={800}
|
|
||||||
className="h-auto w-full mix-blend-multiply"
|
|
||||||
/>
|
|
||||||
<figcaption className="mt-2 border-t border-dashed border-border pt-2 text-center font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
Рис. 1 — Чертёж общего вида · ГОСТ-садовый 12-86
|
|
||||||
</figcaption>
|
|
||||||
</figure>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Photo */}
|
|
||||||
{content.hasPhoto && (
|
|
||||||
<figure className="paper paper-strong mt-8 max-w-sm rotate-1 p-2">
|
|
||||||
<Image
|
|
||||||
src="/classified-photo.png"
|
|
||||||
alt="Рассекреченный фотоматериал"
|
|
||||||
width={600}
|
|
||||||
height={600}
|
|
||||||
className="h-auto w-full grayscale"
|
|
||||||
/>
|
|
||||||
<figcaption className="mt-2 border-t border-dashed border-border pt-2 font-mono text-[0.6rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
Фотоматериал · участок №6 · 03:14
|
|
||||||
</figcaption>
|
|
||||||
</figure>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Sections */}
|
|
||||||
<div className="mt-10 space-y-10">
|
|
||||||
{content.sections.map((s) => (
|
|
||||||
<section key={s.index}>
|
|
||||||
<SectionTitle index={s.index}>{s.title}</SectionTitle>
|
|
||||||
<div className="text-sm leading-relaxed text-foreground/90">
|
|
||||||
{s.body}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Signature block */}
|
|
||||||
<footer className="mt-12 grid grid-cols-1 gap-6 border-t border-dashed border-border pt-6 sm:grid-cols-2">
|
|
||||||
<div>
|
|
||||||
<p className="text-[0.7rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
Утвердил
|
|
||||||
</p>
|
|
||||||
<p className="mt-3 font-heading text-base font-600">
|
|
||||||
Председатель Трибунала
|
|
||||||
</p>
|
|
||||||
<p className="mt-1 border-b border-foreground/50 pb-1 font-mono text-sm text-muted-foreground">
|
|
||||||
подпись: [ИЗЪЯТО]
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-start justify-end">
|
|
||||||
<Image
|
|
||||||
src="/emblem.png"
|
|
||||||
alt=""
|
|
||||||
width={90}
|
|
||||||
height={90}
|
|
||||||
className="h-20 w-20 rotate-6 opacity-80 mix-blend-multiply"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
{/* Cross-references */}
|
|
||||||
<section className="mt-10">
|
|
||||||
<h2 className="mb-1 font-heading text-lg font-700 uppercase tracking-wide">
|
|
||||||
См. также
|
|
||||||
</h2>
|
|
||||||
<hr className="rule mb-5 w-40" />
|
|
||||||
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
||||||
{DOSSIERS.filter((d) => d.slug !== slug)
|
|
||||||
.slice(0, 4)
|
|
||||||
.map((d) => (
|
|
||||||
<Link
|
|
||||||
key={d.slug}
|
|
||||||
href={`/dossier/${d.slug}`}
|
|
||||||
className="paper flex items-center justify-between px-3 py-2.5 text-sm transition-all hover:-translate-y-0.5 hover:text-primary"
|
|
||||||
>
|
|
||||||
<span className="font-heading uppercase tracking-wide">
|
|
||||||
{d.name}
|
|
||||||
</span>
|
|
||||||
<span className="font-mono text-[0.65rem] text-muted-foreground">
|
|
||||||
{d.code}
|
|
||||||
</span>
|
|
||||||
</Link>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<div className="mt-12">
|
|
||||||
<Perforation />
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<SiteFooter />
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,230 +0,0 @@
|
|||||||
@import 'tailwindcss';
|
|
||||||
@import 'tw-animate-css';
|
|
||||||
@import 'shadcn/tailwind.css';
|
|
||||||
|
|
||||||
@custom-variant dark (&:is(.dark *));
|
|
||||||
|
|
||||||
@theme inline {
|
|
||||||
--font-heading: var(--font-oswald);
|
|
||||||
--font-sans: var(--font-plex-mono), 'Geist Fallback';
|
|
||||||
--font-mono: var(--font-plex-mono), 'Geist Mono Fallback';
|
|
||||||
--color-sidebar-ring: var(--sidebar-ring);
|
|
||||||
--color-sidebar-border: var(--sidebar-border);
|
|
||||||
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
||||||
--color-sidebar-accent: var(--sidebar-accent);
|
|
||||||
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
||||||
--color-sidebar-primary: var(--sidebar-primary);
|
|
||||||
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
||||||
--color-sidebar: var(--sidebar);
|
|
||||||
--color-chart-5: var(--chart-5);
|
|
||||||
--color-chart-4: var(--chart-4);
|
|
||||||
--color-chart-3: var(--chart-3);
|
|
||||||
--color-chart-2: var(--chart-2);
|
|
||||||
--color-chart-1: var(--chart-1);
|
|
||||||
--color-ring: var(--ring);
|
|
||||||
--color-input: var(--input);
|
|
||||||
--color-border: var(--border);
|
|
||||||
--color-destructive: var(--destructive);
|
|
||||||
--color-accent-foreground: var(--accent-foreground);
|
|
||||||
--color-accent: var(--accent);
|
|
||||||
--color-muted-foreground: var(--muted-foreground);
|
|
||||||
--color-muted: var(--muted);
|
|
||||||
--color-secondary-foreground: var(--secondary-foreground);
|
|
||||||
--color-secondary: var(--secondary);
|
|
||||||
--color-primary-foreground: var(--primary-foreground);
|
|
||||||
--color-primary: var(--primary);
|
|
||||||
--color-popover-foreground: var(--popover-foreground);
|
|
||||||
--color-popover: var(--popover);
|
|
||||||
--color-card-foreground: var(--card-foreground);
|
|
||||||
--color-card: var(--card);
|
|
||||||
--color-foreground: var(--foreground);
|
|
||||||
--color-background: var(--background);
|
|
||||||
--color-stamp: var(--stamp);
|
|
||||||
--color-ink: var(--ink);
|
|
||||||
--color-ink-soft: var(--ink-soft);
|
|
||||||
--radius-sm: calc(var(--radius) * 0.6);
|
|
||||||
--radius-md: calc(var(--radius) * 0.8);
|
|
||||||
--radius-lg: var(--radius);
|
|
||||||
--radius-xl: calc(var(--radius) * 1.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
|
||||||
/* Aged paper / Soviet document palette — warm, low-contrast, sepia ink */
|
|
||||||
--background: oklch(0.9 0.028 78);
|
|
||||||
--foreground: oklch(0.32 0.03 52);
|
|
||||||
--card: oklch(0.945 0.024 84);
|
|
||||||
--card-foreground: oklch(0.32 0.03 52);
|
|
||||||
--popover: oklch(0.945 0.024 84);
|
|
||||||
--popover-foreground: oklch(0.32 0.03 52);
|
|
||||||
--primary: oklch(0.47 0.16 30);
|
|
||||||
--primary-foreground: oklch(0.95 0.022 88);
|
|
||||||
--secondary: oklch(0.86 0.03 78);
|
|
||||||
--secondary-foreground: oklch(0.34 0.03 52);
|
|
||||||
--muted: oklch(0.87 0.026 80);
|
|
||||||
--muted-foreground: oklch(0.5 0.028 56);
|
|
||||||
--accent: oklch(0.47 0.16 30);
|
|
||||||
--accent-foreground: oklch(0.95 0.022 88);
|
|
||||||
--destructive: oklch(0.47 0.16 30);
|
|
||||||
--border: oklch(0.56 0.035 58 / 0.45);
|
|
||||||
--input: oklch(0.56 0.035 58 / 0.45);
|
|
||||||
--ring: oklch(0.47 0.16 30);
|
|
||||||
--stamp: oklch(0.46 0.17 30);
|
|
||||||
--ink: oklch(0.32 0.03 52);
|
|
||||||
--ink-soft: oklch(0.5 0.028 56);
|
|
||||||
--chart-1: oklch(0.47 0.16 30);
|
|
||||||
--chart-2: oklch(0.5 0.02 60);
|
|
||||||
--chart-3: oklch(0.4 0.02 55);
|
|
||||||
--chart-4: oklch(0.6 0.05 80);
|
|
||||||
--chart-5: oklch(0.3 0.02 55);
|
|
||||||
--radius: 0.125rem;
|
|
||||||
--sidebar: oklch(0.9 0.022 84);
|
|
||||||
--sidebar-foreground: oklch(0.32 0.03 52);
|
|
||||||
--sidebar-primary: oklch(0.47 0.16 30);
|
|
||||||
--sidebar-primary-foreground: oklch(0.95 0.022 88);
|
|
||||||
--sidebar-accent: oklch(0.86 0.03 78);
|
|
||||||
--sidebar-accent-foreground: oklch(0.34 0.03 52);
|
|
||||||
--sidebar-border: oklch(0.56 0.035 58 / 0.45);
|
|
||||||
--sidebar-ring: oklch(0.47 0.16 30);
|
|
||||||
}
|
|
||||||
|
|
||||||
@layer base {
|
|
||||||
* {
|
|
||||||
@apply border-border;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
@apply bg-background text-foreground;
|
|
||||||
/* layered paper: faint ledger rules + grain + warm vignette */
|
|
||||||
background-image:
|
|
||||||
/* vignette */
|
|
||||||
radial-gradient(
|
|
||||||
130% 120% at 50% 0%,
|
|
||||||
transparent 55%,
|
|
||||||
oklch(0.3 0.04 52 / 0.12) 100%
|
|
||||||
),
|
|
||||||
/* fine grain */
|
|
||||||
radial-gradient(oklch(0.3 0.03 52 / 0.05) 1px, transparent 1.4px),
|
|
||||||
radial-gradient(oklch(0.3 0.03 52 / 0.04) 1px, transparent 1.4px),
|
|
||||||
/* warm base wash */
|
|
||||||
linear-gradient(180deg, oklch(0.91 0.03 80), oklch(0.88 0.03 76));
|
|
||||||
background-size: 100% 100%, 16px 16px, 22px 22px, 100% 100%;
|
|
||||||
background-position: 0 0, 0 0, 8px 11px, 0 0;
|
|
||||||
background-attachment: fixed;
|
|
||||||
}
|
|
||||||
html {
|
|
||||||
@apply font-mono;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@layer utilities {
|
|
||||||
.font-heading {
|
|
||||||
font-family: var(--font-heading);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- Paper sheet: the core surface, replaces hard black rectangles ---- */
|
|
||||||
.paper {
|
|
||||||
position: relative;
|
|
||||||
background-color: var(--card);
|
|
||||||
background-image:
|
|
||||||
linear-gradient(
|
|
||||||
oklch(0.5 0.03 56 / 0.05) 1px,
|
|
||||||
transparent 1px
|
|
||||||
),
|
|
||||||
radial-gradient(oklch(0.3 0.03 52 / 0.04) 1px, transparent 1.3px);
|
|
||||||
background-size: 100% 30px, 18px 18px;
|
|
||||||
border: 1px solid oklch(0.5 0.04 56 / 0.35);
|
|
||||||
box-shadow:
|
|
||||||
0 1px 0 oklch(1 0 0 / 0.4) inset,
|
|
||||||
0 18px 40px -24px oklch(0.25 0.04 52 / 0.55),
|
|
||||||
0 2px 6px -3px oklch(0.25 0.04 52 / 0.3);
|
|
||||||
}
|
|
||||||
/* darker "cover/file" sheet */
|
|
||||||
.paper-strong {
|
|
||||||
background-color: oklch(0.5 0.04 56 / 0.06);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* tape strip for pinning sheets */
|
|
||||||
.tape {
|
|
||||||
position: absolute;
|
|
||||||
height: 1.6rem;
|
|
||||||
width: 6.5rem;
|
|
||||||
background: oklch(0.78 0.06 92 / 0.55);
|
|
||||||
box-shadow: 0 1px 4px oklch(0.25 0.04 52 / 0.25);
|
|
||||||
backdrop-filter: blur(0.5px);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- Document divider rules (replace border-b-2 black) ---- */
|
|
||||||
.rule {
|
|
||||||
border: 0;
|
|
||||||
border-top: 1px solid oklch(0.45 0.04 56 / 0.5);
|
|
||||||
box-shadow: 0 3px 0 -2px oklch(0.45 0.04 56 / 0.5);
|
|
||||||
}
|
|
||||||
.rule-red {
|
|
||||||
border-top-color: var(--primary);
|
|
||||||
box-shadow: 0 3px 0 -2px var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- Classification rubber stamp: rotated, distressed, translucent ---- */
|
|
||||||
.stamp {
|
|
||||||
--c: var(--stamp);
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
border: 2.5px solid var(--c);
|
|
||||||
color: var(--c);
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.1em;
|
|
||||||
font-weight: 700;
|
|
||||||
border-radius: 3px;
|
|
||||||
box-shadow: inset 0 0 0 1.5px var(--c);
|
|
||||||
opacity: 0.78;
|
|
||||||
mix-blend-mode: multiply;
|
|
||||||
/* worn ink texture */
|
|
||||||
-webkit-mask-image: radial-gradient(
|
|
||||||
oklch(0 0 0) 60%,
|
|
||||||
transparent 62%
|
|
||||||
),
|
|
||||||
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='40'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.4 1.1'/%3E%3C/filter%3E%3Crect width='80' height='40' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
||||||
-webkit-mask-composite: source-over;
|
|
||||||
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='40'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.4 1.1'/%3E%3C/filter%3E%3Crect width='80' height='40' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
||||||
mask-mode: luminance;
|
|
||||||
}
|
|
||||||
.stamp-skew {
|
|
||||||
transform: rotate(-7deg);
|
|
||||||
}
|
|
||||||
.stamp-ink {
|
|
||||||
--c: var(--ink-soft);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* big translucent overlay stamp */
|
|
||||||
.stamp-overlay {
|
|
||||||
color: var(--stamp);
|
|
||||||
border: 4px solid var(--stamp);
|
|
||||||
opacity: 0.22;
|
|
||||||
mix-blend-mode: multiply;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: 700;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
border-radius: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* redacted bar with toner-bleed edges */
|
|
||||||
.redacted {
|
|
||||||
background: var(--ink);
|
|
||||||
color: transparent;
|
|
||||||
user-select: none;
|
|
||||||
border-radius: 1px;
|
|
||||||
box-shadow: 0 0 1px 1px oklch(0.3 0.03 52 / 0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ledger-style top banner */
|
|
||||||
.banner-classified {
|
|
||||||
background:
|
|
||||||
repeating-linear-gradient(
|
|
||||||
45deg,
|
|
||||||
oklch(0.42 0.16 30),
|
|
||||||
oklch(0.42 0.16 30) 14px,
|
|
||||||
oklch(0.38 0.15 30) 14px,
|
|
||||||
oklch(0.38 0.15 30) 28px
|
|
||||||
);
|
|
||||||
color: var(--primary-foreground);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
import type { Metadata } from 'next'
|
|
||||||
import { Oswald, IBM_Plex_Mono } from 'next/font/google'
|
|
||||||
import { Analytics } from '@vercel/analytics/next'
|
|
||||||
import './globals.css'
|
|
||||||
|
|
||||||
const oswald = Oswald({
|
|
||||||
variable: '--font-oswald',
|
|
||||||
subsets: ['latin', 'cyrillic'],
|
|
||||||
weight: ['400', '500', '600', '700'],
|
|
||||||
})
|
|
||||||
|
|
||||||
const plexMono = IBM_Plex_Mono({
|
|
||||||
variable: '--font-plex-mono',
|
|
||||||
subsets: ['latin', 'cyrillic'],
|
|
||||||
weight: ['400', '500', '600', '700'],
|
|
||||||
})
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: 'АРХИВ ДНТ-7 // Дачно-Наблюдательный Трибунал',
|
|
||||||
description:
|
|
||||||
'Рассекреченный архив Дачно-Наблюдательного Трибунала №7. Документы, инструкции и уставы по противодействию рептилоидным агентам планеты Нибиру.',
|
|
||||||
generator: 'v0.app',
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function RootLayout({
|
|
||||||
children,
|
|
||||||
}: Readonly<{
|
|
||||||
children: React.ReactNode
|
|
||||||
}>) {
|
|
||||||
return (
|
|
||||||
<html
|
|
||||||
lang="ru"
|
|
||||||
className={`${oswald.variable} ${plexMono.variable} bg-background`}
|
|
||||||
>
|
|
||||||
<body className="font-mono antialiased">
|
|
||||||
{children}
|
|
||||||
{process.env.NODE_ENV === 'production' && <Analytics />}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
import Image from 'next/image'
|
|
||||||
import { DOSSIERS } from '@/lib/dossiers'
|
|
||||||
import { DossierCard } from '@/components/dossier-card'
|
|
||||||
import { SiteHeader, SiteFooter } from '@/components/site-chrome'
|
|
||||||
import { Stamp, OverlayStamp, Perforation } from '@/components/doc-elements'
|
|
||||||
|
|
||||||
const tilts = ['-0.6deg', '0.5deg', '-0.4deg', '0.7deg', '-0.5deg', '0.4deg']
|
|
||||||
|
|
||||||
export default function HomePage() {
|
|
||||||
return (
|
|
||||||
<div className="min-h-screen">
|
|
||||||
<SiteHeader />
|
|
||||||
|
|
||||||
{/* Classified banner */}
|
|
||||||
<div className="banner-classified border-y border-foreground/30">
|
|
||||||
<div className="mx-auto flex max-w-5xl items-center justify-between gap-4 px-4 py-1.5 text-[0.65rem] font-700 uppercase tracking-[0.2em] sm:px-6">
|
|
||||||
<span>Сов. Секретно</span>
|
|
||||||
<span className="hidden sm:inline">Экз. № 1 из 3</span>
|
|
||||||
<span>Хранить вечно</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<main className="mx-auto max-w-5xl px-4 py-10 sm:px-6">
|
|
||||||
{/* Hero document header */}
|
|
||||||
<section className="paper relative mb-12 -rotate-[0.4deg] p-6 sm:p-10">
|
|
||||||
<span className="tape -top-3 left-10 rotate-3" aria-hidden="true" />
|
|
||||||
<span className="tape -top-3 right-12 -rotate-2" aria-hidden="true" />
|
|
||||||
|
|
||||||
<div className="pointer-events-none absolute right-4 top-4 sm:right-8 sm:top-8">
|
|
||||||
<Image
|
|
||||||
src="/emblem.png"
|
|
||||||
alt=""
|
|
||||||
width={120}
|
|
||||||
height={120}
|
|
||||||
className="h-20 w-20 opacity-90 mix-blend-multiply sm:h-28 sm:w-28"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p className="font-mono text-xs uppercase tracking-[0.3em] text-muted-foreground">
|
|
||||||
Союз Садоводческих Кооперативов · Отдел «Грядка»
|
|
||||||
</p>
|
|
||||||
<h1 className="mt-3 max-w-2xl text-balance font-heading text-3xl font-700 uppercase leading-[0.95] tracking-tight sm:text-5xl">
|
|
||||||
Архив Дачно-Наблюдательного Трибунала №7
|
|
||||||
</h1>
|
|
||||||
<p className="mt-4 max-w-xl text-pretty text-sm leading-relaxed text-foreground/90">
|
|
||||||
Рассекреченный свод документов, инструкций и уставов по
|
|
||||||
противодействию рептилоидным агентам планеты{' '}
|
|
||||||
<span className="font-600 text-primary">Нибиру</span> на территориях
|
|
||||||
садоводческих товариществ. Допуск согласно форме А-13.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div className="mt-6 flex flex-wrap items-center gap-3">
|
|
||||||
<Stamp>Рассекречено · 06.07.2026</Stamp>
|
|
||||||
<Stamp variant="ink" skew={false}>
|
|
||||||
Подлежит изучению
|
|
||||||
</Stamp>
|
|
||||||
<span className="font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
Регистр. № ДНТ-7/04-1986
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="pointer-events-none absolute -bottom-3 right-6 rotate-[8deg] sm:right-16">
|
|
||||||
<OverlayStamp>Архивъ · ДНТ-7</OverlayStamp>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Stat strip */}
|
|
||||||
<section className="mb-12 grid grid-cols-2 gap-4 sm:grid-cols-4">
|
|
||||||
{[
|
|
||||||
{ k: 'Дел в картотеке', v: '147' },
|
|
||||||
{ k: 'Заземлено агентов', v: '38' },
|
|
||||||
{ k: 'Активных участков', v: '9' },
|
|
||||||
{ k: 'Уровень тревоги', v: 'III' },
|
|
||||||
].map((s, i) => (
|
|
||||||
<div
|
|
||||||
key={s.k}
|
|
||||||
className="paper px-4 py-5 text-center"
|
|
||||||
style={{ rotate: tilts[i] }}
|
|
||||||
>
|
|
||||||
<p className="font-heading text-3xl font-700 text-primary">
|
|
||||||
{s.v}
|
|
||||||
</p>
|
|
||||||
<p className="mt-1 text-[0.65rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
{s.k}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Catalog */}
|
|
||||||
<section>
|
|
||||||
<div className="mb-8 flex items-end justify-between">
|
|
||||||
<div>
|
|
||||||
<h2 className="font-heading text-2xl font-700 uppercase tracking-wide">
|
|
||||||
Картотека дел
|
|
||||||
</h2>
|
|
||||||
<hr className="rule rule-red mt-2 w-48" />
|
|
||||||
</div>
|
|
||||||
<p className="font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
Опись · лист 1
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
|
||||||
{DOSSIERS.map((d, i) => (
|
|
||||||
<DossierCard key={d.slug} d={d} rotate={tilts[i % tilts.length]} />
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<div className="mt-12">
|
|
||||||
<Perforation />
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<SiteFooter />
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
import Image from 'next/image'
|
|
||||||
import { SiteHeader, SiteFooter } from '@/components/site-chrome'
|
|
||||||
import { Stamp, SectionTitle, Perforation } from '@/components/doc-elements'
|
|
||||||
|
|
||||||
const STEPS = [
|
|
||||||
{
|
|
||||||
n: '01',
|
|
||||||
t: 'Обнаружение',
|
|
||||||
d: 'Зафиксировать признаки маскировки: немигающий взгляд, любовь к солнцу, неприятие соли, идеальная рассада без труда.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
n: '02',
|
|
||||||
t: 'Доклад',
|
|
||||||
d: 'Сообщить старшему по кооперативу через условный сигнал (три удара по бочке с водой).',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
n: '03',
|
|
||||||
t: 'Локализация',
|
|
||||||
d: 'Применить изделие Л.О.П.А.Т.А. (ИНВ-001) для заземления. Соблюдать меры безопасности.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
n: '04',
|
|
||||||
t: 'Экранирование',
|
|
||||||
d: 'Накрыть изделием В.Е.Д.Р.О. (ИНВ-022) для блокировки канала связи с орбитой.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
n: '05',
|
|
||||||
t: 'Регистрация',
|
|
||||||
d: 'Внести запись в журнал формы Б-2. Присвоить делу номер. Хранить вечно.',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
export default function ProtocolPage() {
|
|
||||||
return (
|
|
||||||
<div className="min-h-screen">
|
|
||||||
<SiteHeader />
|
|
||||||
|
|
||||||
<div className="banner-classified border-y border-foreground/30">
|
|
||||||
<div className="mx-auto flex max-w-4xl items-center justify-between gap-4 px-4 py-1.5 text-[0.65rem] font-700 uppercase tracking-[0.2em] sm:px-6">
|
|
||||||
<span>Для служебного пользования</span>
|
|
||||||
<span className="hidden sm:inline">Форма Б-2</span>
|
|
||||||
<span>Изучить под роспись</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<main className="mx-auto max-w-4xl px-4 py-8 sm:px-6">
|
|
||||||
<article className="paper relative -rotate-[0.3deg] p-6 sm:p-10">
|
|
||||||
<span className="tape -top-3 left-1/2 hidden -translate-x-1/2 rotate-1 sm:block" aria-hidden="true" />
|
|
||||||
<div className="pointer-events-none absolute right-4 top-4 sm:right-8 sm:top-10">
|
|
||||||
<Image
|
|
||||||
src="/emblem.png"
|
|
||||||
alt=""
|
|
||||||
width={90}
|
|
||||||
height={90}
|
|
||||||
className="h-16 w-16 opacity-80 mix-blend-multiply sm:h-20 sm:w-20"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<header className="pb-5">
|
|
||||||
<p className="font-mono text-[0.7rem] uppercase tracking-[0.25em] text-muted-foreground">
|
|
||||||
Единый полевой протокол · ДНТ-7
|
|
||||||
</p>
|
|
||||||
<h1 className="mt-3 max-w-xl text-balance font-heading text-3xl font-700 uppercase leading-[0.95] tracking-tight sm:text-5xl">
|
|
||||||
Протокол противодействия
|
|
||||||
</h1>
|
|
||||||
<div className="mt-4 flex flex-wrap gap-3">
|
|
||||||
<Stamp>Обязательно к исполнению</Stamp>
|
|
||||||
<Stamp variant="ink" skew={false}>
|
|
||||||
Ред. 1986
|
|
||||||
</Stamp>
|
|
||||||
</div>
|
|
||||||
<hr className="rule rule-red mt-5" />
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<section className="mt-8">
|
|
||||||
<SectionTitle index="§">Порядок действий</SectionTitle>
|
|
||||||
<ol className="space-y-4">
|
|
||||||
{STEPS.map((s, i) => (
|
|
||||||
<li
|
|
||||||
key={s.n}
|
|
||||||
className="paper flex gap-4 p-4"
|
|
||||||
style={{ rotate: i % 2 === 0 ? '-0.4deg' : '0.4deg' }}
|
|
||||||
>
|
|
||||||
<span className="font-heading text-3xl font-700 leading-none text-primary">
|
|
||||||
{s.n}
|
|
||||||
</span>
|
|
||||||
<div>
|
|
||||||
<h3 className="font-heading text-base font-600 uppercase tracking-wide">
|
|
||||||
{s.t}
|
|
||||||
</h3>
|
|
||||||
<p className="mt-1 text-sm leading-relaxed text-foreground/90">
|
|
||||||
{s.d}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ol>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="mt-10">
|
|
||||||
<SectionTitle index="!">Памятка наблюдателю</SectionTitle>
|
|
||||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
|
|
||||||
{[
|
|
||||||
'Соль — табельное средство демаскировки.',
|
|
||||||
'Инвентарь держать заточенным и заземлённым.',
|
|
||||||
'О немигающих соседях докладывать немедленно.',
|
|
||||||
].map((p) => (
|
|
||||||
<p
|
|
||||||
key={p}
|
|
||||||
className="paper border-l-4 border-l-primary p-3 text-sm leading-relaxed"
|
|
||||||
>
|
|
||||||
{p}
|
|
||||||
</p>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</article>
|
|
||||||
|
|
||||||
<div className="mt-12">
|
|
||||||
<Perforation />
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<SiteFooter />
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://ui.shadcn.com/schema.json",
|
|
||||||
"style": "base-nova",
|
|
||||||
"rsc": true,
|
|
||||||
"tsx": true,
|
|
||||||
"tailwind": {
|
|
||||||
"config": "",
|
|
||||||
"css": "app/globals.css",
|
|
||||||
"baseColor": "neutral",
|
|
||||||
"cssVariables": true,
|
|
||||||
"prefix": ""
|
|
||||||
},
|
|
||||||
"aliases": {
|
|
||||||
"components": "@/components",
|
|
||||||
"utils": "@/lib/utils",
|
|
||||||
"ui": "@/components/ui",
|
|
||||||
"lib": "@/lib",
|
|
||||||
"hooks": "@/hooks"
|
|
||||||
},
|
|
||||||
"iconLibrary": "lucide"
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
import { cn } from '@/lib/utils'
|
|
||||||
import type { ReactNode } from 'react'
|
|
||||||
|
|
||||||
export function Stamp({
|
|
||||||
children,
|
|
||||||
className,
|
|
||||||
skew = true,
|
|
||||||
variant = 'red',
|
|
||||||
}: {
|
|
||||||
children: ReactNode
|
|
||||||
className?: string
|
|
||||||
skew?: boolean
|
|
||||||
variant?: 'red' | 'ink'
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
className={cn(
|
|
||||||
'stamp px-2 py-1 text-[0.65rem] sm:text-xs',
|
|
||||||
variant === 'ink' && 'stamp-ink',
|
|
||||||
skew && 'stamp-skew',
|
|
||||||
className,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</span>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function OverlayStamp({
|
|
||||||
children,
|
|
||||||
className,
|
|
||||||
}: {
|
|
||||||
children: ReactNode
|
|
||||||
className?: string
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
aria-hidden="true"
|
|
||||||
className={cn(
|
|
||||||
'stamp-overlay pointer-events-none select-none px-4 py-2 font-heading text-2xl sm:text-4xl',
|
|
||||||
className,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</span>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function Redacted({ children }: { children: ReactNode }) {
|
|
||||||
return <span className="redacted px-1">{children}</span>
|
|
||||||
}
|
|
||||||
|
|
||||||
export function FieldRow({
|
|
||||||
label,
|
|
||||||
children,
|
|
||||||
}: {
|
|
||||||
label: string
|
|
||||||
children: ReactNode
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<div className="grid grid-cols-1 gap-1 border-b border-dashed border-border py-3 sm:grid-cols-[200px_1fr] sm:gap-4">
|
|
||||||
<dt className="font-heading text-xs font-600 uppercase tracking-wider text-muted-foreground">
|
|
||||||
{label}
|
|
||||||
</dt>
|
|
||||||
<dd className="text-sm leading-relaxed text-foreground">{children}</dd>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function SectionTitle({
|
|
||||||
index,
|
|
||||||
children,
|
|
||||||
}: {
|
|
||||||
index: string
|
|
||||||
children: ReactNode
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<h2 className="mb-4 flex items-baseline gap-3 font-heading text-lg font-700 uppercase tracking-wide">
|
|
||||||
<span className="flex h-7 min-w-7 items-center justify-center bg-primary px-1.5 text-sm text-primary-foreground">
|
|
||||||
{index}
|
|
||||||
</span>
|
|
||||||
<span className="flex-1 border-b border-foreground/30 pb-1">
|
|
||||||
{children}
|
|
||||||
</span>
|
|
||||||
</h2>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function Perforation({ className }: { className?: string }) {
|
|
||||||
return (
|
|
||||||
<div
|
|
||||||
aria-hidden="true"
|
|
||||||
className={cn(
|
|
||||||
'flex h-4 w-full items-center justify-between overflow-hidden px-2 opacity-60',
|
|
||||||
className,
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{Array.from({ length: 60 }).map((_, i) => (
|
|
||||||
<span
|
|
||||||
key={i}
|
|
||||||
className="h-1.5 w-1.5 shrink-0 rounded-full bg-background shadow-[inset_0_1px_2px_rgba(0,0,0,0.35)]"
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import Link from 'next/link'
|
|
||||||
import type { Dossier } from '@/lib/dossiers'
|
|
||||||
import { Stamp } from '@/components/doc-elements'
|
|
||||||
|
|
||||||
const classColor: Record<string, string> = {
|
|
||||||
'СОВ. СЕКРЕТНО': 'text-primary',
|
|
||||||
'СЕКРЕТНО': 'stamp-ink',
|
|
||||||
'ДСП': 'stamp-ink',
|
|
||||||
'РАССЕКРЕЧЕНО': 'stamp-ink opacity-60',
|
|
||||||
}
|
|
||||||
|
|
||||||
export function DossierCard({ d, rotate }: { d: Dossier; rotate?: string }) {
|
|
||||||
return (
|
|
||||||
<Link
|
|
||||||
href={`/dossier/${d.slug}`}
|
|
||||||
style={{ rotate }}
|
|
||||||
className="paper group relative flex flex-col gap-3 p-5 transition-all duration-200 hover:-translate-y-1 hover:rotate-0 hover:shadow-[0_26px_50px_-22px_rgba(40,25,15,0.7)]"
|
|
||||||
>
|
|
||||||
{/* tape pin */}
|
|
||||||
<span className="tape -top-3 left-1/2 -translate-x-1/2 -rotate-2" aria-hidden="true" />
|
|
||||||
|
|
||||||
<div className="flex items-start justify-between gap-2">
|
|
||||||
<div>
|
|
||||||
<p className="font-mono text-[0.65rem] uppercase tracking-widest text-muted-foreground">
|
|
||||||
Дело № {d.code}
|
|
||||||
</p>
|
|
||||||
<p className="mt-0.5 font-heading text-[0.7rem] uppercase tracking-wider text-primary">
|
|
||||||
{d.category}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<Stamp
|
|
||||||
className={`px-1.5 py-0.5 text-[0.55rem] ${classColor[d.classification] ?? ''}`}
|
|
||||||
>
|
|
||||||
{d.classification}
|
|
||||||
</Stamp>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h3 className="font-heading text-xl font-700 uppercase leading-none tracking-tight transition-colors group-hover:text-primary">
|
|
||||||
{d.name}
|
|
||||||
</h3>
|
|
||||||
<p className="text-xs italic leading-snug text-muted-foreground">
|
|
||||||
{d.fullName}
|
|
||||||
</p>
|
|
||||||
<p className="text-sm leading-relaxed text-foreground/90">{d.summary}</p>
|
|
||||||
|
|
||||||
<div className="mt-auto flex items-center justify-between border-t border-dashed border-border pt-3">
|
|
||||||
<span className="font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground">
|
|
||||||
Угроза: <span className="text-foreground">{d.threat}</span>
|
|
||||||
</span>
|
|
||||||
<span className="font-heading text-[0.7rem] font-600 uppercase tracking-wider text-primary opacity-0 transition-opacity group-hover:opacity-100">
|
|
||||||
Открыть дело →
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</Link>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export { Stamp }
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
import Link from 'next/link'
|
|
||||||
import Image from 'next/image'
|
|
||||||
|
|
||||||
export function SiteHeader() {
|
|
||||||
return (
|
|
||||||
<header className="sticky top-0 z-30 border-b border-foreground/25 bg-card/85 backdrop-blur-sm shadow-[0_2px_12px_-8px_rgba(40,25,15,0.6)]">
|
|
||||||
<div className="mx-auto flex max-w-5xl flex-col gap-4 px-4 py-4 sm:flex-row sm:items-center sm:justify-between sm:px-6">
|
|
||||||
<Link href="/" className="flex items-center gap-3">
|
|
||||||
<Image
|
|
||||||
src="/emblem.png"
|
|
||||||
alt="Эмблема Трибунала"
|
|
||||||
width={52}
|
|
||||||
height={52}
|
|
||||||
className="h-12 w-12 mix-blend-multiply"
|
|
||||||
/>
|
|
||||||
<div className="leading-tight">
|
|
||||||
<p className="font-heading text-base font-700 uppercase tracking-wide sm:text-lg">
|
|
||||||
Архив ДНТ-7
|
|
||||||
</p>
|
|
||||||
<p className="text-[0.65rem] uppercase tracking-widest text-muted-foreground">
|
|
||||||
Дачно-Наблюдательный Трибунал
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</Link>
|
|
||||||
<nav className="flex flex-wrap items-center gap-x-5 gap-y-1 font-heading text-xs font-600 uppercase tracking-wider">
|
|
||||||
{[
|
|
||||||
{ href: '/', label: 'Картотека' },
|
|
||||||
{ href: '/dossier/directive-kompot', label: 'Уставы' },
|
|
||||||
{ href: '/dossier/lopata-bs-3000', label: 'Инвентарь' },
|
|
||||||
{ href: '/protocol', label: 'Протокол' },
|
|
||||||
].map((l) => (
|
|
||||||
<Link
|
|
||||||
key={l.label}
|
|
||||||
href={l.href}
|
|
||||||
className="relative text-foreground/80 transition-colors hover:text-primary"
|
|
||||||
>
|
|
||||||
{l.label}
|
|
||||||
</Link>
|
|
||||||
))}
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function SiteFooter() {
|
|
||||||
return (
|
|
||||||
<footer className="mt-16 border-t border-foreground/25 bg-card/60">
|
|
||||||
<div className="mx-auto max-w-5xl px-4 py-8 sm:px-6">
|
|
||||||
<div className="flex flex-col justify-between gap-4 text-[0.7rem] uppercase tracking-wider text-muted-foreground sm:flex-row">
|
|
||||||
<p>
|
|
||||||
©{' '}
|
|
||||||
<span className="text-foreground">
|
|
||||||
Дачно-Наблюдательный Трибунал №7
|
|
||||||
</span>{' '}
|
|
||||||
· Кооператив «Заря-9»
|
|
||||||
</p>
|
|
||||||
<p>Форма А-13 · Хранить вечно · Не выносить за периметр</p>
|
|
||||||
</div>
|
|
||||||
<p className="mt-4 max-w-2xl text-[0.7rem] leading-relaxed text-muted-foreground">
|
|
||||||
Все материалы являются художественным вымыслом. Любое совпадение с
|
|
||||||
реальными грядками, соседями и небесными телами случайно. Разглашение
|
|
||||||
преследуется лишением компоста.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import { Button as ButtonPrimitive } from '@base-ui/react/button'
|
|
||||||
import { cva, type VariantProps } from 'class-variance-authority'
|
|
||||||
|
|
||||||
import { cn } from '@/lib/utils'
|
|
||||||
|
|
||||||
const buttonVariants = cva(
|
|
||||||
"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
||||||
{
|
|
||||||
variants: {
|
|
||||||
variant: {
|
|
||||||
default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80',
|
|
||||||
outline:
|
|
||||||
'border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50',
|
|
||||||
secondary:
|
|
||||||
'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',
|
|
||||||
ghost:
|
|
||||||
'hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50',
|
|
||||||
destructive:
|
|
||||||
'bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40',
|
|
||||||
link: 'text-primary underline-offset-4 hover:underline',
|
|
||||||
},
|
|
||||||
size: {
|
|
||||||
default:
|
|
||||||
'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
|
|
||||||
xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
||||||
sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
|
|
||||||
lg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
|
|
||||||
icon: 'size-8',
|
|
||||||
'icon-xs':
|
|
||||||
"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
|
|
||||||
'icon-sm':
|
|
||||||
'size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg',
|
|
||||||
'icon-lg': 'size-9',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
defaultVariants: {
|
|
||||||
variant: 'default',
|
|
||||||
size: 'default',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
function Button({
|
|
||||||
className,
|
|
||||||
variant = 'default',
|
|
||||||
size = 'default',
|
|
||||||
...props
|
|
||||||
}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {
|
|
||||||
return (
|
|
||||||
<ButtonPrimitive
|
|
||||||
data-slot="button"
|
|
||||||
className={cn(buttonVariants({ variant, size, className }))}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export { Button, buttonVariants }
|
|
||||||
@@ -1,261 +0,0 @@
|
|||||||
import type { ReactNode } from 'react'
|
|
||||||
|
|
||||||
export type DossierContent = {
|
|
||||||
fields: { label: string; value: ReactNode }[]
|
|
||||||
sections: { index: string; title: string; body: ReactNode }[]
|
|
||||||
hasBlueprint?: boolean
|
|
||||||
hasPhoto?: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
export const CONTENT: Record<string, DossierContent> = {
|
|
||||||
'lopata-bs-3000': {
|
|
||||||
hasBlueprint: true,
|
|
||||||
fields: [
|
|
||||||
{ label: 'Наименование изделия', value: 'Л.О.П.А.Т.А.' },
|
|
||||||
{ label: 'Индекс', value: 'Модель БС-3000 / Садово-Боевая' },
|
|
||||||
{
|
|
||||||
label: 'Полное инж. название',
|
|
||||||
value:
|
|
||||||
'Локализатор Органических Признаков Анунаков Трансгрессивного Адаптера',
|
|
||||||
},
|
|
||||||
{ label: 'Изготовитель', value: 'Артель «Острый Штык», цех №4' },
|
|
||||||
{ label: 'Масса снаряжённая', value: '2,7 кг ± 0,3 кг' },
|
|
||||||
{ label: 'Заточка', value: 'Двухсторонняя, угол 23°' },
|
|
||||||
{ label: 'Ресурс', value: 'не менее 400 (четырёхсот) заземлений' },
|
|
||||||
],
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
index: '1.',
|
|
||||||
title: 'Назначение',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Изделие предназначено для обнуления маскировочных био-голограмм,
|
|
||||||
принудительного заземления внеземных агентов и демаскировки
|
|
||||||
чешуйчатого личного состава в полевых условиях. Допускается
|
|
||||||
применение по прямому хозяйственному назначению (вскапывание грунта)
|
|
||||||
в целях сохранения легенды оператора.
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '2.',
|
|
||||||
title: 'Принцип действия',
|
|
||||||
body: (
|
|
||||||
<div className="space-y-3">
|
|
||||||
<p>
|
|
||||||
Рабочее полотно изделия выполнено из заземлённого сплава «ЧУГ-7».
|
|
||||||
При плотном контакте с поверхностью агента происходит срыв
|
|
||||||
голографической оболочки и отвод паразитных нибируанских токов в
|
|
||||||
грунт через черенок-токоотвод.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Эффект демаскировки достигается за 1 (один) уверенный удар плашмя.
|
|
||||||
Повторные удары наносятся до полного проявления чешуи либо до
|
|
||||||
признания агентом своей внеземной природы.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '3.',
|
|
||||||
title: 'Порядок применения',
|
|
||||||
body: (
|
|
||||||
<ol className="ml-4 list-decimal space-y-2 marker:font-700 marker:text-primary">
|
|
||||||
<li>
|
|
||||||
Убедиться в отсутствии посторонних дачников на смежных участках.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Принять стойку «Прополка боевая»: ноги на ширину грядки, черенок у
|
|
||||||
пояса.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
При первых признаках маскировки (немигающий взгляд, любовь к
|
|
||||||
солнцу, неприятие соли) — нанести заземляющий удар.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Зафиксировать результат в журнале формы Б-2 и доложить старшему по
|
|
||||||
кооперативу.
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '4.',
|
|
||||||
title: 'Меры безопасности',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Запрещается заземлять агента при влажной обуви оператора. Запрещается
|
|
||||||
оставлять изделие в борще. Хранить в сарае под охраной кота. При
|
|
||||||
появлении на полотне зелёного свечения — изделие подлежит сдаче в
|
|
||||||
артель для перезаточки и [ДАННЫЕ ИЗЪЯТЫ].
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
'subject-ogurec': {
|
|
||||||
hasPhoto: true,
|
|
||||||
fields: [
|
|
||||||
{ label: 'Обозначение', value: 'Субъект «Огурец»' },
|
|
||||||
{ label: 'Класс', value: 'Биомаскировочная единица «Парниковый»' },
|
|
||||||
{ label: 'Место выявления', value: 'Теплица, участок №6' },
|
|
||||||
{ label: 'Состояние', value: 'Локализован, заземлён' },
|
|
||||||
],
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
index: '1.',
|
|
||||||
title: 'Обстоятельства выявления',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Субъект обнаружен при плановой инвентаризации теплицы. Демаскирован
|
|
||||||
при понижении температуры грунта ниже +8°C, при котором маскировочная
|
|
||||||
оболочка теряет тургор и проявляется чешуйчатая структура. Реагировал
|
|
||||||
на соль крайне нехарактерным для овоща образом.
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '2.',
|
|
||||||
title: 'Признаки внеземного происхождения',
|
|
||||||
body: (
|
|
||||||
<ul className="ml-4 list-disc space-y-2">
|
|
||||||
<li>Отсутствие семян при наличии идеальной формы.</li>
|
|
||||||
<li>Поворот к наблюдателю независимо от положения солнца.</li>
|
|
||||||
<li>Слабый запах озона и [ДАННЫЕ ИЗЪЯТЫ].</li>
|
|
||||||
</ul>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
'directive-kompot': {
|
|
||||||
fields: [
|
|
||||||
{ label: 'Обозначение', value: 'Директива «Компот»' },
|
|
||||||
{ label: 'Тип документа', value: 'Устав полевого противодействия' },
|
|
||||||
{ label: 'Действует с', value: '01.05.1986' },
|
|
||||||
{ label: 'Гриф', value: 'Для служебного пользования' },
|
|
||||||
],
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
index: 'I.',
|
|
||||||
title: 'Общие положения',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Настоящий устав определяет обязательный порядок действий
|
|
||||||
дачника-наблюдателя при установлении контакта с предполагаемым
|
|
||||||
агентом планеты Нибиру на территории садоводческого товарищества.
|
|
||||||
Незнание устава не освобождает от дежурства по сторожке.
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: 'II.',
|
|
||||||
title: 'Обязанности наблюдателя',
|
|
||||||
body: (
|
|
||||||
<ol className="ml-4 list-decimal space-y-2 marker:font-700 marker:text-primary">
|
|
||||||
<li>Сохранять бдительность в часы пик урожайности.</li>
|
|
||||||
<li>Иметь при себе исправный инвентарь (см. дело ИНВ-001).</li>
|
|
||||||
<li>Не вступать с агентом в переговоры о рассаде.</li>
|
|
||||||
<li>Докладывать о любом немигающем соседе незамедлительно.</li>
|
|
||||||
</ol>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
'agent-baba-zina': {
|
|
||||||
fields: [
|
|
||||||
{ label: 'Позывной', value: 'Агент «Баба Зина»' },
|
|
||||||
{ label: 'Должность', value: 'Старший полевой оператор' },
|
|
||||||
{ label: 'Участок', value: '№3, кооператив «Заря-9»' },
|
|
||||||
{ label: 'Заслуги', value: 'Орден Трудовой Грядки I степени' },
|
|
||||||
{ label: 'Подтверждённых заземлений', value: '14 (четырнадцать)' },
|
|
||||||
],
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
index: '1.',
|
|
||||||
title: 'Характеристика',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Образцовый полевой оператор. Лично разработала метод демаскировки
|
|
||||||
«соль в три щепоти». Передаёт опыт молодым дачникам. Личность
|
|
||||||
охраняется, фотоматериалы [ДАННЫЕ ИЗЪЯТЫ] в целях безопасности
|
|
||||||
оператора и его теплицы.
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
'object-nibiru': {
|
|
||||||
fields: [
|
|
||||||
{ label: 'Обозначение', value: 'Планета Нибиру' },
|
|
||||||
{ label: 'Класс угрозы', value: 'КАТ. IV (трансгрессивная)' },
|
|
||||||
{ label: 'Период сближения', value: 'совпадает с пиком урожайности' },
|
|
||||||
{ label: 'Координаты', value: '[ДАННЫЕ ИЗЪЯТЫ]' },
|
|
||||||
],
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
index: '1.',
|
|
||||||
title: 'Описание объекта',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Внесистемное небесное тело, признанное источником трансгрессивной
|
|
||||||
угрозы садоводческим территориям. По данным наблюдений с водонапорной
|
|
||||||
башни, сближение объекта вызывает аномальный рост сорняков и
|
|
||||||
активизацию замаскированных агентов.
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '2.',
|
|
||||||
title: 'Рекомендации',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
В период сближения усилить дежурства, проверять рассаду на чешую,
|
|
||||||
держать инвентарь заточенным. Дальнейшие сведения изъяты по грифу
|
|
||||||
«Сов. Секретно».
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
'equipment-vedro': {
|
|
||||||
fields: [
|
|
||||||
{ label: 'Наименование', value: 'В.Е.Д.Р.О.' },
|
|
||||||
{
|
|
||||||
label: 'Полное название',
|
|
||||||
value:
|
|
||||||
'Высокочастотный Экранирующий Дезинтегратор Рептилоидных Оболочек',
|
|
||||||
},
|
|
||||||
{ label: 'Материал', value: 'Сталь оцинкованная, контур-ловушка' },
|
|
||||||
{ label: 'Объём', value: '12 л (стандарт кооператива)' },
|
|
||||||
],
|
|
||||||
sections: [
|
|
||||||
{
|
|
||||||
index: '1.',
|
|
||||||
title: 'Назначение',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Оцинкованный контур-ловушка для блокировки телепатического канала
|
|
||||||
агента с орбитой. Накрывается на голову локализованной единицы,
|
|
||||||
создавая экранирующую клетку Фарадея кустарного исполнения.
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
index: '2.',
|
|
||||||
title: 'Применение в связке',
|
|
||||||
body: (
|
|
||||||
<p>
|
|
||||||
Используется совместно с изделием Л.О.П.А.Т.А. (дело ИНВ-001): сперва
|
|
||||||
заземление, затем экранирование. Эффективность связки подтверждена
|
|
||||||
агентом «Баба Зина».
|
|
||||||
</p>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
export type Classification = 'СОВ. СЕКРЕТНО' | 'СЕКРЕТНО' | 'ДСП' | 'РАССЕКРЕЧЕНО'
|
|
||||||
|
|
||||||
export type Dossier = {
|
|
||||||
slug: string
|
|
||||||
code: string
|
|
||||||
name: string
|
|
||||||
fullName: string
|
|
||||||
category: 'ИНВЕНТАРЬ' | 'ПЕРСОНА' | 'ОБЪЕКТ' | 'ДИРЕКТИВА'
|
|
||||||
classification: Classification
|
|
||||||
threat: string
|
|
||||||
summary: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DOSSIERS: Dossier[] = [
|
|
||||||
{
|
|
||||||
slug: 'lopata-bs-3000',
|
|
||||||
code: 'ИНВ-001',
|
|
||||||
name: 'Л.О.П.А.Т.А.',
|
|
||||||
fullName:
|
|
||||||
'Локализатор Органических Признаков Анунаков Трансгрессивного Адаптера',
|
|
||||||
category: 'ИНВЕНТАРЬ',
|
|
||||||
classification: 'СОВ. СЕКРЕТНО',
|
|
||||||
threat: 'КАТ. III',
|
|
||||||
summary:
|
|
||||||
'Модель БС-3000 (Садово-Боевая). Обнуление маскировочных био-голограмм и принудительное заземление внеземных агентов в полевых условиях.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'subject-ogurec',
|
|
||||||
code: 'ОБЪ-014',
|
|
||||||
name: 'СУБЪЕКТ «ОГУРЕЦ»',
|
|
||||||
fullName: 'Биомаскировочная единица класса «Парниковый»',
|
|
||||||
category: 'ОБЪЕКТ',
|
|
||||||
classification: 'СЕКРЕТНО',
|
|
||||||
threat: 'КАТ. II',
|
|
||||||
summary:
|
|
||||||
'Рептилоидный агент, выявленный при инвентаризации теплицы участка №6. Демаскирован при пониженной температуре грунта.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'directive-kompot',
|
|
||||||
code: 'ДИР-007',
|
|
||||||
name: 'ДИРЕКТИВА «КОМПОТ»',
|
|
||||||
fullName: 'Устав полевого противодействия чешуйчатому личному составу',
|
|
||||||
category: 'ДИРЕКТИВА',
|
|
||||||
classification: 'ДСП',
|
|
||||||
threat: 'КАТ. I',
|
|
||||||
summary:
|
|
||||||
'Свод обязательных предписаний для дачников-наблюдателей при контакте с предполагаемым агентом планеты Нибиру.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'agent-baba-zina',
|
|
||||||
code: 'ПЕР-003',
|
|
||||||
name: 'АГЕНТ «БАБА ЗИНА»',
|
|
||||||
fullName: 'Старший полевой оператор, участок №3, кооператив «Заря-9»',
|
|
||||||
category: 'ПЕРСОНА',
|
|
||||||
classification: 'РАССЕКРЕЧЕНО',
|
|
||||||
threat: '—',
|
|
||||||
summary:
|
|
||||||
'Кавалер ордена Трудовой Грядки. Лично заземлила 14 (четырнадцать) подтверждённых рептилоидных единиц. Личность охраняется.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'object-nibiru',
|
|
||||||
code: 'ОБЪ-000',
|
|
||||||
name: 'ПЛАНЕТА НИБИРУ',
|
|
||||||
fullName: 'Источник трансгрессивной угрозы садоводческим территориям',
|
|
||||||
category: 'ОБЪЕКТ',
|
|
||||||
classification: 'СОВ. СЕКРЕТНО',
|
|
||||||
threat: 'КАТ. IV',
|
|
||||||
summary:
|
|
||||||
'Внесистемное тело. Период сближения совпадает с пиком урожайности. Координаты [ДАННЫЕ ИЗЪЯТЫ].',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
slug: 'equipment-vedro',
|
|
||||||
code: 'ИНВ-022',
|
|
||||||
name: 'В.Е.Д.Р.О.',
|
|
||||||
fullName:
|
|
||||||
'Высокочастотный Экранирующий Дезинтегратор Рептилоидных Оболочек',
|
|
||||||
category: 'ИНВЕНТАРЬ',
|
|
||||||
classification: 'СЕКРЕТНО',
|
|
||||||
threat: 'КАТ. II',
|
|
||||||
summary:
|
|
||||||
'Оцинкованный контур-ловушка. Накрывается на голову агента для блокировки телепатического канала с орбитой.',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
export function getDossier(slug: string) {
|
|
||||||
return DOSSIERS.find((d) => d.slug === slug)
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import { clsx, type ClassValue } from 'clsx'
|
|
||||||
import { twMerge } from 'tailwind-merge'
|
|
||||||
|
|
||||||
export function cn(...inputs: ClassValue[]) {
|
|
||||||
return twMerge(clsx(inputs))
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
/// <reference types="next" />
|
|
||||||
/// <reference types="next/image-types/global" />
|
|
||||||
import "./.next/dev/types/routes.d.ts";
|
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
|
||||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
/** @type {import('next').NextConfig} */
|
|
||||||
const nextConfig = {
|
|
||||||
typescript: {
|
|
||||||
ignoreBuildErrors: true,
|
|
||||||
},
|
|
||||||
images: {
|
|
||||||
unoptimized: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export default nextConfig
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "my-project",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"dev": "next dev",
|
|
||||||
"build": "next build",
|
|
||||||
"start": "next start",
|
|
||||||
"lint": "eslint ."
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@base-ui/react": "^1.5.0",
|
|
||||||
"@vercel/analytics": "1.6.1",
|
|
||||||
"class-variance-authority": "^0.7.1",
|
|
||||||
"clsx": "^2.1.1",
|
|
||||||
"lucide-react": "^1.16.0",
|
|
||||||
"next": "16.2.6",
|
|
||||||
"react": "^19",
|
|
||||||
"react-dom": "^19",
|
|
||||||
"shadcn": "^4.8.0",
|
|
||||||
"tailwind-merge": "^3.3.1",
|
|
||||||
"tw-animate-css": "^1.4.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@tailwindcss/postcss": "^4.2.0",
|
|
||||||
"@types/node": "^24",
|
|
||||||
"@types/react": "^19",
|
|
||||||
"@types/react-dom": "^19",
|
|
||||||
"postcss": "^8.5",
|
|
||||||
"tailwindcss": "^4.2.0",
|
|
||||||
"typescript": "5.7.3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
/** @type {import('postcss-load-config').Config} */
|
|
||||||
const config = {
|
|
||||||
plugins: {
|
|
||||||
'@tailwindcss/postcss': {},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export default config
|
|
||||||
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.1 MiB |
|
Before Width: | Height: | Size: 2.5 MiB |
|
Before Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 585 B |
|
Before Width: | Height: | Size: 566 B |
@@ -1,26 +0,0 @@
|
|||||||
<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<style>
|
|
||||||
@media (prefers-color-scheme: light) {
|
|
||||||
.background { fill: black; }
|
|
||||||
.foreground { fill: white; }
|
|
||||||
}
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
.background { fill: white; }
|
|
||||||
.foreground { fill: black; }
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<g clip-path="url(#clip0_7960_43945)">
|
|
||||||
<rect class="background" width="180" height="180" rx="37" />
|
|
||||||
<g style="transform: scale(95%); transform-origin: center">
|
|
||||||
<path class="foreground"
|
|
||||||
d="M101.141 53H136.632C151.023 53 162.689 64.6662 162.689 79.0573V112.904H148.112V79.0573C148.112 78.7105 148.098 78.3662 148.072 78.0251L112.581 112.898C112.701 112.902 112.821 112.904 112.941 112.904H148.112V126.672H112.941C98.5504 126.672 86.5638 114.891 86.5638 100.5V66.7434H101.141V100.5C101.141 101.15 101.191 101.792 101.289 102.422L137.56 66.7816C137.255 66.7563 136.945 66.7434 136.632 66.7434H101.141V53Z" />
|
|
||||||
<path class="foreground"
|
|
||||||
d="M65.2926 124.136L14 66.7372H34.6355L64.7495 100.436V66.7372H80.1365V118.47C80.1365 126.278 70.4953 129.958 65.2926 124.136Z" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_7960_43945">
|
|
||||||
<rect width="180" height="180" fill="white" />
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 568 B |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="215" height="48" fill="none"><path fill="#000" d="M57.588 9.6h6L73.828 38h-5.2l-2.36-6.88h-11.36L52.548 38h-5.2l10.24-28.4Zm7.16 17.16-4.16-12.16-4.16 12.16h8.32Zm23.694-2.24c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.486-7.72.12 3.4c.534-1.227 1.307-2.173 2.32-2.84 1.04-.693 2.267-1.04 3.68-1.04 1.494 0 2.76.387 3.8 1.16 1.067.747 1.827 1.813 2.28 3.2.507-1.44 1.294-2.52 2.36-3.24 1.094-.747 2.414-1.12 3.96-1.12 1.414 0 2.64.307 3.68.92s1.84 1.52 2.4 2.72c.56 1.2.84 2.667.84 4.4V38h-4.96V25.92c0-1.813-.293-3.187-.88-4.12-.56-.96-1.413-1.44-2.56-1.44-.906 0-1.68.213-2.32.64-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.84-.48 3.04V38h-4.56V25.92c0-1.2-.133-2.213-.4-3.04-.24-.827-.626-1.453-1.16-1.88-.506-.427-1.133-.64-1.88-.64-.906 0-1.68.227-2.32.68-.64.427-1.133 1.053-1.48 1.88-.32.827-.48 1.827-.48 3V38h-4.96V16.8h4.48Zm26.723 10.6c0-2.24.427-4.187 1.28-5.84.854-1.68 2.067-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.84 0 3.494.413 4.96 1.24 1.467.827 2.64 2.08 3.52 3.76.88 1.653 1.347 3.693 1.4 6.12v1.32h-15.08c.107 1.813.614 3.227 1.52 4.24.907.987 2.134 1.48 3.68 1.48.987 0 1.88-.253 2.68-.76a4.803 4.803 0 0 0 1.84-2.2l5.08.36c-.64 2.027-1.84 3.64-3.6 4.84-1.733 1.173-3.733 1.76-6 1.76-2.08 0-3.906-.453-5.48-1.36-1.573-.907-2.786-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84Zm15.16-2.04c-.213-1.733-.76-3.013-1.64-3.84-.853-.827-1.893-1.24-3.12-1.24-1.44 0-2.6.453-3.48 1.36-.88.88-1.44 2.12-1.68 3.72h9.92ZM163.139 9.6V38h-5.04V9.6h5.04Zm8.322 7.2.24 5.88-.64-.36c.32-2.053 1.094-3.56 2.32-4.52 1.254-.987 2.787-1.48 4.6-1.48 2.32 0 4.107.733 5.36 2.2 1.254 1.44 1.88 3.387 1.88 5.84V38h-4.96V25.92c0-1.253-.12-2.28-.36-3.08-.24-.8-.64-1.413-1.2-1.84-.533-.427-1.253-.64-2.16-.64-1.44 0-2.573.48-3.4 1.44-.8.933-1.2 2.307-1.2 4.12V38h-4.96V16.8h4.48Zm30.003 7.72c-.186-1.307-.706-2.32-1.56-3.04-.853-.72-1.866-1.08-3.04-1.08-1.68 0-2.986.613-3.92 1.84-.906 1.227-1.36 2.947-1.36 5.16s.454 3.933 1.36 5.16c.934 1.227 2.24 1.84 3.92 1.84 1.254 0 2.307-.373 3.16-1.12.854-.773 1.387-1.867 1.6-3.28l5.12.24c-.186 1.68-.733 3.147-1.64 4.4-.906 1.227-2.08 2.173-3.52 2.84-1.413.667-2.986 1-4.72 1-2.08 0-3.906-.453-5.48-1.36-1.546-.907-2.76-2.2-3.64-3.88-.853-1.68-1.28-3.627-1.28-5.84 0-2.24.427-4.187 1.28-5.84.88-1.68 2.094-2.973 3.64-3.88 1.574-.907 3.4-1.36 5.48-1.36 1.68 0 3.227.32 4.64.96 1.414.64 2.56 1.56 3.44 2.76.907 1.2 1.454 2.6 1.64 4.2l-5.12.28Zm11.443 8.16V38h-5.6v-5.32h5.6Z"/><path fill="#171717" fill-rule="evenodd" d="m7.839 40.783 16.03-28.054L20 6 0 40.783h7.839Zm8.214 0H40L27.99 19.894l-4.02 7.032 3.976 6.914H20.02l-3.967 6.943Z" clip-rule="evenodd"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"lib": [
|
|
||||||
"dom",
|
|
||||||
"dom.iterable",
|
|
||||||
"esnext"
|
|
||||||
],
|
|
||||||
"allowJs": true,
|
|
||||||
"target": "ES6",
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"strict": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"module": "esnext",
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"resolveJsonModule": true,
|
|
||||||
"isolatedModules": true,
|
|
||||||
"jsx": "react-jsx",
|
|
||||||
"incremental": true,
|
|
||||||
"plugins": [
|
|
||||||
{
|
|
||||||
"name": "next"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"paths": {
|
|
||||||
"@/*": [
|
|
||||||
"./*"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"include": [
|
|
||||||
"next-env.d.ts",
|
|
||||||
"**/*.ts",
|
|
||||||
"**/*.tsx",
|
|
||||||
".next/types/**/*.ts",
|
|
||||||
".next/dev/types/**/*.ts"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"node_modules"
|
|
||||||
]
|
|
||||||
}
|
|
||||||