Skip to content

Commit c6ee82b

Browse files
authored
feat(apps): scaffold register + validators-portal placeholder pages (#91)
1 parent 2dd9732 commit c6ee82b

61 files changed

Lines changed: 2694 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/register/.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Sentrix Chain mainnet RPC — used by Stats section to fetch live block data.
2+
# Defaults to the public production endpoint if unset.
3+
NEXT_PUBLIC_MAINNET_RPC=https://rpc.sentrixchain.com
4+
NEXT_PUBLIC_MAINNET_CHAIN_ID=7119

apps/register/.gitignore

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# dependencies
2+
/node_modules
3+
4+
# next.js
5+
/.next/
6+
/out/
7+
8+
# production
9+
/build
10+
11+
# misc
12+
.DS_Store
13+
*.pem
14+
15+
# debug
16+
npm-debug.log*
17+
yarn-debug.log*
18+
yarn-error.log*
19+
pnpm-debug.log*
20+
21+
# env
22+
.env*.local
23+
.env
24+
25+
# typescript
26+
*.tsbuildinfo
27+
next-env.d.ts

apps/register/README.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# @sentriscloud/landing
2+
3+
Company landing page for **sentriscloud.com**.
4+
5+
## Stack
6+
7+
- Next.js 15 (App Router) + React 19 + TypeScript
8+
- Tailwind CSS 4 (CSS-first config in `app/globals.css`)
9+
- next-themes (dark default)
10+
- framer-motion (scroll reveals)
11+
- viem (live mainnet stats)
12+
- lucide-react (icons)
13+
14+
## Editing copy
15+
16+
All user-facing copy lives in `content/`:
17+
18+
| File | Purpose |
19+
| --- | --- |
20+
| `content/site.ts` | Site name, tagline, description, social URLs, brand asset URLs |
21+
| `content/products.ts` | Product cards: name, tagline, description, status, href |
22+
| `content/values.ts` | "Why SentrisCloud" value props |
23+
| `content/nav.ts` | Top nav and footer link grids |
24+
25+
Editing copy never touches JSX — change the data, the section re-renders automatically.
26+
27+
## Adding a section
28+
29+
1. Create `components/sections/<name>.tsx`
30+
2. Export a function component
31+
3. Import in `app/page.tsx` and place it where you want
32+
4. If it has data, put data in `content/<name>.ts`
33+
34+
## Live stats
35+
36+
`components/sections/stats.tsx` is a server component that calls `getChainSnapshot()` (in `lib/chain.ts`) which queries the mainnet RPC. The whole page is revalidated every 60s (`export const revalidate = 60` in `app/page.tsx`) — keeps RPC traffic predictable.
37+
38+
Override the RPC by setting `NEXT_PUBLIC_MAINNET_RPC` in `.env.local`.
39+
40+
## Run
41+
42+
From the monorepo root:
43+
44+
```bash
45+
pnpm -F @sentriscloud/landing dev
46+
# → http://localhost:3000
47+
```
48+
49+
Build:
50+
51+
```bash
52+
pnpm -F @sentriscloud/landing build
53+
```
54+
55+
## Deploy
56+
57+
Vercel-ready: `Root Directory` = `apps/landing`, `Install Command` = `pnpm install`, `Build Command` = `pnpm build`. Set `NEXT_PUBLIC_MAINNET_RPC` if not using the default.
58+
59+
## Design system
60+
61+
Aesthetic follows `sentris-design`: editorial luxury (Playfair Display + Sora + IBM Plex Mono, emerald-on-canvas dark), no crypto-neon, no glassmorphism. Tokens defined in `app/globals.css` under `@theme`.

apps/register/app/globals.css

Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
@import "tailwindcss";
2+
3+
/* CSS custom properties — defined outside @theme so Tailwind 4 doesn't
4+
strip them during compile (var() indirection inside @theme is unreliable). */
5+
:root {
6+
/* Brand family — emerald shared with Sentrix Labs */
7+
--color-emerald-50: #ecfdf5;
8+
--color-emerald-100: #d1fae5;
9+
--color-emerald-300: #6ee7b7;
10+
--color-emerald-400: #34d399;
11+
--color-emerald-500: #10b981;
12+
--color-emerald-600: #059669;
13+
--color-emerald-700: #047857;
14+
--color-emerald-900: #064e3b;
15+
16+
--color-bronze: #8a5a11;
17+
--color-gold: #dbc17f;
18+
19+
--color-canvas: #0a0a0c;
20+
--color-canvas-2: #111114;
21+
--color-ink: #f5f5f4;
22+
--color-ink-2: #d6d3d1;
23+
--color-ink-3: #a8a29e;
24+
--color-ink-4: #78716c;
25+
--color-line: #27272a;
26+
--color-line-2: #1c1c1f;
27+
28+
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
29+
--ease-in-out-quart: cubic-bezier(0.76, 0, 0.24, 1);
30+
31+
color-scheme: dark;
32+
}
33+
34+
@layer base {
35+
html {
36+
-webkit-font-smoothing: antialiased;
37+
-moz-osx-font-smoothing: grayscale;
38+
text-rendering: optimizeLegibility;
39+
scroll-behavior: smooth;
40+
font-synthesis: none;
41+
}
42+
43+
body {
44+
background: var(--color-canvas);
45+
color: var(--color-ink);
46+
font-family: var(--font-sora), ui-sans-serif, system-ui, sans-serif;
47+
font-feature-settings: "ss01", "cv11", "kern", "liga";
48+
font-optical-sizing: auto;
49+
font-variant-ligatures: common-ligatures contextual;
50+
overflow-x: hidden;
51+
}
52+
53+
::selection {
54+
background: var(--color-emerald-500);
55+
color: var(--color-canvas);
56+
}
57+
58+
::-webkit-scrollbar { width: 10px; height: 10px; }
59+
::-webkit-scrollbar-track { background: var(--color-canvas); }
60+
::-webkit-scrollbar-thumb {
61+
background: var(--color-line);
62+
border: 2px solid var(--color-canvas);
63+
border-radius: 5px;
64+
}
65+
66+
@media (prefers-reduced-motion: reduce) {
67+
*, *::before, *::after {
68+
animation-duration: 0.01ms !important;
69+
animation-iteration-count: 1 !important;
70+
transition-duration: 0.01ms !important;
71+
scroll-behavior: auto !important;
72+
}
73+
}
74+
}
75+
76+
@layer components {
77+
/* Editorial display heading — Fraunces, tuned for tech-editorial.
78+
opsz=144 (display optical size, tighter terminals).
79+
SOFT=50 (slightly humanized — less luxury-bridal, more modern).
80+
No discretionary ligatures — those swashes read as "alay" in a
81+
tech context; we want refined, not decorative. */
82+
.display {
83+
font-family: var(--font-display), ui-serif, Georgia, "Times New Roman", serif;
84+
font-weight: 500;
85+
font-variation-settings: "opsz" 36;
86+
letter-spacing: -0.025em;
87+
line-height: 0.95;
88+
font-feature-settings: "lnum", "kern", "liga", "calt";
89+
font-variant-ligatures: common-ligatures contextual;
90+
font-optical-sizing: auto;
91+
text-wrap: balance;
92+
}
93+
94+
/* Accent variant — same upright serif as .display, slightly heavier
95+
so emerald color + weight bump carry the emphasis instead of italic
96+
(italic serif reads "alay" / calligraphic in a tech context). */
97+
.display-italic {
98+
font-family: var(--font-display), ui-serif, Georgia, "Times New Roman", serif;
99+
font-style: normal;
100+
font-weight: 600;
101+
font-variation-settings: "opsz" 36;
102+
letter-spacing: -0.026em;
103+
line-height: 0.95;
104+
font-feature-settings: "kern", "liga", "calt";
105+
font-variant-ligatures: common-ligatures contextual;
106+
font-optical-sizing: auto;
107+
}
108+
109+
/* Heavy emphasis — Fraunces 700, still optical-display sized.
110+
800 was too bridal; 700 keeps presence without theatrics. */
111+
.display-heavy {
112+
font-family: var(--font-display), ui-serif, Georgia, "Times New Roman", serif;
113+
font-weight: 700;
114+
font-variation-settings: "opsz" 36;
115+
letter-spacing: -0.028em;
116+
line-height: 0.92;
117+
font-feature-settings: "lnum", "kern", "liga", "calt";
118+
font-variant-ligatures: common-ligatures contextual;
119+
font-optical-sizing: auto;
120+
text-wrap: balance;
121+
}
122+
123+
/* Mono — for code, data, eyebrows. Slashed zero + tabular figures so
124+
numbers don't shimmy when they update live. */
125+
.mono {
126+
font-family: var(--font-plex-mono), ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;
127+
font-feature-settings: "tnum", "zero", "ss01", "calt";
128+
font-variant-numeric: tabular-nums slashed-zero;
129+
}
130+
131+
/* Section number tag — "01 / Hero", editorial cue */
132+
.section-number {
133+
font-family: var(--font-plex-mono), ui-monospace, monospace;
134+
font-size: 0.6875rem;
135+
font-weight: 500;
136+
letter-spacing: 0.18em;
137+
text-transform: uppercase;
138+
color: var(--color-ink-4);
139+
}
140+
141+
.eyebrow {
142+
font-family: var(--font-plex-mono), ui-monospace, monospace;
143+
font-size: 0.6875rem;
144+
font-weight: 500;
145+
text-transform: uppercase;
146+
letter-spacing: 0.18em;
147+
color: var(--color-emerald-500);
148+
display: inline-flex;
149+
align-items: center;
150+
gap: 0.5rem;
151+
}
152+
153+
.eyebrow::before {
154+
content: "";
155+
display: block;
156+
width: 1.5rem;
157+
height: 1px;
158+
background: currentColor;
159+
opacity: 0.5;
160+
}
161+
162+
.container-page {
163+
width: 100%;
164+
max-width: 1280px;
165+
margin-inline: auto;
166+
padding-inline: 1.5rem;
167+
}
168+
169+
@media (min-width: 768px) {
170+
.container-page { padding-inline: 2.5rem; }
171+
}
172+
173+
/* Pull rule — full-width hairline divider */
174+
.rule {
175+
border: 0;
176+
border-top: 1px solid var(--color-line);
177+
margin: 0;
178+
}
179+
180+
/* Subtle grain texture overlay */
181+
.grain::after {
182+
content: "";
183+
position: fixed;
184+
inset: 0;
185+
pointer-events: none;
186+
z-index: 1;
187+
opacity: 0.025;
188+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
189+
mix-blend-mode: overlay;
190+
}
191+
192+
/* Drop-cap (used in the manifesto-style sections) */
193+
.dropcap::first-letter {
194+
font-family: var(--font-display), ui-serif, serif;
195+
font-size: 4.5em;
196+
line-height: 0.85;
197+
float: left;
198+
margin: 0.05em 0.08em -0.1em 0;
199+
color: var(--color-emerald-500);
200+
font-weight: 500;
201+
}
202+
203+
/* Corner-lines — signature SentrisCloud card treatment. Four small gold
204+
accents flick to visible on hover, framing the content like editorial
205+
bracketing. */
206+
.corner-lines {
207+
position: relative;
208+
}
209+
210+
.corner-lines::before,
211+
.corner-lines::after,
212+
.corner-lines > .cl-bl,
213+
.corner-lines > .cl-br {
214+
content: "";
215+
position: absolute;
216+
width: 18px;
217+
height: 18px;
218+
border: 1px solid var(--color-gold);
219+
opacity: 0;
220+
transition: opacity 350ms var(--ease-out-expo);
221+
pointer-events: none;
222+
}
223+
224+
.corner-lines::before {
225+
top: 0; left: 0;
226+
border-right: none; border-bottom: none;
227+
}
228+
229+
.corner-lines::after {
230+
top: 0; right: 0;
231+
border-left: none; border-bottom: none;
232+
}
233+
234+
.corner-lines > .cl-bl {
235+
bottom: 0; left: 0;
236+
border-right: none; border-top: none;
237+
}
238+
239+
.corner-lines > .cl-br {
240+
bottom: 0; right: 0;
241+
border-left: none; border-top: none;
242+
}
243+
244+
.corner-lines:hover::before,
245+
.corner-lines:hover::after,
246+
.corner-lines:hover > .cl-bl,
247+
.corner-lines:hover > .cl-br {
248+
opacity: 0.85;
249+
}
250+
251+
/* Oversized backdrop numeral — used behind hero for editorial drama.
252+
Upright (italic numerals get gimmicky); use Newsreader at low
253+
weight so it reads as a quiet structural accent. */
254+
.backdrop-numeral {
255+
font-family: var(--font-display), ui-serif, serif;
256+
font-style: normal;
257+
font-weight: 400;
258+
font-variation-settings: "opsz" 36;
259+
color: var(--color-canvas-2);
260+
line-height: 0.8;
261+
letter-spacing: -0.05em;
262+
user-select: none;
263+
pointer-events: none;
264+
}
265+
266+
/* Animated underline link */
267+
.link-underline {
268+
background-image: linear-gradient(currentColor, currentColor);
269+
background-size: 0 1px;
270+
background-position: 0 100%;
271+
background-repeat: no-repeat;
272+
transition: background-size 300ms var(--ease-out-expo);
273+
}
274+
275+
.link-underline:hover {
276+
background-size: 100% 1px;
277+
}
278+
}

apps/register/app/icon.png

12.5 KB
Loading

0 commit comments

Comments
 (0)