@deallony/shared 1.2.82 → 1.2.83

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 (44) hide show
  1. package/dist/cjs/constants/events/EventCustomization.d.ts +18 -0
  2. package/dist/cjs/constants/events/EventCustomization.js +21 -1
  3. package/dist/cjs/constants/events/EventTemplate.js +3 -3
  4. package/dist/cjs/constants/events/EventType.d.ts +21 -90
  5. package/dist/cjs/constants/events/EventType.js +15 -8
  6. package/dist/cjs/constants/events/EventWeddingReligion.d.ts +10 -5
  7. package/dist/cjs/constants/events/EventWeddingReligion.js +12 -27
  8. package/dist/cjs/constants/routes/app.d.ts +14 -0
  9. package/dist/cjs/constants/routes/app.js +4 -0
  10. package/dist/cjs/schema/communication/ai-conversation.schema.d.ts +2 -0
  11. package/dist/cjs/schema/events/Event.schema.d.ts +38 -0
  12. package/dist/cjs/schema/events/Event.schema.js +27 -0
  13. package/dist/cjs/types/ad/Ad.d.ts +2 -0
  14. package/dist/cjs/types/communication/Notification.d.ts +4 -0
  15. package/dist/cjs/types/communication/Notification.js +6 -0
  16. package/dist/cjs/types/events/Event.d.ts +4 -0
  17. package/dist/cjs/types/events/EventCustomization.d.ts +11 -0
  18. package/dist/cjs/types/events/EventDay.d.ts +89 -0
  19. package/dist/cjs/types/events/EventDay.js +2 -0
  20. package/dist/cjs/types/events/EventInvited.d.ts +25 -0
  21. package/dist/cjs/types/events/EventInvited.js +2 -0
  22. package/dist/cjs/types/events/EventRsvp.d.ts +12 -1
  23. package/dist/cjs/types/events/index.d.ts +2 -0
  24. package/dist/cjs/types/events/index.js +2 -0
  25. package/dist/cjs/types/index.d.ts +2 -0
  26. package/dist/cjs/types/index.js +4 -2
  27. package/dist/cjs/utils/adSeoTitle.d.ts +35 -0
  28. package/dist/cjs/utils/adSeoTitle.js +26 -0
  29. package/dist/cjs/utils/index.d.ts +1 -0
  30. package/dist/cjs/utils/index.js +1 -0
  31. package/dist/esm/constants/events/EventCustomization.js +20 -0
  32. package/dist/esm/constants/events/EventTemplate.js +3 -3
  33. package/dist/esm/constants/events/EventType.js +14 -7
  34. package/dist/esm/constants/events/EventWeddingReligion.js +11 -26
  35. package/dist/esm/constants/routes/app.js +4 -0
  36. package/dist/esm/schema/events/Event.schema.js +28 -1
  37. package/dist/esm/types/communication/Notification.js +6 -0
  38. package/dist/esm/types/events/EventDay.js +1 -0
  39. package/dist/esm/types/events/EventInvited.js +1 -0
  40. package/dist/esm/types/events/index.js +2 -0
  41. package/dist/esm/types/index.js +2 -0
  42. package/dist/esm/utils/adSeoTitle.js +23 -0
  43. package/dist/esm/utils/index.js +1 -0
  44. package/package.json +1 -1
@@ -53,6 +53,8 @@ export declare const EventCustomizationSection: {
53
53
  readonly RSVP: "rsvp";
54
54
  readonly MUSIC: "music";
55
55
  readonly DRESS_CODE: "dress_code";
56
+ readonly ATTENDANCE: "attendance";
57
+ readonly VIDEO: "video";
56
58
  };
57
59
  export type EventCustomizationSectionKey = (typeof EventCustomizationSection)[keyof typeof EventCustomizationSection];
58
60
  export declare const EventCustomizationSectionOptions: {
@@ -62,7 +64,23 @@ export declare const EventCustomizationSectionOptions: {
62
64
  ar: string;
63
65
  };
64
66
  }[];
67
+ /** Invitation video (customization.cover_video): one per event, checked in the app before upload */
68
+ export declare const EVENT_COVER_VIDEO_MAX_SECONDS = 60;
69
+ export declare const EVENT_COVER_VIDEO_MAX_BYTES: number;
70
+ export declare const EVENT_COVER_VIDEO_TYPES: readonly ["video/mp4", "video/quicktime", "video/webm", "video/x-m4v"];
65
71
  export declare const EVENT_CUSTOMIZATION_TEXT_MAX = 160;
72
+ /** Children / food line on the invitation: defaults, owner text limit and ready phrases */
73
+ export declare const EVENT_ATTENDANCE_TEXT_MAX = 60;
74
+ export declare const EventAttendanceTexts: {
75
+ readonly children: {
76
+ readonly default: "جنة الأطفال منازلهم";
77
+ readonly suggestions: readonly ["جنة الأطفال منازلهم", "نعتذر عن اصطحاب الأطفال", "الحفل للكبار فقط", "نتمنى لأطفالكم ليلة هانئة في البيت"];
78
+ };
79
+ readonly food: {
80
+ readonly default: "عشاكم بيحلا معنا";
81
+ readonly suggestions: readonly ["عشاكم بيحلا معنا", "يسعدنا أن تشاركونا العشاء", "بوفيه مفتوح بعد الحفل", "ضيافة وعشاء"];
82
+ };
83
+ };
66
84
  /** How the invitation opens for a guest; no value keeps the template's own opening */
