Skip to content

Commit b587edc

Browse files
committed
hi
1 parent 226272a commit b587edc

5 files changed

Lines changed: 148 additions & 85 deletions

File tree

src/pages/About.jsx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ export default function About() {
102102
);
103103

104104
return (
105-
<Reveal as="div" className="space-y-20" amount={0.1}>
106-
<section className="relative isolate overflow-hidden px-6 pb-20 pt-16 text-center">
105+
<Reveal as="div" className="space-y-16 sm:space-y-20" amount={0.1}>
106+
<section className="relative isolate overflow-hidden px-4 pb-14 pt-16 text-center sm:px-6 sm:pb-20">
107107
<div className="pointer-events-none absolute inset-0 -z-10 opacity-60">
108108
<img src="/img/phonegrid.png" alt="" className="h-full w-full object-cover opacity-15" />
109109
<div className="absolute inset-0 bg-gradient-to-b from-slate-950/10 to-slate-950" />
@@ -112,7 +112,7 @@ export default function About() {
112112
<p className="section-label text-xs uppercase text-sky-200">About JTech</p>
113113
<h1 className="text-4xl font-semibold text-white sm:text-6xl">Built by and for the Jewish tech community</h1>
114114
<p className="text-lg text-slate-300">
115-
The original About page celebrated this idea. We rebuilt it here with the same stories and sections—just with better typography and glassmorphism.
115+
We keep the stories and statistics grounded in what actually ships: vetted guidance, verified rollouts, and real families protected every week.
116116
</p>
117117
</div>
118118
<div className="mt-12 flex flex-wrap justify-center gap-6 text-center text-slate-300">
@@ -129,19 +129,19 @@ export default function About() {
129129
</p>
130130
</section>
131131

132-
<section className="mx-auto max-w-6xl px-6">
132+
<section className="mx-auto max-w-6xl px-4 sm:px-6">
133133
<SectionHeading label="Mission" title="Everything kosher mobile in one trusted playbook" align="center" />
134-
<div className="mt-8 space-y-5 rounded-3xl border border-white/10 bg-slate-900/70 p-8">
134+
<div className="mt-8 space-y-5 rounded-3xl border border-white/10 bg-slate-900/70 p-6 sm:p-8">
135135
{missionParagraphs.map((paragraph) => (
136136
<p key={paragraph} className="text-base text-slate-200">
137137
{paragraph}
138138
</p>
139139
))}
140140
</div>
141141
</section>
142-
<section className="mx-auto max-w-6xl px-6">
142+
<section className="mx-auto max-w-6xl px-4 sm:px-6">
143143
<SectionHeading label="Past 30 days" title="Forum activity snapshot" align="center" />
144-
<div className="mt-8 grid gap-6 md:grid-cols-3">
144+
<div className="mt-8 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
145145
<GlassCard className="text-center">
146146
<p className="text-xs uppercase tracking-[0.35em] text-slate-400">New verified members</p>
147147
<p className="mt-4 text-3xl font-semibold text-white">{formatNumber(forumStats.newMembers30)}</p>
@@ -160,16 +160,16 @@ export default function About() {
160160
</div>
161161
</section>
162162

163-
<section className="mx-auto max-w-6xl px-6">
163+
<section className="mx-auto max-w-6xl px-4 sm:px-6">
164164
<SectionHeading
165165
label="What we offer"
166166
title="Everything you need to launch and support kosher devices"
167167
align="center"
168168
/>
169-
<div className="mt-10 grid gap-6 md:grid-cols-3">
169+
<div className="mt-10 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
170170
{offerings.map((item) => (
171171
<GlassCard key={item.title}>
172-
<div className="flex items-center gap-3">
172+
<div className="flex flex-col gap-3 sm:flex-row sm:items-center">
173173
<span className="flex h-12 w-12 items-center justify-center rounded-2xl bg-white/10 text-sky-300">
174174
<i className={`fa-solid ${item.icon} text-xl`}></i>
175175
</span>
@@ -185,19 +185,19 @@ export default function About() {
185185
</div>
186186
</section>
187187

188-
<section className="mx-auto max-w-6xl px-6">
188+
<section className="mx-auto max-w-6xl px-4 sm:px-6">
189189
<SectionHeading label="Principles" title="How we keep the signal trustworthy" />
190-
<div className="mt-8 grid gap-6 md:grid-cols-3">
190+
<div className="mt-8 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
191191
{values.map((value) => (
192192
<GlassCard key={value.title} title={value.title} description={value.body} />
193193
))}
194194
</div>
195195
</section>
196196

197-
<section className="mx-auto max-w-6xl px-6">
198-
<div className="rounded-4xl border border-white/10 bg-slate-900/70 p-8">
197+
<section className="mx-auto max-w-6xl px-4 sm:px-6">
198+
<div className="rounded-4xl border border-white/10 bg-slate-900/70 p-6 sm:p-8">
199199
<SectionHeading label="Team" title="Who keeps JTech running" />
200-
<div className="mt-6 grid gap-4 md:grid-cols-2">
200+
<div className="mt-6 grid gap-4 sm:grid-cols-2">
201201
<div>
202202
<h3 className="text-lg font-semibold text-white">Moderators & mechanchim</h3>
203203
<p className="mt-2 text-sm text-slate-300">
@@ -214,14 +214,14 @@ export default function About() {
214214
</div>
215215
</section>
216216

217-
<section className="mx-auto max-w-6xl px-6 pb-20">
218-
<div className="glass-panel flex flex-col items-center gap-6 rounded-4xl border border-white/10 bg-gradient-to-r from-sky-500/20 to-indigo-500/20 px-8 py-12 text-center">
217+
<section className="mx-auto max-w-6xl px-4 pb-16 sm:px-6 sm:pb-20">
218+
<div className="glass-panel flex flex-col items-center gap-6 rounded-4xl border border-white/10 bg-gradient-to-r from-sky-500/20 to-indigo-500/20 px-6 py-10 text-center sm:px-8 sm:py-12">
219219
<p className="section-label text-xs uppercase text-sky-200">Get involved</p>
220220
<h2 className="text-3xl font-semibold text-white">Publish, mentor, or just ask a question</h2>
221221
<p className="text-base text-slate-200">
222-
The About page always closed with an invitation to the forum. That still standsbring your insight and help the next family ship a safe phone.
222+
The About page always closed with an invitation to the forum. That still stands-bring your insight and help the next family ship a safe phone.
223223
</p>
224-
<div className="flex flex-wrap justify-center gap-4">
224+
<div className="flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:justify-center">
225225
<a
226226
href="https://forums.jtechforums.org"
227227
target="_blank"

src/pages/Apps.jsx

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export default function Apps() {
4040
const [showSubmissionForm, setShowSubmissionForm] = useState(false);
4141
const [catalogReady, setCatalogReady] = useState(false);
4242
const [catalogLoading, setCatalogLoading] = useState(true);
43+
const [supportsTouch, setSupportsTouch] = useState(false);
4344

4445
const isAdmin = Boolean(profile?.isAdmin || user?.email === ADMIN_EMAIL);
4546

@@ -69,6 +70,18 @@ export default function Apps() {
6970
};
7071
}, [user?.email, isAdmin]);
7172

73+
useEffect(() => {
74+
if (typeof window === 'undefined') return undefined;
75+
const detectTouch = () => {
76+
const coarse = window.matchMedia?.('(pointer: coarse)')?.matches;
77+
setSupportsTouch(Boolean(coarse || 'ontouchstart' in window));
78+
};
79+
80+
detectTouch();
81+
window.addEventListener('resize', detectTouch);
82+
return () => window.removeEventListener('resize', detectTouch);
83+
}, []);
84+
7285
const approvedAppCards = useMemo(
7386
() =>
7487
approvedApps.map((app) => ({
@@ -207,7 +220,7 @@ export default function Apps() {
207220

208221
const renderSubmissionSection = () => {
209222
if (loading) {
210-
return <p className="text-sm text-slate-300">Checking your account</p>;
223+
return <p className="text-sm text-slate-300">Checking your account...</p>;
211224
}
212225
if (!user) {
213226
return (
@@ -260,15 +273,15 @@ export default function Apps() {
260273
</div>
261274
<button
262275
type="button"
263-
className="rounded-full border border-white/20 px-4 py-2 text-sm font-semibold text-white"
276+
className="w-full rounded-full border border-white/20 px-4 py-2 text-sm font-semibold text-white sm:w-auto"
264277
onClick={() => setShowSubmissionForm((prev) => !prev)}
265278
>
266279
{showSubmissionForm ? 'Hide form' : 'Open submission'}
267280
</button>
268281
</div>
269282

270283
<div className="rounded-3xl border border-white/10 bg-black/20 p-5">
271-
<div className="flex items-center justify-between gap-4">
284+
<div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
272285
<div>
273286
<p className="text-sm font-semibold text-white">Need to upload an APK?</p>
274287
<p className="text-xs text-slate-400">
@@ -278,7 +291,7 @@ export default function Apps() {
278291
<button
279292
type="button"
280293
onClick={() => setShowSubmissionForm((prev) => !prev)}
281-
className="inline-flex items-center gap-2 rounded-full border border-white/20 px-4 py-2 text-xs font-semibold text-white"
294+
className="inline-flex items-center justify-center gap-2 rounded-full border border-white/20 px-4 py-2 text-xs font-semibold text-white"
282295
>
283296
<span>{showSubmissionForm ? 'Collapse' : 'Expand form'}</span>
284297
<i className={`fa-solid ${showSubmissionForm ? 'fa-chevron-up' : 'fa-chevron-down'} text-xs`} />
@@ -294,18 +307,37 @@ export default function Apps() {
294307
exit={{ opacity: 0, height: 0 }}
295308
transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}
296309
>
297-
<div className="grid gap-4 md:grid-cols-2">
298-
<InputField label="App name" name="name" value={formValues.name} onChange={handleFormChange} required />
310+
<div className="grid gap-4 sm:grid-cols-2">
311+
<InputField
312+
label="App name"
313+
name="name"
314+
value={formValues.name}
315+
onChange={handleFormChange}
316+
required
317+
autoComplete="off"
318+
autoCapitalize="words"
319+
enterKeyHint="next"
320+
/>
299321
<InputField
300322
label="JTech username"
301323
name="username"
302324
value={formValues.username}
303325
onChange={handleFormChange}
304326
placeholder="@you"
305327
required
328+
autoComplete="username"
329+
enterKeyHint="next"
306330
/>
307331
</div>
308-
<InputField label="Header info" name="header" value={formValues.header} onChange={handleFormChange} required />
332+
<InputField
333+
label="Header info"
334+
name="header"
335+
value={formValues.header}
336+
onChange={handleFormChange}
337+
required
338+
autoComplete="off"
339+
enterKeyHint="next"
340+
/>
309341
<div>
310342
<label className="text-sm font-semibold text-white" htmlFor="description">
311343
More info

src/pages/Contact.jsx

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const RECAPTCHA_SITE_KEY = import.meta.env.VITE_RECAPTCHA_SITE_KEY || '';
77
export default function Contact() {
88
const [status, setStatus] = useState('idle');
99
const [message, setMessage] = useState('');
10+
const [supportsTouch, setSupportsTouch] = useState(false);
1011

1112
useEffect(() => {
1213
if (!RECAPTCHA_SITE_KEY) return;
@@ -19,6 +20,20 @@ export default function Contact() {
1920
document.body.appendChild(script);
2021
}, []);
2122

23+
useEffect(() => {
24+
if (typeof window === 'undefined') return undefined;
25+
const detectTouch = () => {
26+
const coarseQuery = window.matchMedia?.('(pointer: coarse)');
27+
const pointerCoarse = coarseQuery ? coarseQuery.matches : false;
28+
const hasTouchEvents = 'ontouchstart' in window;
29+
setSupportsTouch(pointerCoarse || hasTouchEvents);
30+
};
31+
32+
detectTouch();
33+
window.addEventListener('resize', detectTouch);
34+
return () => window.removeEventListener('resize', detectTouch);
35+
}, []);
36+
2237
const waitForRecaptcha = () =>
2338
new Promise((resolve, reject) => {
2439
if (!RECAPTCHA_SITE_KEY) {
@@ -95,15 +110,22 @@ export default function Contact() {
95110
}
96111
}
97112

113+
const submitLabel = status === 'loading' ? 'Sending…' : supportsTouch ? 'Tap to send' : 'Send message';
114+
98115
return (
99-
<Reveal as="div" className="mx-auto max-w-4xl px-6 py-16" amount={0.15}>
116+
<Reveal as="div" className="mx-auto max-w-4xl px-4 py-12 sm:px-6 sm:py-16" amount={0.15}>
100117
<div className="text-center">
101118
<p className="section-label text-xs uppercase text-sky-200">Contact</p>
102119
<h1 className="mt-4 text-5xl font-semibold text-white">Talk to JTech</h1>
103120
<p className="mt-3 text-base text-slate-300">Ask for guidance, request a walkthrough, or introduce a new deployment.</p>
104121
</div>
105122

106-
<form onSubmit={handleSubmit} className="mt-12 glass-panel rounded-3xl border border-white/10 p-8">
123+
<form
124+
onSubmit={handleSubmit}
125+
className="mt-12 glass-panel rounded-3xl border border-white/10 p-6 sm:p-8"
126+
autoComplete="on"
127+
noValidate={false}
128+
>
107129
<input type="text" name="_honey" tabIndex="-1" autoComplete="off" className="hidden" />
108130
<div className="grid gap-6 md:grid-cols-2">
109131
<fieldset>
@@ -114,7 +136,11 @@ export default function Contact() {
114136
id="name"
115137
name="name"
116138
required
117-
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-sm text-white focus:border-sky-400 focus:outline-none"
139+
autoComplete="name"
140+
autoCapitalize="words"
141+
inputMode="text"
142+
enterKeyHint="next"
143+
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-base text-white focus:border-sky-400 focus:outline-none"
118144
placeholder="Your name"
119145
/>
120146
</fieldset>
@@ -127,7 +153,10 @@ export default function Contact() {
127153
name="phone"
128154
type="tel"
129155
required
130-
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-sm text-white focus:border-sky-400 focus:outline-none"
156+
autoComplete="tel"
157+
inputMode="tel"
158+
enterKeyHint="next"
159+
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-base text-white focus:border-sky-400 focus:outline-none"
131160
placeholder="(123) 456-7890"
132161
/>
133162
</fieldset>
@@ -140,7 +169,10 @@ export default function Contact() {
140169
name="email"
141170
type="email"
142171
required
143-
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-sm text-white focus:border-sky-400 focus:outline-none"
172+
autoComplete="email"
173+
inputMode="email"
174+
enterKeyHint="next"
175+
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-base text-white focus:border-sky-400 focus:outline-none"
144176
placeholder="you@email.com"
145177
/>
146178
</fieldset>
@@ -153,7 +185,9 @@ export default function Contact() {
153185
name="message"
154186
rows="5"
155187
required
156-
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-sm text-white focus:border-sky-400 focus:outline-none"
188+
inputMode="text"
189+
enterKeyHint="send"
190+
className="mt-2 w-full rounded-2xl border border-white/10 bg-white/5 px-4 py-3 text-base text-white focus:border-sky-400 focus:outline-none"
157191
placeholder="Share context, goals, timelines..."
158192
></textarea>
159193
</fieldset>
@@ -164,11 +198,11 @@ export default function Contact() {
164198
disabled={status === 'loading'}
165199
className="w-full rounded-full bg-sky-500 px-6 py-3 text-base font-semibold text-slate-950 transition hover:bg-sky-400 disabled:cursor-wait"
166200
>
167-
{status === 'loading' ? 'Sending...' : 'Send message'}
201+
{submitLabel}
168202
</button>
169203

170204
{message && (
171-
<div className="mt-6 flex items-center justify-center">
205+
<div className="mt-6 flex items-center justify-center" aria-live="polite">
172206
<div
173207
className={`flex items-center gap-3 rounded-2xl px-5 py-3 text-sm font-semibold ${
174208
status === 'error'

src/pages/EGate.jsx

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,6 @@ const featureList = [
3434
},
3535
];
3636

37-
const faqs = [
38-
{
39-
question: 'What is JTech Forums?',
40-
answer:
41-
"It's a community built to serve the Jewish Orthodox tech space—guides, kosher phone help, coding help, and product support live together so no one is left guessing.",
42-
},
43-
{
44-
question: 'What kind of help can I find?',
45-
answer:
46-
'Members post walkthroughs, app bundles, troubleshooting tips, and curated guides. Ask a question, share a win, or get expert help when you’re stuck.',
47-
},
48-
{
49-
question: 'How do I reach moderators or admins?',
50-
answer:
51-
'Sign into the forum, open the Users tab, and DM any moderator/administrator. They can escalate eGate issues, approve guides, or loop in support.',
52-
},
53-
];
54-
5537
const slowVideoPlayback = (event) => {
5638
if (event?.currentTarget) {
5739
event.currentTarget.playbackRate = 0.8;
@@ -86,7 +68,6 @@ export default function EGate() {
8668
</section>
8769

8870
<Highlights />
89-
<FaqSection />
9071
<Cta />
9172
</Reveal>
9273
);
@@ -351,29 +332,6 @@ function ProgressiveGraphic() {
351332
);
352333
}
353334

354-
function FaqSection() {
355-
return (
356-
<Reveal as="section" className="bg-slate-950/80 py-20" amount={0.15}>
357-
<div className="mx-auto max-w-5xl px-6">
358-
<h2 className="text-center text-4xl font-semibold text-white sm:text-5xl">Frequently asked questions</h2>
359-
<div className="mt-12 space-y-4">
360-
{faqs.map((faq) => (
361-
<details key={faq.question} className="group rounded-3xl border border-white/10 bg-slate-900/60 p-6 text-white">
362-
<summary className="flex cursor-pointer items-center justify-between text-lg font-semibold">
363-
{faq.question}
364-
<span className="text-sky-300 transition group-open:rotate-45">
365-
<i className="fa-solid fa-plus"></i>
366-
</span>
367-
</summary>
368-
<p className="mt-3 text-sm text-slate-300">{faq.answer}</p>
369-
</details>
370-
))}
371-
</div>
372-
</div>
373-
</Reveal>
374-
);
375-
}
376-
377335
function Cta() {
378336
return (
379337
<Reveal as="section" className="bg-black py-24" amount={0.15}>

0 commit comments

Comments
 (0)