@moshevents/copy 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/lib/copy.d.ts +231 -0
  2. package/lib/copy.js +185 -0
  3. package/package.json +1 -1
package/lib/copy.d.ts CHANGED
@@ -10,6 +10,221 @@ export declare const copy: {
10
10
  count: number;
11
11
  }) => string;
12
12
  };
13
+ readonly tickets: {
14
+ readonly sectionTitle: "Tickets";
15
+ readonly getTickets: "Get tickets";
16
+ readonly noBookingFees: "No booking fees";
17
+ readonly soldOut: "Sold out";
18
+ readonly notYetOnSale: "Not yet on sale";
19
+ readonly remaining: (p: {
20
+ count: string | number;
21
+ }) => string;
22
+ readonly accessCodePlaceholder: "Access code";
23
+ readonly checkoutTitle: "Checkout";
24
+ readonly total: "Total";
25
+ readonly pay: (p: {
26
+ amount: string | number;
27
+ }) => string;
28
+ readonly success: {
29
+ readonly heading: "You're going";
30
+ readonly subtitle: "Your tickets are ready.";
31
+ };
32
+ readonly viewTickets: "View tickets";
33
+ readonly yourTickets: (p: {
34
+ count: string | number;
35
+ }) => string;
36
+ readonly ticketNofM: (p: {
37
+ n: string | number;
38
+ m: string | number;
39
+ }) => string;
40
+ readonly doorHint: "Show this at the door";
41
+ readonly selectTickets: "Select tickets";
42
+ readonly confirmed: "Confirmed";
43
+ readonly continueCta: "Continue";
44
+ readonly payWith: "Pay with";
45
+ readonly securedByStripe: "Secured by Stripe";
46
+ readonly bookingFees: "Booking fees";
47
+ readonly transferNote: "No booking fees. Tickets are transferable until doors open.";
48
+ readonly viewMyTicket: "View my ticket";
49
+ readonly confirmedCopy: "Your ticket lives in My QR — scan it at the door. We emailed a copy too.";
50
+ readonly ticketCount: (p: {
51
+ count: number;
52
+ }) => string;
53
+ readonly paidLabel: "Paid";
54
+ readonly orderNumber: (p: {
55
+ number: string | number;
56
+ }) => string;
57
+ readonly qtyTier: (p: {
58
+ count: string | number;
59
+ tier: string | number;
60
+ }) => string;
61
+ };
62
+ readonly eventPage: {
63
+ readonly hostedBy: "Hosted by";
64
+ readonly featuringLabel: "Featuring";
65
+ readonly getTicketsSub: (p: {
66
+ price: string | number;
67
+ }) => string;
68
+ readonly youreGoingCheck: "You're going ✓";
69
+ readonly rsvpCta: "RSVP";
70
+ readonly freeEntry: "Free entry";
71
+ readonly goingCheck: "Going ✓";
72
+ readonly onTheList: "You're on the list";
73
+ readonly rsvpReassurance: "RSVP so the host can plan";
74
+ readonly goingRowSolo: "You're going";
75
+ readonly goingRowOthers: (p: {
76
+ count: string | number;
77
+ }) => string;
78
+ readonly goingRowNamedOnly: (p: {
79
+ names: string | number;
80
+ }) => string;
81
+ readonly goingRowNamed: (p: {
82
+ names: string | number;
83
+ count: string | number;
84
+ }) => string;
85
+ readonly goingCount: (p: {
86
+ count: string | number;
87
+ }) => string;
88
+ readonly wentCount: (p: {
89
+ count: string | number;
90
+ }) => string;
91
+ readonly invite: "+ Invite";
92
+ readonly conversationTab: "Conversation";
93
+ readonly galleryTab: "Gallery";
94
+ readonly composerPlaceholder: "Say something to everyone going…";
95
+ readonly gateLine: "Only people going can post.";
96
+ readonly gateActionTicket: "Get a ticket →";
97
+ readonly gateActionRsvp: "RSVP →";
98
+ readonly lockedLine: "The conversation is for people going.";
99
+ readonly unlockTicket: "Get a ticket to join.";
100
+ readonly unlockRsvp: "RSVP to join.";
101
+ readonly reply: "Reply";
102
+ readonly isGoingSystem: (p: {
103
+ name: string | number;
104
+ }) => string;
105
+ readonly hostLabel: "Host";
106
+ readonly editEvent: "Edit event";
107
+ readonly addToList: "Add to list";
108
+ readonly scanAtDoor: "Scan at door";
109
+ readonly soldCount: (p: {
110
+ sold: string | number;
111
+ capacity: string | number;
112
+ }) => string;
113
+ readonly soldCountNoCap: (p: {
114
+ sold: string | number;
115
+ }) => string;
116
+ readonly rsvpCount: (p: {
117
+ count: string | number;
118
+ }) => string;
119
+ };
120
+ readonly ticketsManage: {
121
+ readonly title: "Tickets";
122
+ readonly pickEvent: "Choose an event to manage its ticketing.";
123
+ readonly upcomingSection: "Upcoming";
124
+ readonly pastSection: "Past";
125
+ readonly noEvents: "No events yet — create an event to start selling tickets.";
126
+ readonly loadFailed: "Couldn't load ticketing. Try again.";
127
+ readonly backToEvents: "All events";
128
+ readonly setup: {
129
+ readonly title: "Sell tickets on Mosh";
130
+ readonly subtitle: "Turn on ticketing to create tiers and start selling — no booking fees for your fans.";
131
+ readonly capacityLabel: "Total capacity (optional)";
132
+ readonly capacityHint: "Caps tickets across all tiers. Leave blank for no cap.";
133
+ readonly capacitySave: "Update capacity";
134
+ readonly enable: "Enable ticketing";
135
+ readonly disable: "Disable ticketing";
136
+ readonly disableConfirm: "Disable ticketing? Sales go offline and the event returns to draft.";
137
+ };
138
+ readonly stripe: {
139
+ readonly title: "Get paid with Stripe";
140
+ readonly body: "Connect your venue's Stripe account so ticket revenue can be paid out to you. It only takes a few minutes.";
141
+ readonly cta: "Set up payouts";
142
+ readonly refresh: "Refresh status";
143
+ readonly ready: "Stripe connected — payments enabled.";
144
+ readonly notReady: "Stripe onboarding incomplete — tickets can't go on sale until it's done.";
145
+ };
146
+ readonly sales: {
147
+ readonly title: "Sales status";
148
+ readonly summary: (p: {
149
+ sold: string | number;
150
+ gross: string | number;
151
+ }) => string;
152
+ readonly goOnSale: "Go on sale";
153
+ readonly pause: "Pause sales";
154
+ readonly resume: "Resume sales";
155
+ readonly close: "Close sales";
156
+ readonly closeConfirm: "Close ticket sales? Buyers will no longer be able to purchase tickets for this event.";
157
+ readonly status: {
158
+ readonly draft: "Draft";
159
+ readonly onSale: "On sale";
160
+ readonly paused: "Paused";
161
+ readonly closed: "Closed";
162
+ };
163
+ };
164
+ readonly tiers: {
165
+ readonly title: "Ticket tiers";
166
+ readonly add: "Add tier";
167
+ readonly empty: "No tiers yet. Add one to start selling.";
168
+ readonly colTier: "Tier";
169
+ readonly colPrice: "Price";
170
+ readonly colSold: "Sold";
171
+ readonly colStatus: "Status";
172
+ readonly held: (p: {
173
+ count: string | number;
174
+ }) => string;
175
+ readonly codeRequired: "Access code";
176
+ readonly edit: "Edit";
177
+ readonly archive: "Archive";
178
+ readonly pause: "Pause";
179
+ readonly activate: "Activate";
180
+ readonly archiveConfirm: (p: {
181
+ name: string | number;
182
+ }) => string;
183
+ readonly availability: {
184
+ readonly onSale: "On sale";
185
+ readonly upcoming: "Upcoming";
186
+ readonly soldOut: "Sold out";
187
+ readonly ended: "Ended";
188
+ readonly paused: "Paused";
189
+ };
190
+ };
191
+ readonly tierForm: {
192
+ readonly addTitle: "Add tier";
193
+ readonly editTitle: "Edit tier";
194
+ readonly name: "Name";
195
+ readonly namePlaceholder: "General admission";
196
+ readonly price: "Price (USD)";
197
+ readonly quantity: "Quantity";
198
+ readonly maxPerOrder: "Max per order";
199
+ readonly salesStart: "Sales start (optional)";
200
+ readonly salesEnd: "Sales end (optional)";
201
+ readonly requireCode: "Require an access code";
202
+ readonly codeLabel: "Access code";
203
+ readonly codeKeepHint: "Leave blank to keep the current code.";
204
+ readonly create: "Create tier";
205
+ readonly save: "Save changes";
206
+ };
207
+ readonly payout: {
208
+ readonly title: "Payout";
209
+ readonly gross: "Gross sales";
210
+ readonly fees: "Stripe fees";
211
+ readonly refunds: "Refunds";
212
+ readonly net: "Net payout";
213
+ readonly status: {
214
+ readonly held: "Held";
215
+ readonly eligible: "Eligible";
216
+ readonly transferred: "Transferred";
217
+ readonly failed: "Failed";
218
+ };
219
+ readonly heldHint: "Funds are released 24 hours after the event ends.";
220
+ readonly transferredOn: (p: {
221
+ date: string | number;
222
+ }) => string;
223
+ readonly manualHold: "This payout is on hold — contact Mosh support.";
224
+ readonly blockersTitle: "Waiting on";
225
+ readonly empty: "No sales yet — payout details will appear here.";
226
+ };
227
+ };
13
228
  readonly account: {
14
229
  readonly deactivate: {
15
230
  readonly title: "Deactivate or delete?";
@@ -159,11 +374,14 @@ export declare const copy: {
159
374
  readonly cancel: "Cancel";
160
375
  readonly ok: "OK";
161
376
  readonly delete: "Delete";
377
+ readonly add: "Add";
378
+ readonly remove: "Remove";
162
379
  readonly follow: "Follow";
163
380
  readonly sortBy: "Sort by";
164
381
  readonly following: "Following";
165
382
  readonly block: "Block";
166
383
  readonly unblock: "Unblock";
384
+ readonly couldntRefresh: "Couldn't refresh — check your connection";
167
385
  readonly relativeTime: {
168
386
  readonly today: "today";
169
387
  readonly daysAgo: (p: {
@@ -382,6 +600,19 @@ export declare const copy: {
382
600
  readonly audienceEmptySubtitle: (p: {
383
601
  venue: string | number;
384
602
  }) => string;
603
+ readonly blacklistAdd: "Add to blacklist";
604
+ readonly blacklistAddPrompt: "Enter the username to blacklist.";
605
+ readonly blacklistEditReason: "Edit reason";
606
+ readonly blacklistRemove: "Remove from blacklist";
607
+ readonly blacklistRemoveConfirm: (p: {
608
+ name: string | number;
609
+ }) => string;
610
+ readonly vipMake: "Make VIP";
611
+ readonly vipRemove: "Remove VIP";
612
+ readonly vipEditNote: "Edit note";
613
+ readonly vipRemoveConfirm: (p: {
614
+ name: string | number;
615
+ }) => string;
385
616
  };
386
617
  readonly button: {
387
618
  readonly editProfile: "Edit profile";
package/lib/copy.js CHANGED
@@ -17,6 +17,179 @@ export const copy = {
17
17
  return `${p.count} going`;
18
18
  },
19
19
  },
20
+ tickets: {
21
+ sectionTitle: "Tickets",
22
+ getTickets: "Get tickets",
23
+ noBookingFees: "No booking fees",
24
+ soldOut: "Sold out",
25
+ notYetOnSale: "Not yet on sale",
26
+ remaining: (p) => `${p.count} left`,
27
+ accessCodePlaceholder: "Access code",
28
+ checkoutTitle: "Checkout",
29
+ total: "Total",
30
+ pay: (p) => `Pay ${p.amount}`,
31
+ success: {
32
+ heading: "You're going",
33
+ subtitle: "Your tickets are ready.",
34
+ },
35
+ viewTickets: "View tickets",
36
+ yourTickets: (p) => `Your tickets (${p.count})`,
37
+ ticketNofM: (p) => `Ticket ${p.n} of ${p.m}`,
38
+ doorHint: "Show this at the door",
39
+ selectTickets: "Select tickets",
40
+ confirmed: "Confirmed",
41
+ continueCta: "Continue",
42
+ payWith: "Pay with",
43
+ securedByStripe: "Secured by Stripe",
44
+ bookingFees: "Booking fees",
45
+ transferNote: "No booking fees. Tickets are transferable until doors open.",
46
+ viewMyTicket: "View my ticket",
47
+ confirmedCopy: "Your ticket lives in My QR — scan it at the door. We emailed a copy too.",
48
+ ticketCount: (p) => {
49
+ const n = Number(p.count);
50
+ if (n === 1)
51
+ return `${p.count} ticket`;
52
+ return `${p.count} tickets`;
53
+ },
54
+ paidLabel: "Paid",
55
+ orderNumber: (p) => `Order ${p.number}`,
56
+ qtyTier: (p) => `${p.count} × ${p.tier}`,
57
+ },
58
+ eventPage: {
59
+ hostedBy: "Hosted by",
60
+ featuringLabel: "Featuring",
61
+ getTicketsSub: (p) => `Starting at ${p.price}`,
62
+ youreGoingCheck: "You're going ✓",
63
+ rsvpCta: "RSVP",
64
+ freeEntry: "Free entry",
65
+ goingCheck: "Going ✓",
66
+ onTheList: "You're on the list",
67
+ rsvpReassurance: "RSVP so the host can plan",
68
+ goingRowSolo: "You're going",
69
+ goingRowOthers: (p) => `You and ${p.count} others are going`,
70
+ goingRowNamedOnly: (p) => `You, ${p.names} are going`,
71
+ goingRowNamed: (p) => `You, ${p.names} and ${p.count} friends are going`,
72
+ goingCount: (p) => `${p.count} going`,
73
+ wentCount: (p) => `${p.count} went`,
74
+ invite: "+ Invite",
75
+ conversationTab: "Conversation",
76
+ galleryTab: "Gallery",
77
+ composerPlaceholder: "Say something to everyone going…",
78
+ gateLine: "Only people going can post.",
79
+ gateActionTicket: "Get a ticket →",
80
+ gateActionRsvp: "RSVP →",
81
+ lockedLine: "The conversation is for people going.",
82
+ unlockTicket: "Get a ticket to join.",
83
+ unlockRsvp: "RSVP to join.",
84
+ reply: "Reply",
85
+ isGoingSystem: (p) => `${p.name} is going`,
86
+ hostLabel: "Host",
87
+ editEvent: "Edit event",
88
+ addToList: "Add to list",
89
+ scanAtDoor: "Scan at door",
90
+ soldCount: (p) => `${p.sold} / ${p.capacity} sold`,
91
+ soldCountNoCap: (p) => `${p.sold} sold`,
92
+ rsvpCount: (p) => `${p.count} RSVPs`,
93
+ },
94
+ ticketsManage: {
95
+ title: "Tickets",
96
+ pickEvent: "Choose an event to manage its ticketing.",
97
+ upcomingSection: "Upcoming",
98
+ pastSection: "Past",
99
+ noEvents: "No events yet — create an event to start selling tickets.",
100
+ loadFailed: "Couldn't load ticketing. Try again.",
101
+ backToEvents: "All events",
102
+ setup: {
103
+ title: "Sell tickets on Mosh",
104
+ subtitle: "Turn on ticketing to create tiers and start selling — no booking fees for your fans.",
105
+ capacityLabel: "Total capacity (optional)",
106
+ capacityHint: "Caps tickets across all tiers. Leave blank for no cap.",
107
+ capacitySave: "Update capacity",
108
+ enable: "Enable ticketing",
109
+ disable: "Disable ticketing",
110
+ disableConfirm: "Disable ticketing? Sales go offline and the event returns to draft.",
111
+ },
112
+ stripe: {
113
+ title: "Get paid with Stripe",
114
+ body: "Connect your venue's Stripe account so ticket revenue can be paid out to you. It only takes a few minutes.",
115
+ cta: "Set up payouts",
116
+ refresh: "Refresh status",
117
+ ready: "Stripe connected — payments enabled.",
118
+ notReady: "Stripe onboarding incomplete — tickets can't go on sale until it's done.",
119
+ },
120
+ sales: {
121
+ title: "Sales status",
122
+ summary: (p) => `${p.sold} sold · ${p.gross} gross`,
123
+ goOnSale: "Go on sale",
124
+ pause: "Pause sales",
125
+ resume: "Resume sales",
126
+ close: "Close sales",
127
+ closeConfirm: "Close ticket sales? Buyers will no longer be able to purchase tickets for this event.",
128
+ status: {
129
+ draft: "Draft",
130
+ onSale: "On sale",
131
+ paused: "Paused",
132
+ closed: "Closed",
133
+ },
134
+ },
135
+ tiers: {
136
+ title: "Ticket tiers",
137
+ add: "Add tier",
138
+ empty: "No tiers yet. Add one to start selling.",
139
+ colTier: "Tier",
140
+ colPrice: "Price",
141
+ colSold: "Sold",
142
+ colStatus: "Status",
143
+ held: (p) => `${p.count} held`,
144
+ codeRequired: "Access code",
145
+ edit: "Edit",
146
+ archive: "Archive",
147
+ pause: "Pause",
148
+ activate: "Activate",
149
+ archiveConfirm: (p) => `Archive "${p.name}"? It keeps its sales history but can never sell again.`,
150
+ availability: {
151
+ onSale: "On sale",
152
+ upcoming: "Upcoming",
153
+ soldOut: "Sold out",
154
+ ended: "Ended",
155
+ paused: "Paused",
156
+ },
157
+ },
158
+ tierForm: {
159
+ addTitle: "Add tier",
160
+ editTitle: "Edit tier",
161
+ name: "Name",
162
+ namePlaceholder: "General admission",
163
+ price: "Price (USD)",
164
+ quantity: "Quantity",
165
+ maxPerOrder: "Max per order",
166
+ salesStart: "Sales start (optional)",
167
+ salesEnd: "Sales end (optional)",
168
+ requireCode: "Require an access code",
169
+ codeLabel: "Access code",
170
+ codeKeepHint: "Leave blank to keep the current code.",
171
+ create: "Create tier",
172
+ save: "Save changes",
173
+ },
174
+ payout: {
175
+ title: "Payout",
176
+ gross: "Gross sales",
177
+ fees: "Stripe fees",
178
+ refunds: "Refunds",
179
+ net: "Net payout",
180
+ status: {
181
+ held: "Held",
182
+ eligible: "Eligible",
183
+ transferred: "Transferred",
184
+ failed: "Failed",
185
+ },
186
+ heldHint: "Funds are released 24 hours after the event ends.",
187
+ transferredOn: (p) => `Transferred ${p.date}`,
188
+ manualHold: "This payout is on hold — contact Mosh support.",
189
+ blockersTitle: "Waiting on",
190
+ empty: "No sales yet — payout details will appear here.",
191
+ },
192
+ },
20
193
  account: {
21
194
  deactivate: {
22
195
  title: "Deactivate or delete?",
@@ -154,11 +327,14 @@ export const copy = {
154
327
  cancel: "Cancel",
155
328
  ok: "OK",
156
329
  delete: "Delete",
330
+ add: "Add",
331
+ remove: "Remove",
157
332
  follow: "Follow",
158
333
  sortBy: "Sort by",
159
334
  following: "Following",
160
335
  block: "Block",
161
336
  unblock: "Unblock",
337
+ couldntRefresh: "Couldn't refresh — check your connection",
162
338
  relativeTime: {
163
339
  today: "today",
164
340
  daysAgo: (p) => `${p.count}d ago`,
@@ -349,6 +525,15 @@ export const copy = {
349
525
  vipBadge: "VIP",
350
526
  audienceEmptyTitle: "No visitors yet",
351
527
  audienceEmptySubtitle: (p) => `Users who check in to events at ${p.venue} will appear here.`,
528
+ blacklistAdd: "Add to blacklist",
529
+ blacklistAddPrompt: "Enter the username to blacklist.",
530
+ blacklistEditReason: "Edit reason",
531
+ blacklistRemove: "Remove from blacklist",
532
+ blacklistRemoveConfirm: (p) => `Remove ${p.name} from the blacklist?`,
533
+ vipMake: "Make VIP",
534
+ vipRemove: "Remove VIP",
535
+ vipEditNote: "Edit note",
536
+ vipRemoveConfirm: (p) => `Remove ${p.name} from the VIP list?`,
352
537
  },
353
538
  button: {
354
539
  editProfile: "Edit profile",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moshevents/copy",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Mosh — single source of truth for user-facing copy. Typed `copy` for web/admin; iOS consumes the SwiftPM target.",
5
5
  "type": "module",
6
6
  "files": [