67
85
  export declare const EventCustomizationOpening: {
68
86
  readonly NONE: "none";
@@ -4,7 +4,7 @@
4
4
  * Every field is optional: an empty value keeps the chosen template's own look.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.findEventCustomizationTrack = exports.eventCustomizationTracksFor = exports.findEventCustomizationFont = exports.findEventCustomizationPalette = exports.EventCustomizationOpeningValues = exports.EventCustomizationSectionValues = exports.EventCustomizationTrackValues = exports.EventCustomizationFontValues = exports.EventCustomizationPaletteValues = exports.EventCustomizationOpeningOptions = exports.EventCustomizationOpening = exports.EVENT_CUSTOMIZATION_TEXT_MAX = exports.EventCustomizationSectionOptions = exports.EventCustomizationSection = exports.EventCustomizationTracks = exports.EventCustomizationFonts = exports.EventCustomizationPalettes = void 0;
7
+ exports.findEventCustomizationTrack = exports.eventCustomizationTracksFor = exports.findEventCustomizationFont = exports.findEventCustomizationPalette = exports.EventCustomizationOpeningValues = exports.EventCustomizationSectionValues = exports.EventCustomizationTrackValues = exports.EventCustomizationFontValues = exports.EventCustomizationPaletteValues = exports.EventCustomizationOpeningOptions = exports.EventCustomizationOpening = exports.EventAttendanceTexts = exports.EVENT_ATTENDANCE_TEXT_MAX = exports.EVENT_CUSTOMIZATION_TEXT_MAX = exports.EVENT_COVER_VIDEO_TYPES = exports.EVENT_COVER_VIDEO_MAX_BYTES = exports.EVENT_COVER_VIDEO_MAX_SECONDS = exports.EventCustomizationSectionOptions = exports.EventCustomizationSection = exports.EventCustomizationTracks = exports.EventCustomizationFonts = exports.EventCustomizationPalettes = void 0;
8
8
  exports.EventCustomizationPalettes = [
9
9
  { value: "night", name: { en: "Night", ar: "ليلي" }, background: "#0f0c18", surface: "#1b1628", text: "#efe8f6", accent: "#d6b36a", is_dark: true },
10
10
  { value: "ivory", name: { en: "Ivory", ar: "عاجي" }, background: "#fbf6ee", surface: "#ffffff", text: "#2a2118", accent: "#9c6b3c", is_dark: false },
@@ -32,6 +32,8 @@ exports.EventCustomizationSection = {
32
32
  RSVP: "rsvp",
33
33
  MUSIC: "music",
34
34
  DRESS_CODE: "dress_code",
35
+ ATTENDANCE: "attendance",
36
+ VIDEO: "video",
35
37
  };
36
38
  exports.EventCustomizationSectionOptions = [
37
39
  { value: "countdown", name: { en: "Countdown", ar: "العد التنازلي" } },
@@ -41,8 +43,26 @@ exports.EventCustomizationSectionOptions = [
41
43
  { value: "rsvp", name: { en: "RSVP", ar: "تأكيد الحضور" } },
42
44
  { value: "music", name: { en: "Music", ar: "الموسيقى" } },
43
45
  { value: "dress_code", name: { en: "Dress code", ar: "اللباس المطلوب" } },
46
+ { value: "attendance", name: { en: "Attendance details", ar: "تفاصيل الحضور" } },
47
+ { value: "video", name: { en: "Video", ar: "الفيديو" } },
44
48
  ];
49
+ /** Invitation video (customization.cover_video): one per event, checked in the app before upload */
50
+ exports.EVENT_COVER_VIDEO_MAX_SECONDS = 60;
51
+ exports.EVENT_COVER_VIDEO_MAX_BYTES = 100 * 1024 * 1024;
52
+ exports.EVENT_COVER_VIDEO_TYPES = ["video/mp4", "video/quicktime", "video/webm", "video/x-m4v"];
45
53
  exports.EVENT_CUSTOMIZATION_TEXT_MAX = 160;
54
+ /** Children / food line on the invitation: defaults, owner text limit and ready phrases */
55
+ exports.EVENT_ATTENDANCE_TEXT_MAX = 60;
56
+ exports.EventAttendanceTexts = {
57
+ children: {
58
+ default: "جنة الأطفال منازلهم",
59
+ suggestions: ["جنة الأطفال منازلهم", "نعتذر عن اصطحاب الأطفال", "الحفل للكبار فقط", "نتمنى لأطفالكم ليلة هانئة في البيت"],
60
+ },
61
+ food: {
62
+ default: "عشاكم بيحلا معنا",
63
+ suggestions: ["عشاكم بيحلا معنا", "يسعدنا أن تشاركونا العشاء", "بوفيه مفتوح بعد الحفل", "ضيافة وعشاء"],
64
+ },
65
+ };
46
66
  /** How the invitation opens for a guest; no value keeps the template's own opening */
47
67
  exports.EventCustomizationOpening = {
48
68
  NONE: "none",
@@ -25,9 +25,9 @@ exports.EventTemplate = {
25
25
  ENGAGEMENT_ROSE_ARCH: { value: 'engagement-rose-arch', name: { en: 'Rose arch', ar: 'قوس الورد' }, event_types: ['engagement'], photos: 1 },
26
26
  ENGAGEMENT_FULL_MOMENT: { value: 'engagement-full-moment', name: { en: 'Full moment', ar: 'لحظة كاملة' }, event_types: ['engagement'], photos: 1 },
27
27
  ENGAGEMENT_SEALED_LETTER: { value: 'engagement-sealed-letter', name: { en: 'Sealed letter', ar: 'رسالة مختومة' }, event_types: ['engagement'], photos: 1 },
28
- MARRIAGE_CONTRACT: { value: 'marriage-contract', name: { en: 'The contract', ar: 'وثيقة العقد' }, event_types: ['marriage'], photos: 1 },
29
- MARRIAGE_STAR_MEDALLION: { value: 'marriage-star-medallion', name: { en: 'Star medallion', ar: 'ميدالية النجمة' }, event_types: ['marriage'], photos: 1 },
30
- MARRIAGE_MASHRABIYA: { value: 'marriage-mashrabiya', name: { en: 'Mashrabiya', ar: 'نافذة المشربية' }, event_types: ['marriage'], photos: 1 },
28
+ MARRIAGE_CONTRACT: { value: 'marriage-contract', name: { en: 'The contract', ar: 'وثيقة العقد' }, event_types: ['wedding', 'marriage'], photos: 1 },
29
+ MARRIAGE_STAR_MEDALLION: { value: 'marriage-star-medallion', name: { en: 'Star medallion', ar: 'ميدالية النجمة' }, event_types: ['wedding', 'marriage'], photos: 1 },
30
+ MARRIAGE_MASHRABIYA: { value: 'marriage-mashrabiya', name: { en: 'Mashrabiya', ar: 'نافذة المشربية' }, event_types: ['wedding', 'marriage'], photos: 1 },
31
31
  PROPOSAL_ONE_QUESTION: { value: 'proposal-one-question', name: { en: 'One question', ar: 'سؤال واحد' }, event_types: ['proposal'], photos: 1 },
32
32
  PROPOSAL_WITNESS_TICKET: { value: 'proposal-witness-ticket', name: { en: 'Witness ticket', ar: 'تذكرة شاهد' }, event_types: ['proposal'], photos: 1 },
33
33
  PROPOSAL_CANDLELIGHT: { value: 'proposal-candlelight', name: { en: 'Candlelight', ar: 'ضوء الشموع' }, event_types: ['proposal'], photos: 1 },
@@ -53,6 +53,7 @@ export declare const EventTypes: {
53
53
  readonly group: "celebrations";
54
54
  readonly details: "wedding";
55
55
  };
56
+ /** Folded into the wedding (2026-11): no longer offered, kept so saved events still open */
56
57
  readonly MARRIAGE: {
57
58
  readonly value: "marriage";
58
59
  readonly name: {
@@ -61,6 +62,7 @@ export declare const EventTypes: {
61
62
  };
62
63
  readonly group: "celebrations";
63
64
  readonly details: "wedding";
65
+ readonly hidden: true;
64
66
  };
65
67
  readonly PROPOSAL: {
66
68
  readonly value: "proposal";
@@ -174,106 +176,35 @@ export declare const EventTypes: {
174
176
  export type EventTypeValue = (typeof EventTypes)[keyof typeof EventTypes]['value'];
175
177
  export declare const EventTypeValues: [EventTypeValue, ...EventTypeValue[]];
176
178
  export declare const EventTypeOptions: {
177
- value: "general" | "wedding" | "engagement" | "marriage" | "proposal" | "valentine" | "birthday" | "bachelor" | "newborn" | "gender_reveal" | "circumcision" | "graduation" | "hajj" | "mothers_day" | "opening";
179
+ value: EventTypeValue;
178
180
  name: {
179
- readonly en: "Wedding";
180
- readonly ar: "زفاف";
181
- } | {
182
- readonly en: "Engagement";
183
- readonly ar: "حفلة خطبة";
184
- } | {
185
- readonly en: "Marriage contract";
186
- readonly ar: "حفل زواج";
187
- } | {
188
- readonly en: "Proposal";
189
- readonly ar: "حفل Proposal";
190
- } | {
191
- readonly en: "Bachelor party";
192
- readonly ar: "حفل توديع عزوبية";
193
- } | {
194
- readonly en: "Birthday";
195
- readonly ar: "عيد ميلاد";
196
- } | {
197
- readonly en: "New baby";
198
- readonly ar: "مباركة مولود";
199
- } | {
200
- readonly en: "Gender reveal";
201
- readonly ar: "احتفال جنس المولود";
202
- } | {
203
- readonly en: "Circumcision";
204
- readonly ar: "حفل طهور";
205
- } | {
206
- readonly en: "Graduation";
207
- readonly ar: "حفل تخرج";
208
- } | {
209
- readonly en: "Hajj return";
210
- readonly ar: "حفلة حج";
211
- } | {
212
- readonly en: "Mother's Day";
213
- readonly ar: "حفل عيد الأم";
214
- } | {
215
- readonly en: "Valentine's Day";
216
- readonly ar: "حفل لعيد الحب";
217
- } | {
218
- readonly en: "Business opening";
219
- readonly ar: "افتتاح عمل تجاري";
220
- } | {
221
- readonly en: "General party";
222
- readonly ar: "حفلة عامة";
181
+ en: string;
182
+ ar: string;
223
183
  };
224
184
  group: EventTypeGroup;
225
185
  details: "wedding" | "occasion";
186
+ hidden: boolean;
187
+ }[];
188
+ /** Types offered when creating an invitation (hidden ones are left out) */
189
+ export declare const EventTypeOfferedOptions: {
190
+ value: EventTypeValue;
191
+ name: {
192
+ en: string;
193
+ ar: string;
194
+ };
195
+ group: EventTypeGroup;
196
+ details: "wedding" | "occasion";
197
+ hidden: boolean;
226
198
  }[];
227
199
  export declare const findEventType: (value: string | null | undefined) => {
228
- value: "general" | "wedding" | "engagement" | "marriage" | "proposal" | "valentine" | "birthday" | "bachelor" | "newborn" | "gender_reveal" | "circumcision" | "graduation" | "hajj" | "mothers_day" | "opening";
200
+ value: EventTypeValue;
229
201
  name: {
230
- readonly en: "Wedding";
231
- readonly ar: "زفاف";
232
- } | {
233
- readonly en: "Engagement";
234
- readonly ar: "حفلة خطبة";
235
- } | {
236
- readonly en: "Marriage contract";
237
- readonly ar: "حفل زواج";
238
- } | {
239
- readonly en: "Proposal";
240
- readonly ar: "حفل Proposal";
241
- } | {
242
- readonly en: "Bachelor party";
243
- readonly ar: "حفل توديع عزوبية";
244
- } | {
245
- readonly en: "Birthday";
246
- readonly ar: "عيد ميلاد";
247
- } | {
248
- readonly en: "New baby";
249
- readonly ar: "مباركة مولود";
250
- } | {
251
- readonly en: "Gender reveal";
252
- readonly ar: "احتفال جنس المولود";
253
- } | {
254
- readonly en: "Circumcision";
255
- readonly ar: "حفل طهور";
256
- } | {
257
- readonly en: "Graduation";
258
- readonly ar: "حفل تخرج";
259
- } | {
260
- readonly en: "Hajj return";
261
- readonly ar: "حفلة حج";
262
- } | {
263
- readonly en: "Mother's Day";
264
- readonly ar: "حفل عيد الأم";
265
- } | {
266
- readonly en: "Valentine's Day";
267
- readonly ar: "حفل لعيد الحب";
268
- } | {
269
- readonly en: "Business opening";
270
- readonly ar: "افتتاح عمل تجاري";
271
- } | {
272
- readonly en: "General party";
273
- readonly ar: "حفلة عامة";
202
+ en: string;
203
+ ar: string;
274
204
  };
275
205
  group: EventTypeGroup;
276
206
  details: "wedding" | "occasion";
207
+ hidden: boolean;
277
208
  } | null;
278
209
  /** Types whose details are a couple stored in event.wedding (events without a type are weddings) */
279
210
  export declare const isCoupleEventType: (value: string | null | undefined) => boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isOccasionEventType = exports.isCoupleEventType = exports.findEventType = exports.EventTypeOptions = exports.EventTypeValues = exports.EventTypes = exports.EventTypeGroups = void 0;
3
+ exports.isOccasionEventType = exports.isCoupleEventType = exports.findEventType = exports.EventTypeOfferedOptions = exports.EventTypeOptions = exports.EventTypeValues = exports.EventTypes = exports.EventTypeGroups = void 0;
4
4
  /** Groups on the «ما نوع المناسبة؟» step */
5
5
  exports.EventTypeGroups = {
6
6
  CELEBRATIONS: { value: 'celebrations', name: { en: 'Weddings & engagements', ar: 'أفراح' } },
@@ -15,7 +15,8 @@ exports.EventTypeGroups = {
15
15
  exports.EventTypes = {
16
16
  WEDDING: { value: 'wedding', name: { en: 'Wedding', ar: 'زفاف' }, group: 'celebrations', details: 'wedding' },
17
17
  ENGAGEMENT: { value: 'engagement', name: { en: 'Engagement', ar: 'حفلة خطبة' }, group: 'celebrations', details: 'wedding' },
18
- MARRIAGE: { value: 'marriage', name: { en: 'Marriage contract', ar: 'حفل زواج' }, group: 'celebrations', details: 'wedding' },
18
+ /** Folded into the wedding (2026-11): no longer offered, kept so saved events still open */
19
+ MARRIAGE: { value: 'marriage', name: { en: 'Marriage contract', ar: 'حفل زواج' }, group: 'celebrations', details: 'wedding', hidden: true },
19
20
  PROPOSAL: { value: 'proposal', name: { en: 'Proposal', ar: 'حفل Proposal' }, group: 'celebrations', details: 'occasion' },
20
21
  BACHELOR: { value: 'bachelor', name: { en: 'Bachelor party', ar: 'حفل توديع عزوبية' }, group: 'celebrations', details: 'occasion' },
21
22
  BIRTHDAY: { value: 'birthday', name: { en: 'Birthday', ar: 'عيد ميلاد' }, group: 'family', details: 'occasion' },
@@ -30,12 +31,18 @@ exports.EventTypes = {
30
31
  GENERAL: { value: 'general', name: { en: 'General party', ar: 'حفلة عامة' }, group: 'business', details: 'occasion' },
31
32
  };
32
33
  exports.EventTypeValues = Object.values(exports.EventTypes).map((t) => t.value);
33
- exports.EventTypeOptions = Object.values(exports.EventTypes).map((type) => ({
34
- value: type.value,
35
- name: type.name,
36
- group: type.group,
37
- details: type.details,
38
- }));
34
+ exports.EventTypeOptions = Object.values(exports.EventTypes).map((type) => {
35
+ var _a;
36
+ return ({
37
+ value: type.value,
38
+ name: type.name,
39
+ group: type.group,
40
+ details: type.details,
41
+ hidden: (_a = type.hidden) !== null && _a !== void 0 ? _a : false,
42
+ });
43
+ });
44
+ /** Types offered when creating an invitation (hidden ones are left out) */
45
+ exports.EventTypeOfferedOptions = exports.EventTypeOptions.filter((t) => !t.hidden);
39
46
  const findEventType = (value) => { var _a; return (_a = exports.EventTypeOptions.find((t) => t.value === (value || 'wedding'))) !== null && _a !== void 0 ? _a : null; };
40
47
  exports.findEventType = findEventType;
41
48
  /** Types whose details are a couple stored in event.wedding (events without a type are weddings) */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Invitation style of a wedding (also used by engagement and marriage, which share event.wedding).
3
- * muslim = the Islamic opening, Quran verse and dua (the original templates).
3
+ * muslim = the Islamic opening (bismillah) and dua. No Quran excerpt (removed 2026-11-08 by owner request).
4
4
  * general = social congratulations only: names, place, date, program. Suits Christian weddings.
5
5
  *
6
6
  * Content rule (owner decision 2026-11-04): no Christian religious symbols, creeds, Bible verses or rites
@@ -44,6 +44,11 @@ export declare const EventWeddingVerses: EventWeddingVerse[];
44
44
  /** General style only: the owner writes the couple's words by hand (event.wedding.custom_verse) */
45
45
  export declare const EVENT_WEDDING_CUSTOM_VERSE = "custom";
46
46
  export declare const EVENT_WEDDING_CUSTOM_VERSE_MAX = 160;
47
+ /**
48
+ * Quran excerpt keys from before 2026-11-08. Still accepted so older apps can save,
49
+ * but the backend drops them and no invitation shows them any more.
50
+ */
51
+ export declare const EVENT_WEDDING_LEGACY_VERSE_KEYS: readonly ["rum-21", "furqan-74", "rum-mawadda"];
47
52
  export declare const EventWeddingVerseValues: [string, ...string[]];
48
53
  /** The hand-written text applies only to the general style */
49
54
  export declare const eventWeddingCustomVerse: (verseKey: string | null | undefined, religion: string | null | undefined, customVerse: string | null | undefined) => string | null;
@@ -51,8 +56,8 @@ export declare const eventWeddingCustomVerse: (verseKey: string | null | undefin
51
56
  export type EventWeddingReligionTexts = {
52
57
  /** Line above everything (bismillah); null = nothing */
53
58
  opening: string | null;
54
- /** Heading over the verse / phrase */
55
- verse_title: string;
59
+ /** Heading over the opening phrase; null = the style shows no phrase (muslim) */
60
+ verse_title: string | null;
56
61
  /** Closing wish for the couple */
57
62
  blessing: string;
58
63
  /** Title of the short wish card */
@@ -67,6 +72,6 @@ export declare const EventWeddingReligionTextsMap: Record<EventWeddingReligion,
67
72
  export declare const EVENT_WEDDING_CEREMONY_TIMELINE_TITLE = "\u0645\u0631\u0627\u0633\u0645 \u0627\u0644\u0632\u0648\u0627\u062C";
68
73
  export declare const normalizeEventWeddingReligion: (value: string | null | undefined) => EventWeddingReligion;
69
74
  export declare const eventWeddingVersesFor: (religion: string | null | undefined) => EventWeddingVerse[];
70
- /** The saved verse when it belongs to the style, otherwise the style's first one */
71
- export declare const findEventWeddingVerse: (value: string | null | undefined, religion: string | null | undefined) => EventWeddingVerse;
75
+ /** The saved phrase when it belongs to the style, otherwise the style's first one (undefined for muslim) */
76
+ export declare const findEventWeddingVerse: (value: string | null | undefined, religion: string | null | undefined) => EventWeddingVerse | undefined;
72
77
  export declare const eventWeddingReligionTexts: (religion: string | null | undefined) => EventWeddingReligionTexts;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.eventWeddingReligionTexts = exports.findEventWeddingVerse = exports.eventWeddingVersesFor = exports.normalizeEventWeddingReligion = exports.EVENT_WEDDING_CEREMONY_TIMELINE_TITLE = exports.EventWeddingReligionTextsMap = exports.eventWeddingCustomVerse = exports.EventWeddingVerseValues = exports.EVENT_WEDDING_CUSTOM_VERSE_MAX = exports.EVENT_WEDDING_CUSTOM_VERSE = exports.EventWeddingVerses = exports.EventWeddingReligionOptions = exports.EventWeddingReligionNames = exports.DEFAULT_EVENT_WEDDING_RELIGION = exports.EventWeddingReligion = exports.EventWeddingReligionValues = void 0;
3
+ exports.eventWeddingReligionTexts = exports.findEventWeddingVerse = exports.eventWeddingVersesFor = exports.normalizeEventWeddingReligion = exports.EVENT_WEDDING_CEREMONY_TIMELINE_TITLE = exports.EventWeddingReligionTextsMap = exports.eventWeddingCustomVerse = exports.EventWeddingVerseValues = exports.EVENT_WEDDING_LEGACY_VERSE_KEYS = exports.EVENT_WEDDING_CUSTOM_VERSE_MAX = exports.EVENT_WEDDING_CUSTOM_VERSE = exports.EventWeddingVerses = exports.EventWeddingReligionOptions = exports.EventWeddingReligionNames = exports.DEFAULT_EVENT_WEDDING_RELIGION = exports.EventWeddingReligion = exports.EventWeddingReligionValues = void 0;
4
4
  /**
5
5
  * Invitation style of a wedding (also used by engagement and marriage, which share event.wedding).
6
- * muslim = the Islamic opening, Quran verse and dua (the original templates).
6
+ * muslim = the Islamic opening (bismillah) and dua. No Quran excerpt (removed 2026-11-08 by owner request).
7
7
  * general = social congratulations only: names, place, date, program. Suits Christian weddings.
8
8
  *
9
9
  * Content rule (owner decision 2026-11-04): no Christian religious symbols, creeds, Bible verses or rites
@@ -19,8 +19,8 @@ exports.EventWeddingReligionNames = {
19
19
  muslim: {
20
20
  en: "Islamic",
21
21
  ar: "إسلامي",
22
- hint_en: "Bismillah, a Quran verse and a dua.",
23
- hint_ar: "البسملة وآية قرآنية ودعاء للعروسين.",
22
+ hint_en: "Bismillah and a dua for the couple.",
23
+ hint_ar: "البسملة ودعاء للعروسين.",
24
24
  },
25
25
  general: {
26
26
  en: "General",
@@ -34,27 +34,6 @@ exports.EventWeddingReligionOptions = exports.EventWeddingReligionValues.map((va
34
34
  name: exports.EventWeddingReligionNames[value],
35
35
  }));
36
36
  exports.EventWeddingVerses = [
37
- {
38
- value: "rum-21",
39
- religion: "muslim",
40
- text: "﴿ وَمِنْ آيَاتِهِ أَنْ خَلَقَ لَكُمْ مِنْ أَنْفُسِكُمْ أَزْوَاجًا لِتَسْكُنُوا إِلَيْهَا وَجَعَلَ بَيْنَكُمْ مَوَدَّةً وَرَحْمَةً ﴾",
41
- reference: "سورة الروم - آية ٢١",
42
- label: { en: "Ar-Rum 21", ar: "سورة الروم - آية ٢١" },
43
- },
44
- {
45
- value: "furqan-74",
46
- religion: "muslim",
47
- text: "﴿ رَبَّنَا هَبْ لَنَا مِنْ أَزْوَاجِنَا وَذُرِّيَّاتِنَا قُرَّةَ أَعْيُنٍ وَاجْعَلْنَا لِلْمُتَّقِينَ إِمَامًا ﴾",
48
- reference: "سورة الفرقان - آية ٧٤",
49
- label: { en: "Al-Furqan 74", ar: "سورة الفرقان - آية ٧٤" },
50
- },
51
- {
52
- value: "rum-mawadda",
53
- religion: "muslim",
54
- text: "﴿ وَجَعَلَ بَيْنَكُم مَّوَدَّةً وَرَحْمَةً ﴾",
55
- reference: "سورة الروم",
56
- label: { en: "Mawadda wa rahma", ar: "وجعل بينكم مودة ورحمة" },
57
- },
58
37
  {
59
38
  value: "together",
60
39
  religion: "general",
@@ -80,9 +59,15 @@ exports.EventWeddingVerses = [
80
59
  /** General style only: the owner writes the couple's words by hand (event.wedding.custom_verse) */
81
60
  exports.EVENT_WEDDING_CUSTOM_VERSE = "custom";
82
61
  exports.EVENT_WEDDING_CUSTOM_VERSE_MAX = 160;
62
+ /**
63
+ * Quran excerpt keys from before 2026-11-08. Still accepted so older apps can save,
64
+ * but the backend drops them and no invitation shows them any more.
65
+ */
66
+ exports.EVENT_WEDDING_LEGACY_VERSE_KEYS = ["rum-21", "furqan-74", "rum-mawadda"];
83
67
  exports.EventWeddingVerseValues = [
84
68
  exports.EVENT_WEDDING_CUSTOM_VERSE,
85
69
  ...exports.EventWeddingVerses.map((v) => v.value),
70
+ ...exports.EVENT_WEDDING_LEGACY_VERSE_KEYS,
86
71
  ];
87
72
  /** The hand-written text applies only to the general style */
88
73
  const eventWeddingCustomVerse = (verseKey, religion, customVerse) => verseKey === exports.EVENT_WEDDING_CUSTOM_VERSE && (0, exports.normalizeEventWeddingReligion)(religion) === "general"
@@ -92,7 +77,7 @@ exports.eventWeddingCustomVerse = eventWeddingCustomVerse;
92
77
  exports.EventWeddingReligionTextsMap = {
93
78
  muslim: {
94
79
  opening: "بسم الله الرحمن الرحيم",
95
- verse_title: "مقتطف قرآني مبارك",
80
+ verse_title: null,
96
81
  blessing: "اللهم بارك لهما وبارك عليهما واجمع بينهما في خير، واجعل أيامهما مودة ورحمة وسكينة.",
97
82
  blessing_title: "دعاء",
98
83
  symbol: "۞",
@@ -115,7 +100,7 @@ const normalizeEventWeddingReligion = (value) => exports.EventWeddingReligionVal
115
100
  exports.normalizeEventWeddingReligion = normalizeEventWeddingReligion;
116
101
  const eventWeddingVersesFor = (religion) => exports.EventWeddingVerses.filter((v) => v.religion === (0, exports.normalizeEventWeddingReligion)(religion));
117
102
  exports.eventWeddingVersesFor = eventWeddingVersesFor;
118
- /** The saved verse when it belongs to the style, otherwise the style's first one */
103
+ /** The saved phrase when it belongs to the style, otherwise the style's first one (undefined for muslim) */
119
104
  const findEventWeddingVerse = (value, religion) => {
120
105
  var _a;
121
106
  const list = (0, exports.eventWeddingVersesFor)(religion);
@@ -485,6 +485,20 @@ export declare const APP_ROUTES: {
485
485
  readonly mine: () => {
486
486
  pathname: string;
487
487
  };
488
+ /** «دعواتي»: the events the user was invited to, as a chip of «مناسباتي» */
489
+ readonly invitations: () => {
490
+ pathname: string;
491
+ params: {
492
+ tab: string;
493
+ };
494
+ };
495
+ /** One event the user was invited to, as a guest sees it */
496
+ readonly invited: (eventId: number | string) => {
497
+ pathname: string;
498
+ params: {
499
+ id: string | number;
500
+ };
501
+ };
488
502
  /** Upcoming public events (optionally of one venue) */
489
503
  readonly upcoming: (venueId?: number | string) => {
490
504
  pathname: string;
@@ -206,6 +206,10 @@ exports.APP_ROUTES = {
206
206
  newOfType: (eventType) => ({ pathname: "/event/new", params: { personal: "1", event_type: eventType } }),
207
207
  start: () => ({ pathname: "/event/start" }),
208
208
  mine: () => ({ pathname: "/event/mine" }),
209
+ /** «دعواتي»: the events the user was invited to, as a chip of «مناسباتي» */
210
+ invitations: () => ({ pathname: "/event/mine", params: { tab: "invited" } }),
211
+ /** One event the user was invited to, as a guest sees it */
212
+ invited: (eventId) => ({ pathname: "/event/invited/[id]", params: { id: eventId } }),
209
213
  /** Upcoming public events (optionally of one venue) */
210
214
  upcoming: (venueId) => venueId ? { pathname: "/event/upcoming", params: { venue_id: venueId } } : { pathname: "/event/upcoming" },
211
215
  publish: (id) => ({ pathname: "/event/publish/[id]", params: { id } }),
@@ -140,6 +140,8 @@ export type AiConversationListItem = {
140
140
  reply_after?: string | null;
141
141
  /** The opening waits for the sending hours: it goes out at this time */
142
142
  send_after?: string | null;
143
+ /** Support ticket this conversation was started from (support chats), so the dashboard can open it */
144
+ support_ticket_id?: number | null;
143
145
  /** Filled in by the marketplace from the potential user record. */
144
146
  potential_user?: {
145
147
  id: number;
@@ -14,9 +14,13 @@ export declare const eventCustomizationSchema: z.ZodObject<{
14
14
  rsvp: "rsvp";
15
15
  music: "music";
16
16
  dress_code: "dress_code";
17
+ attendance: "attendance";
18
+ video: "video";
17
19
  }> & z.core.$partial, z.ZodBoolean>>>;
18
20
  welcome_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
19
21
  rsvp_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
22
+ children_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
23
+ food_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
20
24
  music: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
21
25
  [x: string]: string;
22
26
  }>>>;
@@ -27,6 +31,8 @@ export declare const eventCustomizationSchema: z.ZodObject<{
27
31
  card: "card";
28
32
  }>>>;
29
33
  auto_scroll: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
34
+ cover_video: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
35
+ cover_video_muted: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
30
36
  }, z.core.$strip>;
31
37
  export declare const eventDressCodeSchema: z.ZodObject<{
32
38
  style: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -130,9 +136,13 @@ export declare const eventBaseSchema: z.ZodObject<{
130
136
  rsvp: "rsvp";
131
137
  music: "music";
132
138
  dress_code: "dress_code";
139
+ attendance: "attendance";
140
+ video: "video";
133
141
  }> & z.core.$partial, z.ZodBoolean>>>;
134
142
  welcome_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
135
143
  rsvp_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
144
+ children_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
145
+ food_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
136
146
  music: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
137
147
  [x: string]: string;
138
148
  }>>>;
@@ -143,6 +153,8 @@ export declare const eventBaseSchema: z.ZodObject<{
143
153
  card: "card";
144
154
  }>>>;
145
155
  auto_scroll: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
156
+ cover_video: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
157
+ cover_video_muted: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
146
158
  }, z.core.$strip>>>;
147
159
  dress_code: z.ZodOptional<z.ZodNullable<z.ZodObject<{
148
160
  style: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -165,6 +177,8 @@ export declare const eventBaseSchema: z.ZodObject<{
165
177
  }>>>;
166
178
  note: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
167
179
  }, z.core.$strip>>>;
180
+ children_allowed: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
181
+ food_included: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
168
182
  visibility: z.ZodOptional<z.ZodEnum<{
169
183
  private: "private";
170
184
  public: "public";
@@ -258,9 +272,13 @@ export declare const createEventSchema: z.ZodObject<{
258
272
  rsvp: "rsvp";
259
273
  music: "music";
260
274
  dress_code: "dress_code";
275
+ attendance: "attendance";
276
+ video: "video";
261
277
  }> & z.core.$partial, z.ZodBoolean>>>;
262
278
  welcome_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
263
279
  rsvp_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
280
+ children_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
281
+ food_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
264
282
  music: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
265
283
  [x: string]: string;
266
284
  }>>>;
@@ -271,6 +289,8 @@ export declare const createEventSchema: z.ZodObject<{
271
289
  card: "card";
272
290
  }>>>;
273
291
  auto_scroll: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
292
+ cover_video: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
293
+ cover_video_muted: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
274
294
  }, z.core.$strip>>>;
275
295
  dress_code: z.ZodOptional<z.ZodNullable<z.ZodObject<{
276
296
  style: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -293,6 +313,8 @@ export declare const createEventSchema: z.ZodObject<{
293
313
  }>>>;
294
314
  note: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
295
315
  }, z.core.$strip>>>;
316
+ children_allowed: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
317
+ food_included: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
296
318
  visibility: z.ZodOptional<z.ZodEnum<{
297
319
  private: "private";
298
320
  public: "public";
@@ -386,9 +408,13 @@ export declare const updateEventSchema: z.ZodObject<{
386
408
  rsvp: "rsvp";
387
409
  music: "music";
388
410
  dress_code: "dress_code";
411
+ attendance: "attendance";
412
+ video: "video";
389
413
  }> & z.core.$partial, z.ZodBoolean>>>;
390
414
  welcome_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
391
415
  rsvp_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
416
+ children_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
417
+ food_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
392
418
  music: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
393
419
  [x: string]: string;
394
420
  }>>>;
@@ -399,6 +425,8 @@ export declare const updateEventSchema: z.ZodObject<{
399
425
  card: "card";
400
426
  }>>>;
401
427
  auto_scroll: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
428
+ cover_video: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
429
+ cover_video_muted: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
402
430
  }, z.core.$strip>>>;
403
431
  dress_code: z.ZodOptional<z.ZodNullable<z.ZodObject<{
404
432
  style: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -421,6 +449,8 @@ export declare const updateEventSchema: z.ZodObject<{
421
449
  }>>>;
422
450
  note: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
423
451
  }, z.core.$strip>>>;
452
+ children_allowed: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
453
+ food_included: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
424
454
  visibility: z.ZodOptional<z.ZodEnum<{
425
455
  private: "private";
426
456
  public: "public";
@@ -515,9 +545,13 @@ export declare const saveEventSchema: z.ZodObject<{
515
545
  rsvp: "rsvp";
516
546
  music: "music";
517
547
  dress_code: "dress_code";
548
+ attendance: "attendance";
549
+ video: "video";
518
550
  }> & z.core.$partial, z.ZodBoolean>>>;
519
551
  welcome_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
520
552
  rsvp_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
553
+ children_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
554
+ food_message: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
521
555
  music: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
522
556
  [x: string]: string;
523
557
  }>>>;
@@ -528,6 +562,8 @@ export declare const saveEventSchema: z.ZodObject<{
528
562
  card: "card";
529
563
  }>>>;
530
564
  auto_scroll: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
565
+ cover_video: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
566
+ cover_video_muted: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
531
567
  }, z.core.$strip>>>;
532
568
  dress_code: z.ZodOptional<z.ZodNullable<z.ZodObject<{
533
569
  style: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
@@ -550,6 +586,8 @@ export declare const saveEventSchema: z.ZodObject<{
550
586
  }>>>;
551
587
  note: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string | null, string>>>>;
552
588
  }, z.core.$strip>>>;
589
+ children_allowed: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
590
+ food_included: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
553
591
  visibility: z.ZodOptional<z.ZodEnum<{
554
592
  private: "private";
555
593
  public: "public";