@tribe-nest/forge 3.54.0 → 3.58.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 (102) hide show
  1. package/package.json +4 -2
  2. package/src/_tests/workspaceAliases.ts +1 -0
  3. package/src/contexts/CartContext.tsx +88 -5
  4. package/src/data/queries/useCallBreakouts.ts +112 -0
  5. package/src/data/queries/useCheckouts.ts +15 -2
  6. package/src/data/queries/useCoachingProducts.ts +15 -1
  7. package/src/data/queries/useCourses.ts +15 -1
  8. package/src/data/queries/useEvents.ts +80 -1
  9. package/src/data/queries/useMembership.ts +176 -4
  10. package/src/data/queries/useMyBookings.ts +16 -0
  11. package/src/data/queries/useNotifications.ts +1 -1
  12. package/src/data/queries/useProducts.ts +15 -1
  13. package/src/data/queries/useSubscriptions.ts +21 -1
  14. package/src/i18n/de.json +153 -0
  15. package/src/i18n/en.json +153 -0
  16. package/src/index.ts +1 -0
  17. package/src/server/_tests/buildPwaHead.spec.ts +1 -1
  18. package/src/server/_tests/buildWebManifest.spec.ts +1 -1
  19. package/src/server/_tests/forgeServiceWorkerScript.spec.ts +1 -1
  20. package/src/server/index.ts +75 -1
  21. package/src/server/platformEvents.generated.ts +60 -0
  22. package/src/server/pwa.ts +1 -1
  23. package/src/types/models.ts +137 -0
  24. package/src/ui/analytics/ForgeAnalytics.tsx +55 -1
  25. package/src/ui/analytics/_tests/ForgeAnalytics.engagement.spec.tsx +78 -0
  26. package/src/ui/headless/checkout/_tests/bundleCoupon.spec.ts +3 -1
  27. package/src/ui/headless/checkout/_tests/cartResume.spec.ts +3 -10
  28. package/src/ui/headless/checkout/_tests/seatConflict.spec.ts +187 -0
  29. package/src/ui/headless/checkout/_tests/useCartResume.spec.tsx +3 -11
  30. package/src/ui/headless/checkout/_tests/useCheckoutSeats.spec.tsx +313 -0
  31. package/src/ui/headless/checkout/seatConflict.ts +117 -0
  32. package/src/ui/headless/checkout/useCheckout.ts +178 -55
  33. package/src/ui/headless/event/_tests/seatingFixture.ts +111 -0
  34. package/src/ui/headless/event/_tests/useEventCheckoutSeats.spec.tsx +443 -0
  35. package/src/ui/headless/event/_tests/useEventSeating.spec.tsx +154 -0
  36. package/src/ui/headless/event/useEventCheckout.ts +362 -22
  37. package/src/ui/headless/event/useEventSeating.ts +233 -0
  38. package/src/ui/headless/forms/_tests/usePhoneInput.spec.ts +187 -0
  39. package/src/ui/headless/forms/useEmailListForm.ts +37 -6
  40. package/src/ui/headless/forms/usePhoneInput.ts +294 -0
  41. package/src/ui/headless/forms/useSectionedForm.ts +2 -2
  42. package/src/ui/headless/index.ts +48 -1
  43. package/src/ui/headless/membership/_tests/membershipApplication.spec.ts +85 -0
  44. package/src/ui/headless/membership/_tests/membershipCheckoutRefetch.spec.tsx +2 -0
  45. package/src/ui/headless/membership/_tests/membershipTrial.spec.ts +61 -0
  46. package/src/ui/headless/membership/_tests/useMembershipCheckoutApplication.spec.tsx +253 -0
  47. package/src/ui/headless/membership/_tests/useMembershipCheckoutQuestionnaire.spec.tsx +241 -0
  48. package/src/ui/headless/membership/_tests/useMembershipCheckoutTrial.spec.tsx +165 -0
  49. package/src/ui/headless/membership/membershipApplication.ts +109 -0
  50. package/src/ui/headless/membership/membershipQuestionnaire.ts +44 -0
  51. package/src/ui/headless/membership/membershipTrial.ts +53 -0
  52. package/src/ui/headless/membership/useMembershipCheckout.ts +227 -8
  53. package/src/ui/index.ts +16 -0
  54. package/src/ui/media/CallStage.tsx +107 -10
  55. package/src/ui/media/_tests/CallBreakoutsPanel.spec.tsx +271 -0
  56. package/src/ui/media/_tests/CallStageBreakouts.spec.tsx +212 -0
  57. package/src/ui/media/_tests/callState.spec.ts +103 -1
  58. package/src/ui/media/callBreakouts.ts +57 -0
  59. package/src/ui/media/callState.ts +83 -23
  60. package/src/ui/media/index.ts +11 -0
  61. package/src/ui/media/panels/CallBreakoutsPanel.tsx +395 -0
  62. package/src/ui/media/panels/CallSidePanel.tsx +37 -4
  63. package/src/ui/media/stage/CallCenterNotice.tsx +5 -3
  64. package/src/ui/media/stage/CallControlsBar.tsx +46 -0
  65. package/src/ui/media/stage/CallTopBar.tsx +1 -1
  66. package/src/ui/payment/ForgePaymentProvider.tsx +14 -0
  67. package/src/ui/payment/ForgeStripePayment.tsx +78 -7
  68. package/src/ui/payment/_tests/ForgeStripePaymentTrial.spec.tsx +101 -0
  69. package/src/ui/payment/_tests/stripeIntentKind.spec.ts +43 -0
  70. package/src/ui/payment/stripeIntentKind.ts +32 -0
  71. package/src/ui/shell/TribeNestApp.tsx +1 -1
  72. package/src/ui/styled/AccountDashboard.tsx +165 -2
  73. package/src/ui/styled/BundleConfirmation.tsx +47 -2
  74. package/src/ui/styled/Cart.tsx +211 -135
  75. package/src/ui/styled/Checkout.tsx +163 -32
  76. package/src/ui/styled/EmailListForm.tsx +7 -9
  77. package/src/ui/styled/EventTickets.tsx +143 -4
  78. package/src/ui/styled/LoginForm.tsx +5 -3
  79. package/src/ui/styled/MembershipCheckout.tsx +596 -256
  80. package/src/ui/styled/MembershipTierCallout.tsx +17 -3
  81. package/src/ui/styled/MembershipTiers.tsx +148 -6
  82. package/src/ui/styled/PhoneInput.tsx +127 -0
  83. package/src/ui/styled/ProductGrid.tsx +14 -2
  84. package/src/ui/styled/SignupForm.tsx +4 -2
  85. package/src/ui/styled/_tests/AccountDashboardBookingCall.spec.tsx +36 -0
  86. package/src/ui/styled/_tests/AccountDashboardTrial.spec.tsx +105 -0
  87. package/src/ui/styled/_tests/CartSeats.spec.tsx +109 -0
  88. package/src/ui/styled/_tests/CheckoutSeatsConflict.spec.tsx +194 -0
  89. package/src/ui/styled/_tests/EventSeatPicker.spec.tsx +199 -0
  90. package/src/ui/styled/_tests/MembershipCheckout.spec.tsx +106 -0
  91. package/src/ui/styled/_tests/membershipTiersCuratedAccess.spec.tsx +139 -0
  92. package/src/ui/styled/_tests/membershipTiersTrial.spec.tsx +97 -0
  93. package/src/ui/styled/forge-utilities.css +67 -0
  94. package/src/ui/styled/seating/EventSeatPicker.tsx +190 -0
  95. package/src/ui/styled/seating/SeatLegend.tsx +73 -0
  96. package/src/ui/styled/seating/SeatMapCanvas.tsx +647 -0
  97. package/src/ui/styled/seating/paint.ts +79 -0
  98. package/src/ui/styled/seating/useSeatMapViewport.ts +248 -0
  99. package/src/ui/styled/seating/viewport.ts +86 -0
  100. package/src/utils/_tests/engagementTracker.spec.ts +111 -0
  101. package/src/utils/engagementTracker.ts +73 -0
  102. package/src/utils/landing.ts +1 -1
@@ -122,6 +122,22 @@ export type MyBooking = {
122
122
  /** The server's answer. Never recomputed here. */
123
123
  canReschedule: boolean;
124
124
  rescheduleReason: RescheduleRefusal | null;
125
+ /**
126
+ * The last instant a self-service move is allowed (ISO), or null when it is
127
+ * not allowed at all. Optional: an older API build does not emit it.
128
+ */
129
+ rescheduleDeadline?: string | null;
130
+ /**
131
+ * The reschedule rule this booking was sold under. `followsCancellation` is
132
+ * true when the coach set no reschedule policy, so the cancellation window
133
+ * governs moves and its sentence already covers it. Optional, as above.
134
+ */
135
+ reschedulePolicy?: {
136
+ policy: "none" | "until" | "anytime";
137
+ cutoffHours: number | null;
138
+ followsCancellation: boolean;
139
+ description: string | null;
140
+ };
125
141
  /**
126
142
  * The session's `.ics`, both forms — what lets the portal offer Apple
127
143
  * Calendar rather than only Google/Outlook/Microsoft 365. `null` unless the
@@ -5,7 +5,7 @@ import { useCallback, useEffect, useState } from "react";
5
5
  /**
6
6
  * Member notification headless hooks — the FROZEN public contract that the
7
7
  * apps/client PWA and every generated custom-code site consume. Speaks ONLY the
8
- * `/public/notifications/*` API (see docs/membership-notifications-initiative.md
8
+ * `/public/notifications/*` API (see docs/archive/shipped/membership-notifications-initiative.md
9
9
  * "API surface"). Moved here from apps/client so custom-code sites get push
10
10
  * subscription registration, inbox, and a settings matrix with no apps/client
11
11
  * code.
@@ -41,7 +41,20 @@ export function useFeaturedProducts(productType?: ProductType) {
41
41
  });
42
42
  }
43
43
 
44
- export function useGetProducts(params?: GetProductsParams, enabled = true) {
44
+ export function useGetProducts(
45
+ params?: GetProductsParams,
46
+ enabled = true,
47
+ options?: {
48
+ /**
49
+ * The page a server render already fetched.
50
+ *
51
+ * Seeds the cache so the first client render matches the markup and nothing
52
+ * is refetched. Must be built with the SAME params as the key below, or the
53
+ * seed belongs to a different query and is ignored.
54
+ */
55
+ initialData?: PaginatedData<IPublicProduct>;
56
+ },
57
+ ) {
45
58
  const { client, profileId } = useForge();
46
59
 
47
60
  return useQuery<PaginatedData<IPublicProduct>>({
@@ -64,6 +77,7 @@ export function useGetProducts(params?: GetProductsParams, enabled = true) {
64
77
  return res.data;
65
78
  },
66
79
  enabled: !!profileId && !!client && enabled,
80
+ initialData: options?.initialData,
67
81
  });
68
82
  }
69
83
 
@@ -1,6 +1,7 @@
1
1
  import { useForge } from "../../provider/ForgeProvider";
2
2
  import { useMutation } from "@tanstack/react-query";
3
3
  import { usePublicAuth } from "../../contexts/PublicAuthContext";
4
+ import type { QuestionnaireAnswer } from "../../types/models";
4
5
  import {
5
6
  getMembershipAccess,
6
7
  getMembershipStatusMessage,
@@ -14,6 +15,13 @@ export type CreateSubscriptionInput = {
14
15
  membershipTierId: string;
15
16
  returnUrl: string;
16
17
  attributionRefId?: string;
18
+ /**
19
+ * A membership invite token. Required by the server on an `invite` tier (the
20
+ * invite must be for the signed-in email); ignored on an open tier.
21
+ */
22
+ inviteToken?: string;
23
+ /** Answers to the tier's questions. Required by the server when the tier has any. */
24
+ questionnaire?: QuestionnaireAnswer[];
17
25
  };
18
26
 
19
27
  /**
@@ -41,6 +49,12 @@ export type CreateSubscriptionResult = {
41
49
  currentPeriodEnd?: string;
42
50
  requiresPayment?: boolean;
43
51
  changed?: boolean;
52
+ /**
53
+ * Set when this subscription starts with a free trial. `clientSecret` is then
54
+ * a Stripe SetupIntent secret (`seti_...`): the card is saved, nothing is
55
+ * charged today, and the first charge is on `endsAt`.
56
+ */
57
+ trial?: { days: number; endsAt: string } | null;
44
58
  };
45
59
 
46
60
  /** Subscribe to a paid tier, or move an existing subscription onto another one. */
