Refine Lab banner copy, stance to Regular/Goofy, full profile carry-over chips on Become-Skater, remove Back to Leaderboard from profile
- Lab "Just a skater?" banner: drop redundant "→ join the directory" trailer (arrow icon already present) - Skater stances distinct emojis (🛹 Regular / 🤙 Goofy); already limited to Regular & Goofy - Become-Skater: fix missing ShieldCheck/Zap imports; show ALL carried-over kind-0 fields (photo, name, bio, website, nip05, zaps) as read-only chips - Profile (NIP19Page): remove hardcoded "Back to Leaderboard" link and unused ArrowLeft import Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
This commit is contained in:
parent
67d8a24d73
commit
3ef11eda61
5 changed files with 54 additions and 30 deletions
2
NIP.md
2
NIP.md
|
|
@ -1506,7 +1506,7 @@ exists purely for community discovery.
|
||||||
["t", "skateskater"],
|
["t", "skateskater"],
|
||||||
["t", "skateboarding"],
|
["t", "skateboarding"],
|
||||||
["alt", "SkateSpots skater: <display name>"],
|
["alt", "SkateSpots skater: <display name>"],
|
||||||
["stance", "regular | goofy | switch | mongo"],
|
["stance", "regular | goofy"],
|
||||||
["level", "grom | intermediate | advanced | ripper"],
|
["level", "grom | intermediate | advanced | ripper"],
|
||||||
["t", "<style>"],
|
["t", "<style>"],
|
||||||
["years", "<years skating>"],
|
["years", "<years skating>"],
|
||||||
|
|
|
||||||
|
|
@ -294,15 +294,13 @@ export function isValidLightningAddress(value: string | undefined | null): value
|
||||||
// skater*. Publishing this (opt-in) is what lets someone appear in the /skaters
|
// skater*. Publishing this (opt-in) is what lets someone appear in the /skaters
|
||||||
// directory — a plain kind-0 profile is NOT enough (that's the anti-spam wall).
|
// directory — a plain kind-0 profile is NOT enough (that's the anti-spam wall).
|
||||||
|
|
||||||
export type SkaterStance = 'regular' | 'goofy' | 'switch' | 'mongo';
|
export type SkaterStance = 'regular' | 'goofy';
|
||||||
export type SkaterStyle = 'street' | 'park' | 'vert' | 'transition' | 'bowl' | 'cruising' | 'downhill' | 'freestyle' | 'ledges' | 'stairs' | 'diy';
|
export type SkaterStyle = 'street' | 'park' | 'vert' | 'transition' | 'bowl' | 'cruising' | 'downhill' | 'freestyle' | 'ledges' | 'stairs' | 'diy';
|
||||||
export type SkaterLevel = 'grom' | 'intermediate' | 'advanced' | 'ripper';
|
export type SkaterLevel = 'grom' | 'intermediate' | 'advanced' | 'ripper';
|
||||||
|
|
||||||
export const SKATER_STANCES: Record<SkaterStance, { label: string; emoji: string }> = {
|
export const SKATER_STANCES: Record<SkaterStance, { label: string; emoji: string }> = {
|
||||||
regular: { label: 'Regular', emoji: '🦶' },
|
regular: { label: 'Regular', emoji: '🛹' },
|
||||||
goofy: { label: 'Goofy', emoji: '🦶' },
|
goofy: { label: 'Goofy', emoji: '🤙' },
|
||||||
switch: { label: 'Switch', emoji: '🔄' },
|
|
||||||
mongo: { label: 'Mongo', emoji: '😅' },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SKATER_STYLES: Record<SkaterStyle, { label: string; emoji: string }> = {
|
export const SKATER_STYLES: Record<SkaterStyle, { label: string; emoji: string }> = {
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ import {
|
||||||
} from '@/lib/types';
|
} from '@/lib/types';
|
||||||
import { genUserName } from '@/lib/genUserName';
|
import { genUserName } from '@/lib/genUserName';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import { Upload, X, Loader2, ArrowLeft, MapPin, PersonStanding, Sparkles, UserRound } from 'lucide-react';
|
import { Upload, X, Loader2, ArrowLeft, MapPin, PersonStanding, Sparkles, UserRound, ShieldCheck, Zap, FileText, Globe } from 'lucide-react';
|
||||||
|
|
||||||
export default function BecomeSkaterPage() {
|
export default function BecomeSkaterPage() {
|
||||||
useSeoMeta({
|
useSeoMeta({
|
||||||
|
|
@ -50,6 +50,8 @@ export default function BecomeSkaterPage() {
|
||||||
// kind-0 values we borrow from so we never re-ask for what the profile has.
|
// kind-0 values we borrow from so we never re-ask for what the profile has.
|
||||||
const kind0About = metadata?.about ?? '';
|
const kind0About = metadata?.about ?? '';
|
||||||
const kind0Website = metadata?.website ?? '';
|
const kind0Website = metadata?.website ?? '';
|
||||||
|
const kind0Nip05 = metadata?.nip05 ?? '';
|
||||||
|
const kind0Lud16 = metadata?.lud16 ?? '';
|
||||||
|
|
||||||
const [bio, setBio] = useState('');
|
const [bio, setBio] = useState('');
|
||||||
const [location, setLocation] = useState('');
|
const [location, setLocation] = useState('');
|
||||||
|
|
@ -236,18 +238,52 @@ export default function BecomeSkaterPage() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Linked-to-your-profile notice */}
|
{/* Linked-to-your-profile notice + read-only summary of borrowed fields */}
|
||||||
|
<div className="rounded-xl border border-white/10 bg-white/5 p-3.5 mb-6 space-y-3">
|
||||||
<Link
|
<Link
|
||||||
to="/settings?section=profile"
|
to="/settings?section=profile"
|
||||||
className="group flex items-center gap-3 rounded-xl border border-white/10 bg-white/5 p-3.5 mb-6 hover:border-white/25 transition-colors"
|
className="group flex items-center gap-3"
|
||||||
>
|
>
|
||||||
<UserRound className="h-5 w-5 text-gray-400 flex-shrink-0" />
|
<UserRound className="h-5 w-5 text-gray-400 flex-shrink-0" />
|
||||||
<p className="text-xs text-gray-400 flex-1 leading-relaxed">
|
<p className="text-xs text-gray-400 flex-1 leading-relaxed">
|
||||||
This is your <span className="text-white font-bold">skate layer</span>, built on your Nostr profile.
|
This is your <span className="text-white font-bold">skate layer</span>, built on your Nostr profile.
|
||||||
Your name, photo & bio come from there — <span className="text-[#ccff00] font-bold group-hover:underline">edit your full profile</span> to change them everywhere.
|
Your name, photo, bio, lightning & verification come from there — <span className="text-[#ccff00] font-bold group-hover:underline">edit your full profile</span> to change them everywhere.
|
||||||
</p>
|
</p>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
|
{/* Chips showing EVERYTHING carried over from your kind-0 profile */}
|
||||||
|
<div className="flex flex-wrap items-center gap-1.5 pl-8">
|
||||||
|
{avatar && (
|
||||||
|
<span className="inline-flex items-center gap-1 text-[10px] font-bold px-2 py-1 rounded-full bg-black/40 border border-white/10 text-gray-300">
|
||||||
|
<img src={avatar} alt="" className="h-3.5 w-3.5 rounded-full object-cover" /> Photo
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
<span className="inline-flex items-center gap-1 text-[10px] font-bold px-2 py-1 rounded-full bg-black/40 border border-white/10 text-gray-300">
|
||||||
|
<UserRound className="h-3 w-3 text-[#ff0040]" /> {displayName}
|
||||||
|
</span>
|
||||||
|
{kind0About.trim() && (
|
||||||
|
<span className="inline-flex items-center gap-1 text-[10px] font-bold px-2 py-1 rounded-full bg-black/40 border border-white/10 text-gray-300">
|
||||||
|
<FileText className="h-3 w-3 text-gray-400" /> Bio
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
{kind0Website.trim() && (
|
||||||
|
<span className="inline-flex items-center gap-1 text-[10px] font-bold px-2 py-1 rounded-full bg-black/40 border border-white/10 text-gray-300">
|
||||||
|
<Globe className="h-3 w-3 text-sky-400" /> Website
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
{kind0Nip05 && (
|
||||||
|
<span className="inline-flex items-center gap-1 text-[10px] font-bold px-2 py-1 rounded-full bg-black/40 border border-white/10 text-gray-300">
|
||||||
|
<ShieldCheck className="h-3 w-3 text-[#ccff00]" /> {kind0Nip05}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
{kind0Lud16 && (
|
||||||
|
<span className="inline-flex items-center gap-1 text-[10px] font-bold px-2 py-1 rounded-full bg-black/40 border border-white/10 text-gray-300">
|
||||||
|
<Zap className="h-3 w-3 text-yellow-400" /> Zaps on
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{loadingExisting ? (
|
{loadingExisting ? (
|
||||||
<div className="flex items-center justify-center py-16 text-gray-500">
|
<div className="flex items-center justify-center py-16 text-gray-500">
|
||||||
<Loader2 className="h-5 w-5 animate-spin mr-2" /> Loading your profile…
|
<Loader2 className="h-5 w-5 animate-spin mr-2" /> Loading your profile…
|
||||||
|
|
|
||||||
|
|
@ -1305,10 +1305,10 @@ export default function LabPage() {
|
||||||
</div>
|
</div>
|
||||||
<div className="min-w-0 flex-1">
|
<div className="min-w-0 flex-1">
|
||||||
<p className="font-black uppercase text-sm leading-tight">
|
<p className="font-black uppercase text-sm leading-tight">
|
||||||
Just a <span className="text-[#ff0040]">skater</span>? Not a pro?
|
Just a <span className="text-[#ff0040]">skater</span>?
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-gray-400 mt-0.5">
|
<p className="text-xs text-gray-400 mt-0.5">
|
||||||
The Lab is for services. Browse & join the whole skater community →
|
The Lab is for services. Browse & join the whole skater community
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<ArrowRight className="h-5 w-5 text-gray-500 group-hover:text-[#ff0040] group-hover:translate-x-0.5 transition-all flex-shrink-0" />
|
<ArrowRight className="h-5 w-5 text-gray-500 group-hover:text-[#ff0040] group-hover:translate-x-0.5 transition-all flex-shrink-0" />
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@ import {
|
||||||
Zap,
|
Zap,
|
||||||
Calendar,
|
Calendar,
|
||||||
ExternalLink,
|
ExternalLink,
|
||||||
ArrowLeft,
|
|
||||||
Copy,
|
Copy,
|
||||||
Check,
|
Check,
|
||||||
Users,
|
Users,
|
||||||
|
|
@ -129,15 +128,6 @@ function ProfilePage({ pubkey }: { pubkey: string }) {
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<div className="container px-4 py-6 max-w-4xl">
|
<div className="container px-4 py-6 max-w-4xl">
|
||||||
{/* Back Button */}
|
|
||||||
<Link
|
|
||||||
to="/bounties"
|
|
||||||
className="inline-flex items-center text-gray-400 hover:text-white transition-colors mb-4"
|
|
||||||
>
|
|
||||||
<ArrowLeft className="h-4 w-4 mr-2" />
|
|
||||||
Back to Leaderboard
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
{/* Banner */}
|
{/* Banner */}
|
||||||
<div className="relative h-32 sm:h-48 rounded-xl overflow-hidden bg-gradient-to-br from-[#ff0040]/30 to-[#ccff00]/20 mb-4">
|
<div className="relative h-32 sm:h-48 rounded-xl overflow-hidden bg-gradient-to-br from-[#ff0040]/30 to-[#ccff00]/20 mb-4">
|
||||||
{banner && (
|
{banner && (
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue