Skip to content

Commit 4f31172

Browse files
committed
feat(propose): add realistic placeholders to template textarea fields
Each textarea field now ships with a concrete example based on Gnars proposal patterns (athlete profile, event logistics, droposal revenue splits, etc.) so users have a model to mimic instead of a blank canvas.
1 parent 76f75ef commit 4f31172

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

src/components/proposals/TemplateDetailsForm.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export const TemplateDetailsForm = forwardRef<TemplateDetailsFormHandle, Templat
106106
id={field.id}
107107
rows={field.rows ?? 4}
108108
className="resize-y"
109+
placeholder={field.placeholder}
109110
{...templateForm.register(field.id)}
110111
/>
111112
) : (

src/lib/proposal-template-schemas.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export type TemplateFieldDef =
88
type: "textarea";
99
rows?: number;
1010
required?: boolean;
11+
/** Concrete example shown as placeholder inside the textarea. */
12+
placeholder?: string;
1113
}
1214
| {
1315
id: string;
@@ -47,6 +49,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
4749
required: true,
4850
helper:
4951
"Name, sport (skate, surf, bodyboard, freeride), location, social links. If renewal, reference the previous proposal.",
52+
placeholder:
53+
"Ana Luiza, 22, surfer from Peniche, Portugal. @analuizasurfs on IG. This is a renewal of Prop #42 — stoked to shred another season with Gnars.",
5054
},
5155
{
5256
id: "content-plan",
@@ -55,6 +59,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
5559
rows: 5,
5660
helper:
5761
"Video parts, clips, photo sets, posting cadence (e.g. 2x/week wearing Noggles), events/competitions, collabs with other Gnars shredders.",
62+
placeholder:
63+
"- 2 full video parts (one mid-season, one year-end)\n- Weekly IG Reels + TikToks wearing Noggles\n- WSL Rio Pro coverage in September\n- Collab edit with @othershredder",
5864
},
5965
{
6066
id: "reach",
@@ -63,6 +69,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
6369
rows: 4,
6470
helper:
6571
"Current audience: follower counts per platform, engagement, past features, how this sponsorship expands Gnars visibility.",
72+
placeholder:
73+
"Instagram 12.4k / TikTok 3.2k / X 800 / Farcaster 450. Avg 8k views per reel. Featured in Surfer Magazine Aug 2025.",
6674
},
6775
{
6876
id: "budget",
@@ -79,6 +87,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
7987
required: true,
8088
helper:
8189
"Start and end dates, deliverables, milestone payments, reporting cadence (propdates, social posts).",
90+
placeholder:
91+
"Oct 1 2026 – Mar 31 2027 (6 months). Monthly propdates with photo + clip drops. Mid-season video part by Jan 15.",
8292
},
8393
{
8494
id: "track-record",
@@ -87,6 +97,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
8797
rows: 4,
8898
helper:
8999
"Past work, competition results, past Gnars proposals (if renewal), community endorsements.",
100+
placeholder:
101+
"2nd place Billabong Pro 2025 (link). Gnars-sponsored rider since Prop #31. Endorsed by @teamcaptain on Farcaster.",
90102
},
91103
],
92104
},
@@ -104,6 +116,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
104116
required: true,
105117
helper:
106118
"What type of event (conference + skate, hacker house, cultural activation). Where, when, why it matters for Gnars.",
119+
placeholder:
120+
"Crypto + skate weekend during ETHRio. 3 days of sessions + panels at Cidade do Samba, bridging onchain builders with the local skate scene.",
107121
},
108122
{
109123
id: "logistics",
@@ -112,6 +126,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
112126
rows: 4,
113127
helper:
114128
"Venue, city/country, dates, duration, attendance, travel/accommodation needs, permits.",
129+
placeholder:
130+
"Cidade do Samba, Rio de Janeiro. Apr 12–14 2026. ~200 attendees. Venue pre-booked. No permits required; private space.",
115131
},
116132
{
117133
id: "content-plan",
@@ -120,6 +136,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
120136
rows: 4,
121137
helper:
122138
"Photo/video coverage, who films/edits, deliverables, distribution channels, post-event timeline.",
139+
placeholder:
140+
"2 filmers + 1 photographer on site. Daily recap reels (same-day), 5-min final edit within 2 weeks. Distributed via Farcaster, IG, YouTube.",
123141
},
124142
{
125143
id: "budget",
@@ -135,6 +153,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
135153
rows: 4,
136154
helper:
137155
"Pre-event social, on-site branding (Noggles, merch, banners), partner cross-promotion, post-event recap.",
156+
placeholder:
157+
"4-week Farcaster + IG countdown. Noggles banners + merch on site. Cross-promo with ETHRio org. Post-event recap droposal.",
138158
},
139159
{
140160
id: "metrics",
@@ -144,6 +164,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
144164
required: true,
145165
helper:
146166
"Attendance, content views, new community members, press mentions, on-chain activity generated.",
167+
placeholder:
168+
"200 attendees, 50k combined video views, 10+ new token holders, coverage in at least 2 skate/crypto outlets.",
147169
},
148170
],
149171
},
@@ -161,6 +183,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
161183
required: true,
162184
helper:
163185
"What you're building (Noggles Rail, ramp, skate spot refurb, other). Where. Why this location matters for Gnars.",
186+
placeholder:
187+
"Noggles Rail at Ibirapuera skatepark, São Paulo. First Gnars installation in Brazil, in one of the most-skated parks in LATAM.",
164188
},
165189
{
166190
id: "permits",
@@ -169,6 +193,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
169193
rows: 4,
170194
helper:
171195
"Exact location, public vs private land, permits/approvals, landowner/municipality contact, legal/liability notes.",
196+
placeholder:
197+
"Public park, managed by SP Parques & Urbanismo. Met with park director on Feb 10 — verbal approval, signed authorization letter pending.",
172198
},
173199
{
174200
id: "construction",
@@ -177,6 +203,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
177203
rows: 5,
178204
helper:
179205
"Materials, dimensions, method, timeline, fabricator, Noggles branding integration (shape, color, placement).",
206+
placeholder:
207+
"6m steel round rail, 60mm diameter, powder-coated black. Noggles profile laser-cut into each end cap. Fabricator: Rampa X (São Paulo). 4-week build.",
180208
},
181209
{
182210
id: "budget",
@@ -193,6 +221,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
193221
required: true,
194222
helper:
195223
"Public access, long-term maintenance, expected lifespan, contribution to local scene.",
224+
placeholder:
225+
"Free public access 24/7. Maintenance handled by local collective SP Sessions. Expected 5+ year lifespan. Adds a missing feature to the park.",
196226
},
197227
{
198228
id: "docs-plan",
@@ -201,6 +231,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
201231
rows: 4,
202232
helper:
203233
"Build process photo/video, inauguration event, social content plan, related droposals.",
234+
placeholder:
235+
"Build time-lapse video. Opening session event + film crew. Commemorative droposal tied to the opening (separate prop).",
204236
},
205237
],
206238
},
@@ -218,6 +250,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
218250
required: true,
219251
helper:
220252
"What you're making (documentary, film, zine, podcast, photo book). The story and how it connects to Gnars culture.",
253+
placeholder:
254+
"20-minute documentary exploring surfing's role in São Tomé's coastal communities. Shot on 16mm to honor skate/surf film heritage.",
221255
},
222256
{
223257
id: "production",
@@ -226,6 +260,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
226260
rows: 5,
227261
helper:
228262
"Format and length, creative team roles, equipment/software, locations, post-production workflow.",
263+
placeholder:
264+
"10-day shoot + 6-week post. Director Jane Doe, DP John Roe. RED Komodo + underwater housing. Edit in DaVinci Resolve, score original.",
229265
},
230266
{
231267
id: "distribution",
@@ -234,6 +270,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
234270
rows: 4,
235271
helper:
236272
"Primary platforms, release schedule, cross-promotion, festival/media partnerships, archival plan.",
273+
placeholder:
274+
"YouTube premiere + Zora drop same day. Festival submissions (SXSW, Hot Docs). Archived on Arweave. Cross-posted on Farcaster + X.",
237275
},
238276
{
239277
id: "licensing",
@@ -242,6 +280,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
242280
rows: 4,
243281
helper:
244282
"CC0? If not, what rights does the DAO retain? Remix allowed? Third-party clearances (music, footage).",
283+
placeholder:
284+
"CC0. All footage original, score commissioned work-for-hire (rights assigned). No third-party clearances needed.",
245285
},
246286
{
247287
id: "budget",
@@ -259,6 +299,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
259299
required: true,
260300
helper:
261301
"Each deliverable with expected completion date, milestone checkpoints, progress comms (propdates, rough cuts).",
302+
placeholder:
303+
"- Rough cut: Jan 20 2026\n- Social trailer: Feb 1\n- Final delivery: Feb 15\n- Propdates every 3 weeks with BTS + stills",
262304
},
263305
],
264306
},
@@ -276,6 +318,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
276318
required: true,
277319
helper:
278320
"What you're building in plain language. Problem it solves for the Gnars community. Who will use it.",
321+
placeholder:
322+
"Gnars Hub — a mobile app aggregating proposals, propdates, and the TV feed. For members who want to stay plugged in on the go.",
279323
},
280324
{
281325
id: "architecture",
@@ -284,6 +328,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
284328
rows: 5,
285329
helper:
286330
"Stack, system architecture, integration with existing Gnars infra, external deps, smart contract changes.",
331+
placeholder:
332+
"Expo + React Native. Reuses gnars-website's /services layer via a shared package. Subgraph queries via @buildeross/sdk. No contract changes.",
287333
},
288334
{
289335
id: "open-source",
@@ -292,6 +338,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
292338
rows: 4,
293339
helper:
294340
"Open source? License? Repo link. Reusable by other DAOs? Contribution to Builder/Nouns/Base ecosystem.",
341+
placeholder:
342+
"MIT license. Repo at github.com/r4topunk/gnars-hub. Template reusable for any Builder DAO with minor config swaps.",
295343
},
296344
{
297345
id: "timeline",
@@ -301,6 +349,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
301349
required: true,
302350
helper:
303351
"Phases with scope + duration, key milestones, demo points, when users can test it.",
352+
placeholder:
353+
"- Phase 1 (4w): proposals + propdates feed\n- Phase 2 (3w): wallet integration + voting\n- Phase 3 (2w): push notifications\n- TestFlight beta end of Phase 2",
304354
},
305355
{
306356
id: "budget",
@@ -317,6 +367,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
317367
rows: 4,
318368
helper:
319369
"Maintenance plan, long-term owner, monitoring, community feedback loop, ongoing funding needs.",
370+
placeholder:
371+
"3 months maintenance covered (bug fixes, minor updates). After that, a separate prop for ongoing support. Sentry for monitoring.",
320372
},
321373
],
322374
},
@@ -334,6 +386,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
334386
required: true,
335387
helper:
336388
"Concept of the collection, story/moment it commemorates, connection to Gnars culture or IRL activation.",
389+
placeholder:
390+
'"First Rail" — a commemorative photo drop celebrating the opening of the Ibirapuera Noggles Rail (Prop #54). Captures the first session.',
337391
},
338392
{
339393
id: "artwork",
@@ -342,6 +396,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
342396
rows: 4,
343397
helper:
344398
"Artist name, background, portfolio. Style, medium, number of pieces, original vs derived.",
399+
placeholder:
400+
"5 photographs by Lucas Lima (@lukeslens). SP-based skate photographer, 10+ years shooting for Thrasher. All shot during the opening day.",
345401
},
346402
{
347403
id: "mint",
@@ -351,6 +407,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
351407
required: true,
352408
helper:
353409
"Edition type (open or fixed), size, price, duration, chain (Base), royalty %, revenue split config.",
410+
placeholder:
411+
"- Open edition\n- 0.001 ETH per mint\n- 14-day window: Dec 1–15 2026\n- Chain: Base\n- 10% secondary royalty\n- Split: 50% artist / 40% treasury / 10% rail maintenance fund",
354412
},
355413
{
356414
id: "irl",
@@ -359,6 +417,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
359417
rows: 4,
360418
helper:
361419
"Link to related proposal (event, installation, sponsorship). Photos/videos from the activation. Why this moment deserves commemoration.",
420+
placeholder:
421+
"Follows Prop #54 (Ibirapuera rail). Photos from the Nov 8 opening session — 80+ attendees, first Gnars rail in LATAM.",
362422
},
363423
{
364424
id: "revenue",
@@ -368,6 +428,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
368428
required: true,
369429
helper:
370430
"Revenue split percentages (artist, treasury, other), expected mint revenue, treasury benefit, secondary royalties.",
431+
placeholder:
432+
"Split: 50% artist / 40% treasury / 10% earmarked for rail maintenance fund. Conservative estimate: 80 mints = ~0.08 ETH, ~0.032 ETH to treasury.",
371433
},
372434
{
373435
id: "promotion",
@@ -376,6 +438,8 @@ export const TEMPLATE_SCHEMAS: Record<string, TemplateSchema> = {
376438
rows: 4,
377439
helper:
378440
"Drop date, pre-mint promo plan, allowlist vs open, post-mint community engagement (holders channel, utility).",
441+
placeholder:
442+
"Mint Dec 1–15 2026. Farcaster thread + IG story countdown starting Nov 24. Open mint (no allowlist). Post-mint: holders-only Telegram.",
379443
},
380444
],
381445
},

0 commit comments

Comments
 (0)