@@ -59,7 +73,13 @@ export function useCreateSubscription() {
59
73
  export function useCreateFreeSubscription() {
60
74
  const { client, profileId } = useForge();
61
75
 
62
- return useMutation<unknown, unknown, { membershipTierId: string; attributionRefId?: string }>({
76
+ return useMutation<unknown, unknown, {
77
+ membershipTierId: string;
78
+ attributionRefId?: string;
79
+ inviteToken?: string;
80
+ /** Answers to the tier's questions. Required by the server when the tier has any. */
81
+ questionnaire?: QuestionnaireAnswer[];
82
+ }>({
63
83
  mutationFn: async (body) => {
64
84
  const res = await client.post("/public/payments/subscriptions/free", { ...body, profileId });
65
85
  return res.data;
package/src/i18n/de.json CHANGED
@@ -1,4 +1,19 @@
1
1
  {
2
+ "forge.account_dashboard.application_complete": "Mitgliedschaft abschließen",
3
+ "forge.account_dashboard.application_complete_by": "Abschließen bis {date}",
4
+ "forge.account_dashboard.application_status_approved": "Angenommen, wird eingerichtet",
5
+ "forge.account_dashboard.application_status_card_pending": "Karte noch nicht bestätigt",
6
+ "forge.account_dashboard.application_status_declined": "Nicht angenommen",
7
+ "forge.account_dashboard.application_status_expired": "Abgelaufen",
8
+ "forge.account_dashboard.application_status_joined": "Beigetreten",
9
+ "forge.account_dashboard.application_status_payment_failed": "Angenommen: Mitgliedschaft abschließen",
10
+ "forge.account_dashboard.application_status_pending": "Bewerbung wird geprüft",
11
+ "forge.account_dashboard.application_status_withdrawn": "Zurückgezogen",
12
+ "forge.account_dashboard.application_submitted_on": "Beworben am {date}",
13
+ "forge.account_dashboard.application_withdraw": "Zurückziehen",
14
+ "forge.account_dashboard.application_withdraw_error": "Wir konnten deine Bewerbung nicht zurückziehen. Bitte versuche es erneut.",
15
+ "forge.account_dashboard.application_withdrawing": "Wird zurückgezogen…",
16
+ "forge.account_dashboard.applications_title": "Deine Bewerbungen",
2
17
  "forge.account_dashboard.billing_portal_error": "Wir konnten die Zahlungsseite nicht öffnen. Bitte kontaktiere uns.",
3
18
  "forge.account_dashboard.billing_portal_opening": "Wird geöffnet…",
4
19
  "forge.account_dashboard.booking_cancel_error": "Wir konnten diese Session nicht stornieren. Bitte versuche es erneut.",
@@ -16,6 +31,7 @@
16
31
  "forge.account_dashboard.cancel_confirm_paid": "Sie wird nicht verlängert, und Ihre Vorteile bleiben bis zum Ende des bezahlten Zeitraums bestehen.",
17
32
  "forge.account_dashboard.cancel_confirm_paid_until": "Sie wird nicht verlängert, und Ihre Vorteile bleiben bis zum {date} bestehen.",
18
33
  "forge.account_dashboard.cancel_confirm_title": "Mitgliedschaft kündigen?",
34
+ "forge.account_dashboard.cancel_confirm_trial": "Ihre kostenlose Testphase wird nicht zu einer bezahlten Mitgliedschaft. Ihre Vorteile bleiben bis zum {date} bestehen, und es wird nichts berechnet.",
19
35
  "forge.account_dashboard.cancel_deletion": "Löschung abbrechen",
20
36
  "forge.account_dashboard.cancel_session": "Session stornieren",
21
37
  "forge.account_dashboard.cancel_ticket": "Ticket stornieren",
@@ -29,6 +45,8 @@
29
45
  "forge.account_dashboard.courses_start": "Starten",
30
46
  "forge.account_dashboard.courses_title": "Deine Kurse",
31
47
  "forge.account_dashboard.current_password": "Aktuelles Passwort",
48
+ "forge.account_dashboard.cycle_month": "Monat",
49
+ "forge.account_dashboard.cycle_year": "Jahr",
32
50
  "forge.account_dashboard.data_export_description": "Exportiere eine Kopie deiner persönlichen Daten.",
33
51
  "forge.account_dashboard.data_section_title": "Deine Daten",
34
52
  "forge.account_dashboard.delete_section_title": "Konto löschen",
@@ -50,6 +68,9 @@
50
68
  "forge.account_dashboard.membership_price": "{amount} / {cycle}",
51
69
  "forge.account_dashboard.membership_renews_on": "Verlängert sich am {date}",
52
70
  "forge.account_dashboard.membership_title": "Aktuelle Mitgliedschaft",
71
+ "forge.account_dashboard.membership_trial_cancelled": "Gekündigt. Es wird nichts berechnet.",
72
+ "forge.account_dashboard.membership_trial_then": "Danach {amount} pro {cycle} ab dem {date}.",
73
+ "forge.account_dashboard.membership_trial_until": "Kostenlose Testphase bis zum {date}",
53
74
  "forge.account_dashboard.new_password": "Neues Passwort",
54
75
  "forge.account_dashboard.notifications_title": "Benachrichtigungsarten",
55
76
  "forge.account_dashboard.notify_chat_description": "Werde benachrichtigt, wenn neue Chatnachrichten ankommen",
@@ -208,6 +229,7 @@
208
229
  "forge.bundle_confirmation.partial_body": "Deine Zahlung ist angekommen und ein Teil deiner Bestellung ist bestätigt. Den Rest schließen wir gerade ab. Er kommt gleich per E-Mail, ohne weitere Kosten für dich.",
209
230
  "forge.bundle_confirmation.partial_title": "Zahlung erhalten",
210
231
  "forge.bundle_confirmation.return_to_checkout": "Zurück zur Kasse",
232
+ "forge.bundle_confirmation.seats_title": "Deine Plätze",
211
233
  "forge.bundle_confirmation.summary_both": "In einem Schritt bezahlt. Deine Tickets kommen per E-Mail und deine Bestellung ist bestätigt.",
212
234
  "forge.bundle_confirmation.summary_order": "In einem Schritt bezahlt. Deine Bestellung ist bestätigt.",
213
235
  "forge.bundle_confirmation.summary_paid": "In einem Schritt bezahlt.",
@@ -215,6 +237,40 @@
215
237
  "forge.bundle_confirmation.tickets_emailed": "Tickets per E-Mail an dich unterwegs",
216
238
  "forge.bundle_confirmation.title": "Alles erledigt",
217
239
  "forge.bundle_confirmation.view_orders": "Bestellungen ansehen",
240
+ "forge.call_stage.breakouts.assign_auto": "Automatisch",
241
+ "forge.call_stage.breakouts.assign_label": "Personen zuweisen",
242
+ "forge.call_stage.breakouts.assign_manual": "Ich weise sie selbst zu",
243
+ "forge.call_stage.breakouts.assigned_not_arrived": "(unterwegs)",
244
+ "forge.call_stage.breakouts.button": "Räume",
245
+ "forge.call_stage.breakouts.close_all": "Alle Räume schließen",
246
+ "forge.call_stage.breakouts.close_cancel": "Offen lassen",
247
+ "forge.call_stage.breakouts.close_confirm": "Räume schließen",
248
+ "forge.call_stage.breakouts.close_confirm_body": "Alle kommen zurück in den Hauptraum, und die Räume werden geschlossen.",
249
+ "forge.call_stage.breakouts.count_label": "Anzahl der Räume",
250
+ "forge.call_stage.breakouts.create": "Räume erstellen",
251
+ "forge.call_stage.breakouts.create_title": "Gruppenräume",
252
+ "forge.call_stage.breakouts.current_marker": "Du bist hier",
253
+ "forge.call_stage.breakouts.empty_room": "Noch niemand hier",
254
+ "forge.call_stage.breakouts.error": "Das hat nicht geklappt. Versuche es noch einmal.",
255
+ "forge.call_stage.breakouts.help_attendee": "Die Gastgeberin oder der Gastgeber hat diesen Anruf in kleinere Räume aufgeteilt. Du wirst automatisch verschoben, Kamera und Mikrofon bleiben wie sie sind, und du kommst zurück in den Hauptraum, wenn die Räume geschlossen werden oder du auf Zurück in den Hauptraum drückst.",
256
+ "forge.call_stage.breakouts.help_attendee_label": "Was sind Gruppenräume?",
257
+ "forge.call_stage.breakouts.help_create": "Jeder Raum ist ein eigener Anruf unter diesem. Bei automatischer Zuweisung werden alle Anwesenden gleichmäßig auf die Räume verteilt und sofort verschoben; bei manueller Zuweisung bewegt sich niemand, bis du einen Raum für die Person wählst. Du kannst selbst jeden Raum betreten, und alle kommen zurück, wenn du die Räume schließt.",
258
+ "forge.call_stage.breakouts.help_create_label": "Was passiert, wenn ich Räume erstelle?",
259
+ "forge.call_stage.breakouts.help_join": "Beitreten bringt dich in diesen Raum; die anderen Räume laufen ohne dich weiter. Ein Raum neben einem Namen verschiebt diese Person, und eine Aufzeichnung, die du startest, folgt dem Raum, in dem du bist.",
260
+ "forge.call_stage.breakouts.help_join_label": "Wie wechsle ich zwischen Räumen?",
261
+ "forge.call_stage.breakouts.join": "Beitreten",
262
+ "forge.call_stage.breakouts.loading": "Räume werden geladen…",
263
+ "forge.call_stage.breakouts.main_room": "Hauptraum",
264
+ "forge.call_stage.breakouts.move_to_label": "{name} in einen Raum verschieben",
265
+ "forge.call_stage.breakouts.participant_count": "{count} in diesem Raum",
266
+ "forge.call_stage.breakouts.return_to_main": "Zurück zum Hauptraum",
267
+ "forge.call_stage.breakouts.return_to_main_room": "Zurück in den Hauptraum",
268
+ "forge.call_stage.breakouts.status_moving": "Du wirst in {room} verschoben",
269
+ "forge.call_stage.breakouts.status_moving_detail": "Kamera und Mikrofon bleiben wie sie sind.",
270
+ "forge.call_stage.breakouts.status_returning": "Du kommst zurück in den Hauptraum",
271
+ "forge.call_stage.breakouts.tab": "Räume",
272
+ "forge.call_stage.breakouts.you_are_in": "Du bist in {room}",
273
+ "forge.call_stage.breakouts.you_are_in_main": "Du bist im Hauptraum",
218
274
  "forge.call_stage.camera_start": "Kamera starten",
219
275
  "forge.call_stage.camera_stop": "Kamera stoppen",
220
276
  "forge.call_stage.chat": "Chat",
@@ -332,6 +388,7 @@
332
388
  "forge.cart.aria_remove_item": "Artikel entfernen",
333
389
  "forge.cart.aria_remove_tickets": "Tickets entfernen",
334
390
  "forge.cart.attached_to_tickets": "Mit deinen Tickets hinzugefügt",
391
+ "forge.cart.change_seats": "Plätze ändern",
335
392
  "forge.cart.checkout": "Zur Kasse",
336
393
  "forge.cart.empty_title": "Dein Warenkorb ist leer.",
337
394
  "forge.cart.gift_for": "Geschenk für {recipient_name} ({recipient_email})",
@@ -415,6 +472,10 @@
415
472
  "forge.checkout.rate_days": "({days} Tage)",
416
473
  "forge.checkout.rate_estimated_day": "Voraussichtlich {days} Tag",
417
474
  "forge.checkout.rate_estimated_days": "Voraussichtlich {days} Tage",
475
+ "forge.checkout.seats_conflict_action": "Andere Plätze wählen",
476
+ "forge.checkout.seats_conflict_body": "{seats} für {event_title} sind an jemand anderen gegangen. Wähle andere Plätze, um fortzufahren; der Rest deines Warenkorbs bleibt unverändert.",
477
+ "forge.checkout.seats_conflict_title": "Einige deiner Plätze wurden gerade vergeben",
478
+ "forge.checkout.seats_label": "Plätze: {seats}",
418
479
  "forge.checkout.shipping": "Versand",
419
480
  "forge.checkout.shipping_address_title": "Lieferadresse",
420
481
  "forge.checkout.shipping_options_title": "Versandoptionen",
@@ -788,6 +849,17 @@
788
849
  "forge.event_detail.not_found": "Event nicht gefunden.",
789
850
  "forge.event_detail.presale_only": "Tickets für dieses Event gibt es nur im Vorverkauf.",
790
851
  "forge.event_detail.price_from_label": "Ab",
852
+ "forge.event_seat_picker.dismiss": "Schließen",
853
+ "forge.event_seat_picker.empty": "Es gibt noch keine Plätze zur Auswahl.",
854
+ "forge.event_seat_picker.help_body": "Tippe auf einen Platz, um ihn auszuwählen, und noch einmal, um ihn freizugeben. Zoome mit zwei Fingern oder dem Mausrad und ziehe, um den Plan zu verschieben. Graue Plätze sind nicht verfügbar. Beste verfügbare wählt die niedrigsten zusammenhängenden Plätze für dich.",
855
+ "forge.event_seat_picker.help_label": "Wie wähle ich Plätze aus?",
856
+ "forge.event_seat_picker.loading": "Saalplan wird geladen",
857
+ "forge.event_seat_picker.max_reached": "Du hast die maximale Anzahl an Plätzen für {tier} erreicht.",
858
+ "forge.event_seat_picker.mix_blocked": "Dieser Platz kann deiner aktuellen Auswahl nicht hinzugefügt werden.",
859
+ "forge.event_seat_picker.seat_unavailable": "Dieser Platz ist nicht verfügbar.",
860
+ "forge.event_seat_picker.seats_taken_body": "{seats} sind an jemand anderen gegangen. Wähle erneut aus den noch verfügbaren Plätzen.",
861
+ "forge.event_seat_picker.seats_taken_title": "Einige deiner Plätze wurden gerade vergeben",
862
+ "forge.event_seat_picker.title": "Plätze auswählen",
791
863
  "forge.event_series_detail.date_count": "{count} Termine",
792
864
  "forge.event_series_detail.date_count_range": "{count} Termine · {first_date} bis {last_date}",
793
865
  "forge.event_series_detail.location_online": "Online",
@@ -862,6 +934,11 @@
862
934
  "forge.event_tickets.pwyw_range_min_max": "(mindestens {min}, bis {max})",
863
935
  "forge.event_tickets.remove_discount": "Rabatt entfernen",
864
936
  "forge.event_tickets.request_tickets": "Tickets anfragen",
937
+ "forge.event_tickets.seat_best_available": "Beste verfügbare",
938
+ "forge.event_tickets.seat_remove_aria": "{seat} entfernen",
939
+ "forge.event_tickets.seats_left_one": "{count} Platz frei",
940
+ "forge.event_tickets.seats_left_other": "{count} Plätze frei",
941
+ "forge.event_tickets.seats_title": "Deine Plätze",
865
942
  "forge.event_tickets.select_option": "Auswählen…",
866
943
  "forge.event_tickets.select_title": "Tickets wählen",
867
944
  "forge.event_tickets.subtotal": "Zwischensumme",
@@ -1003,8 +1080,16 @@
1003
1080
  "forge.film_watch.up_next": "Als Nächstes: {title}",
1004
1081
  "forge.film_watch.window_not_started": "Dein Zeitfenster startet jetzt.",
1005
1082
  "forge.forge_stripe_payment.authorize": "{amount} vormerken",
1083
+ "forge.forge_stripe_payment.cycle_month": "Monat",
1084
+ "forge.forge_stripe_payment.cycle_year": "Jahr",
1006
1085
  "forge.forge_stripe_payment.deferred_charged_on_approval": "Deine Karte wird nur belastet, wenn wir deine Anfrage freigeben.",
1007
1086
  "forge.forge_stripe_payment.deferred_hold_on_statement": "Bis dahin erscheint eine vorübergehende Vormerkung auf deiner Abrechnung.",
1087
+ "forge.forge_stripe_payment.setup_charged_on_approval": "Jetzt wird nichts abgebucht. Wir belasten diese Karte nur, wenn wir deine Bewerbung annehmen, und dann mit dem angezeigten Betrag ({amount}).",
1088
+ "forge.forge_stripe_payment.setup_failed": "Wir konnten deine Karte nicht speichern. Bitte versuche es erneut.",
1089
+ "forge.forge_stripe_payment.setup_incomplete": "Deine Karte wurde nicht gespeichert. Bitte versuche es erneut.",
1090
+ "forge.forge_stripe_payment.start_free_trial": "Kostenlos testen",
1091
+ "forge.forge_stripe_payment.submit_application": "Bewerbung absenden",
1092
+ "forge.forge_stripe_payment.trial_consent": "Heute wird nichts abgebucht. Ab dem {date} {amount} pro {cycle}. Wenn du vorher kündigst, wird dir nichts berechnet.",
1008
1093
  "forge.forgot_password_form.back_to_login": "Zurück zur Anmeldung",
1009
1094
  "forge.forgot_password_form.email_label": "E-Mail",
1010
1095
  "forge.forgot_password_form.email_placeholder": "E-Mail",
@@ -1082,8 +1167,27 @@
1082
1167
  "forge.login_form.verify_submit": "Bestätigen & anmelden",
1083
1168
  "forge.login_form.verify_title": "Bestätige deine E-Mail",
1084
1169
  "forge.login_form.verifying": "Wird geprüft…",
1170
+ "forge.membership_checkout.accept_invite": "Einladung annehmen",
1085
1171
  "forge.membership_checkout.amount_below_minimum": "Bitte {minimum} oder mehr eingeben.",
1086
1172
  "forge.membership_checkout.amount_not_positive": "Bitte einen Betrag größer als null eingeben.",
1173
+ "forge.membership_checkout.answer_required": "Bitte beantworte: {question}",
1174
+ "forge.membership_checkout.application_approved_body": "Deine Bewerbung für {tier_name} wurde angenommen. Deine Mitgliedschaft wird eingerichtet.",
1175
+ "forge.membership_checkout.application_approved_title": "Du wurdest angenommen",
1176
+ "forge.membership_checkout.application_card_title": "Deine Karte",
1177
+ "forge.membership_checkout.application_closed_body": "Deine Bewerbung für {tier_name} ist geschlossen. Es wurde nichts abgebucht.",
1178
+ "forge.membership_checkout.application_closed_title": "Bewerbung geschlossen",
1179
+ "forge.membership_checkout.application_declined_body": "Deine Bewerbung für {tier_name} wurde nicht angenommen. Es wurde nichts abgebucht.",
1180
+ "forge.membership_checkout.application_declined_title": "Bewerbung nicht angenommen",
1181
+ "forge.membership_checkout.application_received_body": "Danke für deine Bewerbung für {tier_name}. Wir schreiben dir eine E-Mail, sobald wir sie geprüft haben.",
1182
+ "forge.membership_checkout.application_received_paid_body": "Danke für deine Bewerbung für {tier_name}. Es wurde nichts abgebucht. Wenn wir deine Bewerbung annehmen, werden {amount} {cycle} von deiner Karte abgebucht und deine Mitgliedschaft beginnt.",
1183
+ "forge.membership_checkout.application_received_title": "Bewerbung eingegangen",
1184
+ "forge.membership_checkout.application_state_approved": "Du wurdest angenommen. Wir richten deine Mitgliedschaft gerade ein.",
1185
+ "forge.membership_checkout.application_state_complete": "Du wurdest angenommen, aber wir konnten deine Karte nicht belasten. Schließe deine Mitgliedschaft unten ab.",
1186
+ "forge.membership_checkout.application_state_declined": "Deine Bewerbung wurde nicht angenommen.",
1187
+ "forge.membership_checkout.application_state_pending": "Deine Bewerbung wird geprüft.",
1188
+ "forge.membership_checkout.application_tier_full_body": "Der letzte Platz wurde vergeben, während deine Karte gespeichert wurde, daher wurde deine Bewerbung geschlossen. Es wurde nichts abgebucht.",
1189
+ "forge.membership_checkout.application_tier_full_title": "{tier_name} ist voll",
1190
+ "forge.membership_checkout.apply": "Bewerben",
1087
1191
  "forge.membership_checkout.back": "Zurück",
1088
1192
  "forge.membership_checkout.billing_cycle_label": "Abrechnung",
1089
1193
  "forge.membership_checkout.billing_monthly": "Monatlich",
@@ -1093,10 +1197,18 @@
1093
1197
  "forge.membership_checkout.billing_yearly_price": "Jährlich ({amount})",
1094
1198
  "forge.membership_checkout.billing_yearly_pwyw": "Zahle was du willst ab {amount}/Jahr",
1095
1199
  "forge.membership_checkout.choose_title": "Mitgliedschaft wählen",
1200
+ "forge.membership_checkout.complete_membership": "Mitgliedschaft abschließen",
1096
1201
  "forge.membership_checkout.confirm_change": "Wechsel bestätigen",
1097
1202
  "forge.membership_checkout.current_plan": "Aktueller Tarif",
1098
1203
  "forge.membership_checkout.empty_title": "Keine Mitgliedschaften verfügbar",
1204
+ "forge.membership_checkout.field_required": "Dieses Feld ist erforderlich",
1099
1205
  "forge.membership_checkout.free": "Kostenlos",
1206
+ "forge.membership_checkout.go_to_account": "Zu deinem Konto",
1207
+ "forge.membership_checkout.invite_dead_body": "Sie ist vielleicht abgelaufen, wurde schon verwendet oder durch eine neuere Einladung ersetzt. Frag uns nach einer neuen.",
1208
+ "forge.membership_checkout.invite_dead_title": "Diese Einladung ist nicht mehr gültig",
1209
+ "forge.membership_checkout.invite_email_mismatch": "Du bist als {signed_in_email} angemeldet. Melde dich mit {email} an, um diese Einladung anzunehmen.",
1210
+ "forge.membership_checkout.invite_for_email": "Diese Einladung gilt für {email}.",
1211
+ "forge.membership_checkout.invite_title": "Du bist eingeladen, {tier_name} beizutreten",
1100
1212
  "forge.membership_checkout.more_benefits": "+{count} weitere",
1101
1213
  "forge.membership_checkout.no_tier_body": "Wähle eine Mitgliedschaft, um fortzufahren.",
1102
1214
  "forge.membership_checkout.on_this_plan": "Du hast diesen Tarif",
@@ -1108,15 +1220,28 @@
1108
1220
  "forge.membership_checkout.pwyw_charged_as": "Ihnen werden {amount} berechnet.",
1109
1221
  "forge.membership_checkout.pwyw_label": "Wie viel möchtest du zahlen?",
1110
1222
  "forge.membership_checkout.pwyw_min": "(mindestens {amount})",
1223
+ "forge.membership_checkout.questions_title": "Ein paar Fragen",
1224
+ "forge.membership_checkout.select_placeholder": "Auswählen…",
1111
1225
  "forge.membership_checkout.select_tier": "Diesen Tarif wählen",
1226
+ "forge.membership_checkout.start_free_trial": "Kostenlos testen",
1112
1227
  "forge.membership_checkout.submit": "Abonnieren",
1113
1228
  "forge.membership_checkout.submitting": "Wird verarbeitet…",
1114
1229
  "forge.membership_checkout.title": "{tier_name} beitreten",
1115
1230
  "forge.membership_checkout.total": "Gesamt",
1231
+ "forge.membership_checkout.trial_card_title": "Starte deine kostenlose Testphase",
1232
+ "forge.membership_checkout.trial_line": "{days} Tage kostenlos testen. Die erste Abbuchung erfolgt am {date}.",
1116
1233
  "forge.membership_checkout.view_memberships": "Mitgliedschaften ansehen",
1117
1234
  "forge.membership_tier_callout.benefits_label": "Vorteile:",
1235
+ "forge.membership_tier_callout.invite_for_email": "Diese Einladung gilt für {email}. Melde dich mit dieser Adresse an oder erstelle damit ein Konto.",
1118
1236
  "forge.membership_tier_callout.join_title": "{tier_name} beitreten",
1119
1237
  "forge.membership_tier_callout.more_benefits": "+{count} weitere Vorteile",
1238
+ "forge.membership_tiers.accept_invite": "Einladung annehmen",
1239
+ "forge.membership_tiers.application_approved": "Angenommen, wird eingerichtet",
1240
+ "forge.membership_tiers.application_declined": "Nicht angenommen",
1241
+ "forge.membership_tiers.application_payment_failed": "Angenommen: Mitgliedschaft abschließen",
1242
+ "forge.membership_tiers.application_pending": "Bewerbung wird geprüft",
1243
+ "forge.membership_tiers.apply": "Bewerben",
1244
+ "forge.membership_tiers.complete_membership": "Mitgliedschaft abschließen",
1120
1245
  "forge.membership_tiers.empty_title": "Keine Mitgliedschaften verfügbar.",
1121
1246
  "forge.membership_tiers.heading": "Mitgliedschaft",
1122
1247
  "forge.membership_tiers.price_free": "Kostenlos",
@@ -1125,6 +1250,11 @@
1125
1250
  "forge.membership_tiers.price_pwyw_yearly": "Zahle was du willst ab {amount}/Jahr",
1126
1251
  "forge.membership_tiers.price_yearly": "{amount}/Jahr",
1127
1252
  "forge.membership_tiers.select": "Wählen",
1253
+ "forge.membership_tiers.start_free_trial": "Kostenlos testen",
1254
+ "forge.membership_tiers.trial_badge": "{days} Tage kostenlos testen",
1255
+ "forge.membership_tiers.withdraw": "Bewerbung zurückziehen",
1256
+ "forge.membership_tiers.withdraw_error": "Wir konnten deine Bewerbung nicht zurückziehen. Bitte versuche es erneut.",
1257
+ "forge.membership_tiers.withdrawing": "Wird zurückgezogen…",
1128
1258
  "forge.offer_button.buy_now": "Jetzt kaufen",
1129
1259
  "forge.offer_button.confirm_email": "E-Mail bestätigen",
1130
1260
  "forge.offer_button.continue_to_payment": "Weiter zur Zahlung",
@@ -1154,6 +1284,14 @@
1154
1284
  "forge.payment_link_payment.preparing_payment": "Zahlung wird vorbereitet…",
1155
1285
  "forge.payment_link_payment.tax_added": "+ {tax_amount} MwSt.",
1156
1286
  "forge.payment_link_payment.title": "Zahlungsanfrage",
1287
+ "forge.phone_input.country_label": "Land",
1288
+ "forge.phone_input.country_placeholder": "Land auswaehlen",
1289
+ "forge.phone_input.error_invalid": "Das sieht nicht nach einer gueltigen Nummer fuer das gewaehlte Land aus",
1290
+ "forge.phone_input.error_no_country": "Bitte waehlen Sie zuerst Ihr Land aus",
1291
+ "forge.phone_input.error_required": "Bitte geben Sie eine Telefonnummer ein",
1292
+ "forge.phone_input.hint_no_country_code": "Die Landesvorwahl koennen Sie weglassen. Die Flagge setzt sie fuer Sie.",
1293
+ "forge.phone_input.placeholder_fallback": "Telefonnummer",
1294
+ "forge.phone_input.warning_landline": "Das sieht nach einem Festnetzanschluss aus und kann moeglicherweise keine SMS empfangen.",
1157
1295
  "forge.podcast_episode.next": "Weiter →",
1158
1296
  "forge.podcast_episode.not_found": "Folge nicht gefunden.",
1159
1297
  "forge.podcast_episode.pause": "Pause",
@@ -1284,6 +1422,21 @@
1284
1422
  "forge.review_form.title_label": "Titel",
1285
1423
  "forge.review_form.title_placeholder": "Fass es in ein paar Worten zusammen",
1286
1424
  "forge.review_form.update_submit": "Bewertung aktualisieren",
1425
+ "forge.seat_legend.aria_label": "Legende",
1426
+ "forge.seat_legend.left_one": "{count} frei",
1427
+ "forge.seat_legend.left_other": "{count} frei",
1428
+ "forge.seat_legend.selected": "Ausgewählt",
1429
+ "forge.seat_legend.sold_out": "Ausverkauft",
1430
+ "forge.seat_legend.unavailable": "Nicht verfügbar",
1431
+ "forge.seat_map_canvas.accessible": "barrierefreier Platz",
1432
+ "forge.seat_map_canvas.aria_label": "Saalplan",
1433
+ "forge.seat_map_canvas.fit": "Ganzen Plan anzeigen",
1434
+ "forge.seat_map_canvas.general_admission": "Freie Platzwahl",
1435
+ "forge.seat_map_canvas.status_available": "verfügbar",
1436
+ "forge.seat_map_canvas.status_selected": "ausgewählt",
1437
+ "forge.seat_map_canvas.status_unavailable": "nicht verfügbar",
1438
+ "forge.seat_map_canvas.zoom_in": "Vergrößern",
1439
+ "forge.seat_map_canvas.zoom_out": "Verkleinern",
1287
1440
  "forge.signup_form.accept_terms": "Ich akzeptiere die AGB und die Datenschutzerklärung",
1288
1441
  "forge.signup_form.code_label": "Bestätigungscode",
1289
1442
  "forge.signup_form.code_sent": "Wir haben einen 6-stelligen Code an {email} geschickt. Gib ihn ein, um dein Konto fertig einzurichten.",