memi-board 0.52.4 → 0.53.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 (49) hide show
  1. package/README.md +4 -6
  2. package/dist/{ar-3hd6xh6U.js → ar-DBv_xFzj.js} +3 -2
  3. package/dist/ar-DBv_xFzj.js.map +1 -0
  4. package/dist/{commentImages-4IOk2u0O.js → commentImages-t4lu_hxD.js} +130 -99
  5. package/dist/commentImages-t4lu_hxD.js.map +1 -0
  6. package/dist/composables/useMemiBoardModeration.d.ts +1 -3
  7. package/dist/composables/useMemiBoardPosts.d.ts +6 -0
  8. package/dist/{de-DXtmk-4H.js → de-DiqhMTJO.js} +3 -2
  9. package/dist/de-DiqhMTJO.js.map +1 -0
  10. package/dist/{en-CyZH4Ct1.js → en-hMF_prdm.js} +33 -3
  11. package/dist/en-hMF_prdm.js.map +1 -0
  12. package/dist/{es-BtRbHicT.js → es-RfbaViQj.js} +3 -2
  13. package/dist/es-RfbaViQj.js.map +1 -0
  14. package/dist/{fr-vnizG3rD.js → fr-BlRWQtSh.js} +3 -2
  15. package/dist/fr-BlRWQtSh.js.map +1 -0
  16. package/dist/{id-Cf8yw8n_.js → id-C0-e3Gwc.js} +3 -2
  17. package/dist/id-C0-e3Gwc.js.map +1 -0
  18. package/dist/index.d.ts +3 -2
  19. package/dist/index.js +1172 -1059
  20. package/dist/index.js.map +1 -1
  21. package/dist/{ja-D-Nrtjk-.js → ja-q1DilxZV.js} +3 -2
  22. package/dist/ja-q1DilxZV.js.map +1 -0
  23. package/dist/{pt-CSsshr7u.js → pt-sB9letRc.js} +3 -2
  24. package/dist/pt-sB9letRc.js.map +1 -0
  25. package/dist/runtime/components/Attachments.vue +82 -22
  26. package/dist/runtime/components/CategorySettings.vue +4 -0
  27. package/dist/runtime/components/CustomFieldEditor.vue +86 -0
  28. package/dist/runtime/components/Detail.vue +15 -1
  29. package/dist/runtime/components/Editor.vue +49 -12
  30. package/dist/runtime/components/Settings.vue +190 -13
  31. package/dist/storage.js +36 -36
  32. package/dist/types.d.ts +23 -1
  33. package/dist/utils/customFields.d.ts +33 -0
  34. package/dist/utils/slugify.d.ts +2 -0
  35. package/dist/{zh-BzrsqVN2.js → zh-Dag8WCjt.js} +3 -2
  36. package/dist/zh-Dag8WCjt.js.map +1 -0
  37. package/docs/firebase-setup.md +64 -0
  38. package/docs/host-integration.md +4 -0
  39. package/package.json +1 -1
  40. package/dist/ar-3hd6xh6U.js.map +0 -1
  41. package/dist/commentImages-4IOk2u0O.js.map +0 -1
  42. package/dist/de-DXtmk-4H.js.map +0 -1
  43. package/dist/en-CyZH4Ct1.js.map +0 -1
  44. package/dist/es-BtRbHicT.js.map +0 -1
  45. package/dist/fr-vnizG3rD.js.map +0 -1
  46. package/dist/id-Cf8yw8n_.js.map +0 -1
  47. package/dist/ja-D-Nrtjk-.js.map +0 -1
  48. package/dist/pt-CSsshr7u.js.map +0 -1
  49. package/dist/zh-BzrsqVN2.js.map +0 -1
package/README.md CHANGED
@@ -484,12 +484,6 @@ Flow: **local blocklist → Gemini structured JSON** → if flagged, nothing is
484
484
  As content blocks accumulate, `moderationBlockCount` / `moderationBlockAt` are recorded in `memiBoardUsers/{uid}`.
485
485
  At 10, the user cannot write for about a day (one is removed every 24h). In the example Rules, users can only **+1** their own count; decreasing or resetting is for admins.
486
486
 
487
- ### Admin moderation bypass
488
-
489
- At the bottom of the post form (`Editor.vue`), above the submit button, a "Ignore profanity filter" switch is shown only to `isAdmin` users. Submitting with it on skips both the local blocklist and AI moderation and saves (`via: 'admin-override'`; the warning count does not increase either). The comment form (`CommentForm.vue`) does not have it.
490
-
491
- When calling directly, bypass with `useMemiBoardModeration().checkText(text, { skipFilter: true })`. `skipFilter` trusts whatever value the host passes, so deciding whether the user is an admin is the caller's (host's) responsibility.
492
-
493
487
  ### AI writing assistant usage limit
494
488
 
495
489
  The editor's AI writing assistant can be used up to **10 times** per signed-in user in each 24-hour window. Before the call, only an `aiWritingPending` reservation is made; when the model call succeeds, it is committed to `aiWritingCount`. If the call fails, only the reservation is rolled back. Committed counts never go down. Reservation and commit update `memiBoardUsers/{uid}` in a Firestore transaction, so the total cannot exceed 10 even when several tabs run at once.
@@ -619,6 +613,10 @@ It is fine if the same Firebase project has a host app user collection — board
619
613
 
620
614
  ## Troubleshooting
621
615
 
616
+ ### Safari post skeletons or comments delayed by about 30 seconds
617
+
618
+ Some Mac/iPhone Safari environments may need **forced Firestore long polling** in the host app. Post lookups, comments, and realtime like/report state can be delayed even when macOS Chrome works normally. See the [Safari troubleshooting guide and early Nuxt/VueFire initialization example](docs/firebase-setup.md#safari-slow-post-navigation-or-delayed-comments). memi-board does not enable this automatically; compare on affected devices and configure the host before Firestore is first used.
619
+
622
620
  ### `useCurrentUser() called before the VueFireAuth module...`
623
621
 
624
622
  `vuefire.auth.enabled` is not set, or `vuefire`/`firebase` is installed twice. `pnpm why vuefire` → reduce to one. The module adds vue/vuefire/firebase to `vite.resolve.dedupe`, but **the host's peer installation** takes precedence.
@@ -2,6 +2,8 @@
2
2
  var e = {
3
3
  attachments: {
4
4
  attach: "إرفاق ملفات ({count} / {max})",
5
+ dropOrClick: "أفلت الملفات هنا أو انقر للإضافة",
6
+ uploading: "جارٍ رفع الملفات…",
5
7
  maxFiles: "يمكنك إرفاق {max} ملفات كحد أقصى."
6
8
  },
7
9
  auth: {
@@ -160,7 +162,6 @@ var e = {
160
162
  contentPlaceholder: "اكتب شيئًا… اكتب / لفتح قائمة الكتل.",
161
163
  imageContentPlaceholder: "اكتب شيئًا…",
162
164
  tagsPlaceholder: "اكتب وسمًا واضغط Enter",
163
- skipModeration: "تجاوز فلتر الألفاظ النابية (للمشرف)",
164
165
  pinNotice: "تثبيت كإعلان",
165
166
  submitEdit: "حفظ التغييرات",
166
167
  submitNext: "التالي: معاينة",
@@ -663,4 +664,4 @@ var e = {
663
664
  //#endregion
664
665
  export { e as default };
665
666
 
666
- //# sourceMappingURL=ar-3hd6xh6U.js.map
667
+ //# sourceMappingURL=ar-DBv_xFzj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-DBv_xFzj.js","names":[],"sources":["../src/i18n/messages/ar.ts"],"sourcesContent":["import type { MemiBoardMessages } from '../translate'\n\n/** 짧은 화면 문구만 번역한다. 빠진 키는 en → ko 순으로 폴백된다. */\nconst messages: MemiBoardMessages = {\n attachments: {\n attach: 'إرفاق ملفات ({count} / {max})',\n dropOrClick: 'أفلت الملفات هنا أو انقر للإضافة',\n uploading: 'جارٍ رفع الملفات…',\n maxFiles: 'يمكنك إرفاق {max} ملفات كحد أقصى.',\n },\n auth: {\n writeRestricted: 'تم تقييد النشر والتعليق مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n strikeSuffix: ' (تحذير {count}/{threshold})',\n strikeRestricted: ' عند بلوغ {count} تحذيرات سيتم تقييد النشر والتعليق.',\n notInitialized: '[memi-board] لم تتم تهيئة Firebase Auth.',\n },\n authorMemo: {\n tooLong: 'يمكن أن تصل الملاحظة إلى {max} حرف كحد أقصى.',\n },\n authorMenu: {\n viewProfile: 'عرض الملف الشخصي',\n viewPosts: 'عرض المنشورات',\n viewComments: 'عرض التعليقات',\n memoAriaLabel: 'ملاحظة عن هذا الكاتب',\n memoTitle: 'ملاحظة خاصة',\n memoPlaceholder: 'دوِّن شيئًا عن هذا الكاتب…',\n bad: 'سيئ',\n good: 'جيد',\n },\n avatarCropModal: {\n title: 'قص صورة الملف الشخصي',\n description: 'تُعرض بشكل مربع (1:1). اضبط المنطقة لتناسبها.',\n confirm: 'قص ورفع',\n },\n boardSettings: {\n signInRequired: 'يُرجى تسجيل الدخول.',\n idAndNameRequired: 'يُرجى إدخال معرّف اللوحة واسمها.',\n deleteIdRequired: 'يلزم معرّف اللوحة لحذفها.',\n nameRequired: 'يُرجى إدخال اسم اللوحة.',\n },\n boardUsers: {\n unsupportedRole: 'دور غير مدعوم.',\n roleDescription: {\n admin: 'يدير أدوار المستخدمين وإعدادات اللوحة وكل المحتوى.',\n user: 'يمكنه كتابة المنشورات والتعليقات، وتعديل أو حذف محتواه فقط.',\n },\n },\n commentFeed: {\n empty: 'لا توجد تعليقات بعد.',\n emptyLiked: 'لا توجد تعليقات حصلت على إعجاب بعد.',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n blinded: 'أخفى المشرف هذا التعليق.',\n },\n commentForm: {\n translationSkipped: 'تم نشر التعليق دون ترجمة. يمكنك ترجمته لاحقًا من نموذج التعديل.',\n hiddenBoardDenied: 'في اللوحات المخفية، يمكن لفريق العمل المعيَّن فقط التعليق.',\n denied: 'ليس لديك إذن بالتعليق في هذه اللوحة.',\n signInRequired: 'يُرجى تسجيل الدخول.',\n writeRestricted: 'تم تقييد النشر مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n moderationBlocked: 'يحتوي هذا على محتوى لا يمكن نشره.',\n replyTo: 'الرد على {name}',\n placeholder: 'اكتب تعليقًا',\n submitReply: 'رد',\n submit: 'تعليق',\n signInToComment: 'سجّل الدخول لكتابة تعليق.',\n attachHint: 'أسقط صورة هنا أو انقر لاختيار واحدة.',\n attachNote: 'jpg وpng وgif وwebp. يتم تصغير الصور الكبيرة إلى 5MB أو أقل.',\n removeImage: 'إزالة الصورة المرفقة',\n imageOnly: 'يمكن إرفاق صور jpg وpng وgif وwebp فقط.',\n uploadFailed: 'تعذر رفع الصورة.',\n uploading: 'جارٍ رفع الصورة…',\n },\n commentItem: {\n editRestricted: 'تم تقييد تعديل التعليقات مؤقتًا.',\n moderationBlocked: 'يحتوي هذا على محتوى لا يمكن نشره.',\n editFailed: 'تعذّر تعديل التعليق.',\n blindFailed: 'تعذّر تغيير حالة الإخفاء.',\n likeFailed: 'تعذّرت معالجة الإعجاب.',\n blinded: 'أخفى المشرف هذا التعليق.',\n attachedImage: 'صورة مرفقة بالتعليق',\n edit: 'تعديل التعليق',\n blind: 'إخفاء التعليق',\n unblind: 'إظهار التعليق',\n delete: 'حذف التعليق',\n },\n commentList: {\n loading: 'جارٍ تحميل التعليقات',\n empty: 'لا توجد تعليقات بعد.',\n loadMore: 'المزيد من التعليقات',\n loadingMore: 'جارٍ تحميل المزيد من التعليقات',\n },\n commentThread: {\n deleteConfirm: 'هل تريد حذف هذا التعليق؟',\n deleteFailed: 'تعذّر حذف التعليق.',\n hideReplies: 'إخفاء الردود',\n showReplies: 'الردود ({count})',\n loadMoreReplies: 'المزيد من الردود',\n },\n comments: {\n bodyRequired: 'يُرجى إدخال تعليق.',\n bodyTooLong: 'يمكن أن يصل التعليق إلى {max} حرف كحد أقصى.',\n replyTargetNotFound: 'تعذّر العثور على التعليق الذي تردّ عليه.',\n threadNotFound: 'تعذّر العثور على سلسلة التعليقات.',\n hasRepliesCannotDelete: 'لا يمكن حذف التعليقات التي لها ردود حاليًا.',\n },\n common: {\n action: {\n cancel: 'إلغاء',\n save: 'حفظ',\n saved: 'تم الحفظ',\n edit: 'تعديل',\n delete: 'حذف',\n confirm: 'موافق',\n close: 'إغلاق',\n add: 'إضافة',\n more: 'المزيد',\n prev: 'السابق',\n next: 'التالي',\n retry: 'إعادة المحاولة',\n reply: 'رد',\n like: 'إعجاب',\n unlike: 'إلغاء الإعجاب',\n share: 'مشاركة',\n report: 'إبلاغ',\n signIn: 'تسجيل الدخول',\n signOut: 'تسجيل الخروج',\n write: 'كتابة',\n toTop: 'للأعلى',\n },\n label: {\n anonymous: 'مجهول',\n user: 'مستخدم',\n image: 'صورة',\n draft: 'مسودة',\n loading: 'جارٍ التحميل…',\n },\n role: {\n admin: 'مشرف',\n staff: 'فريق العمل',\n user: 'مستخدم',\n },\n date: {\n justNow: 'الآن',\n fewSecondsAgo: 'قبل بضع ثوانٍ',\n checking: 'جارٍ التحقق من الوقت',\n createdAt: 'تاريخ الإنشاء: {time}',\n updatedAt: 'تاريخ التعديل: {time}',\n },\n },\n detail: {\n deleteConfirm: 'هل تريد حذف هذا المنشور؟ لا يمكن التراجع عن ذلك.',\n notFound: 'لم يتم العثور على المنشور.',\n draftPreview: 'معاينة غير منشورة',\n draftNotice: 'لم يُنشر هذا المنشور بعد. لا يمكن لأحد غيرك رؤيته حتى تنشره.',\n publish: 'نشر',\n notice: 'إعلان',\n pin: 'تثبيت كإعلان',\n unpin: 'إلغاء الإعلان',\n backToList: 'العودة إلى القائمة',\n postNav: 'التنقل بين المنشورات',\n list: 'القائمة',\n comments: 'التعليقات',\n },\n editor: {\n titlePlaceholder: 'العنوان',\n contentPlaceholder: 'اكتب شيئًا… اكتب / لفتح قائمة الكتل.',\n imageContentPlaceholder: 'اكتب شيئًا…',\n tagsPlaceholder: 'اكتب وسمًا واضغط Enter',\n pinNotice: 'تثبيت كإعلان',\n submitEdit: 'حفظ التغييرات',\n submitNext: 'التالي: معاينة',\n apply: 'تطبيق',\n imageOptimizing: 'جارٍ تحسين الصورة ورفعها…',\n cover: {\n imageLink: 'رابط الصورة',\n addPhoto: 'إضافة صور',\n alt: 'صورة {n}',\n representative: 'الغلاف',\n setRepresentative: 'تعيين كغلاف',\n setRepresentativeAria: 'تعيين الصورة {n} كغلاف',\n remove: 'إزالة الصورة',\n add: 'إضافة',\n uploading: 'جارٍ الرفع…',\n dropOrClick: 'أفلت الصور هنا أو انقر للإضافة',\n emptyHint: 'يمكن اختيار عدة صور · اختر الغلاف بعد الرفع · اسحب لإعادة الترتيب',\n uploadTitle: 'رفع',\n },\n uploadFailed: 'فشل الرفع',\n aiAssistant: 'مساعد الكتابة بالذكاء الاصطناعي',\n insertBlock: 'إدراج كتلة',\n blockMenu: 'قائمة الكتل',\n imageDialog: {\n title: 'إضافة صورة',\n chooseFile: 'اختيار صورة من جهازك',\n orLink: 'أو رابط صورة',\n urlLabel: 'URL الصورة',\n previewAlt: 'معاينة صورة خارجية',\n addLink: 'إضافة الرابط',\n },\n customDialog: {\n title: 'إعادة الصياغة بأسلوب مخصص',\n label: 'كيف تريد إعادة صياغته؟',\n help: 'مثال: بأسلوب ودّي / بأسلوب رسمي / كنقاط موجزة',\n placeholder: 'بأسلوب ودّي',\n },\n aiPreview: {\n title: 'مراجعة نتيجة AI',\n currentTitle: 'العنوان الحالي',\n newTitle: 'العنوان الجديد',\n currentContent: 'المحتوى الحالي',\n appendedContent: 'المحتوى المضاف',\n before: 'قبل',\n after: 'بعد',\n },\n menu: {\n ai: 'AI',\n aiContinue: 'المتابعة باستخدام AI',\n style: 'النمط',\n insert: 'إدراج',\n paragraph: 'فقرة',\n heading1: 'عنوان 1',\n heading2: 'عنوان 2',\n heading3: 'عنوان 3',\n bulletList: 'قائمة نقطية',\n orderedList: 'قائمة مرقّمة',\n blockquote: 'اقتباس',\n codeBlock: 'كتلة برمجية',\n horizontalRule: 'فاصل',\n image: 'صورة',\n turnInto: 'تحويل إلى',\n resetFormatting: 'إعادة تعيين التنسيق',\n duplicate: 'تكرار',\n moveUp: 'نقل للأعلى',\n moveDown: 'نقل للأسفل',\n delete: 'حذف',\n },\n toolbar: {\n link: 'رابط',\n image: 'صورة',\n format: 'التنسيق',\n bold: 'غامق',\n italic: 'مائل',\n underline: 'تسطير',\n strike: 'يتوسطه خط',\n title: 'العنوان',\n heading: 'عنوان',\n subheading: 'عنوان فرعي',\n body: 'النص',\n mono: 'أحادي المسافة',\n bulletList: 'قائمة نقطية',\n orderedList: 'قائمة مرقّمة',\n blockquote: 'اقتباس',\n codeBlock: 'كتلة برمجية',\n horizontalRule: 'فاصل',\n clearFormatting: 'مسح التنسيق',\n undo: 'تراجع',\n redo: 'إعادة',\n },\n ai: {\n proofread: 'تدقيق الإملاء',\n polish: 'تحسين الصياغة',\n continue: 'متابعة الكتابة',\n summarize: 'تلخيص موجز',\n translateEn: 'الترجمة إلى الإنجليزية',\n translateKo: 'الترجمة إلى الكورية',\n translateAll: 'ترجمة وحفظ بـ {count} لغات',\n translateSaved: 'تم الحفظ بـ {count} لغات. يرى القارئ ترجمة لغته.',\n translatePending: 'ترجمات {count} لغات جاهزة. تُحفظ مع المنشور.',\n translateEmpty: 'أدخل عنوانًا أو نصًا للترجمة أولًا.',\n title: 'إنشاء عنوان من النص',\n custom: 'إعادة الصياغة بأسلوب مخصص…',\n failed: 'فشلت مهمة AI. يُرجى المحاولة مرة أخرى.',\n },\n youtubePrompt: 'أدخل رابط YouTube.',\n errors: {\n coverMax: 'يمكنك رفع {max} صور كحد أقصى.',\n imageUrlRequired: 'أدخل URL الصورة.',\n imageUrlInvalid: 'أدخل URL صالحًا للصورة.',\n imageUrlHttps: 'يُسمح فقط بعناوين URL للصور التي تبدأ بـ HTTPS.',\n imageUrlCredentials: 'لا يُسمح بعناوين URL التي تحتوي على بيانات تسجيل الدخول.',\n imageTimeout: 'يستغرق تحميل الصورة وقتًا طويلًا جدًا.',\n imageNotDisplayable: 'لا يمكن عرض هذه الصورة.',\n editorNotReady: 'المحرر غير جاهز. يُرجى المحاولة مرة أخرى.',\n imageLinkFailed: 'تعذّرت إضافة رابط الصورة.',\n imageOnly: 'يمكن رفع ملفات الصور فقط.',\n imageTooLarge: 'يجب ألا يتجاوز حجم الصورة الأصلية {mb}MB.',\n imageUploadFailed: 'فشل رفع الصورة.',\n pasteAsFile: 'الصق الصور كملفات أو اسحبها إلى المنطقة أعلاه.',\n postNotFound: 'لم يتم العثور على المنشور.',\n loadPermission: 'ليس لديك إذن بتحميل هذا المنشور. تأكد من تسجيل الدخول.',\n loadFailed: 'تعذّر تحميل المنشور: {message}',\n titleRequired: 'أدخل عنوانًا.',\n photoRequired: 'ارفع صورة واحدة على الأقل.',\n bodyRequired: 'اكتب نصًا أو أرفق صورة.',\n signInRequired: 'يلزم تسجيل الدخول.',\n boardMissing: 'لم يتم تحديد لوحة.',\n writeRestricted: 'تم تقييد النشر والتعليق مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n moderationBlocked: 'يحتوي هذا على محتوى لا يمكن نشره.',\n },\n hint: {\n reviewing: 'جارٍ مراجعة المحتوى…',\n saving: 'جارٍ الحفظ…',\n },\n },\n footer: {\n introduction: 'لوحة مبنية على Nuxt 4 وVue 3 وTypeScript، تستخدم Nuxt UI وFirebase لتتدفق المنشورات والتعليقات بسلاسة.',\n info: {\n title: 'معلومات اللوحة',\n about: 'عن هذه اللوحة',\n history: 'سجل الإصدارات',\n },\n stack: {\n ui: 'الواجهة والتجربة',\n data: 'البيانات وتسجيل الدخول',\n writing: 'الكتابة والأدوات المساعدة',\n },\n },\n likes: {\n signInRequired: 'يُرجى تسجيل الدخول.',\n commentNotFound: 'لم يتم العثور على التعليق.',\n },\n list: {\n settings: 'الإعدادات',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد منشورات بعد.',\n notice: 'إعلان',\n photo: 'صورة',\n likeCount: 'الإعجابات {count}',\n info: {\n title: 'معلومات اللوحة',\n about: 'عن هذه اللوحة',\n history: 'سجل الإصدارات',\n },\n stack: {\n framework: 'إطار العمل واللغة',\n ui: 'الواجهة والتنسيق',\n backend: 'الخلفية والبيانات',\n },\n tech: {\n nuxt: 'إطار عمل SSR مبني على Vue',\n vue: 'Composition API · script setup',\n typescript: 'أنواع آمنة للبيانات والمكونات',\n nuxtUi: 'واجهة اللوحة والنماذج والنوافذ المنبثقة',\n tailwind: 'متجاوب · أنماط فاتحة/داكنة',\n lucide: 'أيقونات خفيفة ومتناسقة',\n dayjs: 'تواريخ وأوقات نسبية سهلة القراءة',\n firestore: 'قاعدة بيانات فورية للمنشورات والتعليقات',\n auth: 'تسجيل دخول وأذونات آمنة',\n storage: 'تخزين الصور والمرفقات',\n vuefire: 'ربط فوري بين Nuxt وFirebase',\n },\n },\n listViewSwitch: {\n default: 'افتراضي',\n dense: 'مضغوط',\n video: 'فيديو',\n },\n miniComments: {\n empty: 'لا توجد تعليقات بعد.',\n blinded: 'أخفى المشرف هذا التعليق.',\n },\n miniList: {\n empty: 'لا توجد منشورات بعد.',\n },\n miniPicker: {\n selectedCount: 'المحدد {count} / {max}',\n layoutHint: 'من 2 فأكثر تُعرض كشريط دوّار، و4 كشبكة',\n searchPlaceholder: 'البحث في العناوين',\n loading: 'جارٍ تحميل المنشورات…',\n noMore: 'لا توجد منشورات أخرى للاختيار.',\n },\n miniPost: {\n empty: 'لم يتم اختيار منشورات.',\n },\n moderation: {\n writeRestricted: 'تم تقييد النشر والتعليق مؤقتًا بسبب تكرار تحذيرات المحتوى.',\n },\n moderationPrompt: {\n localHit: 'لا يُسمح بتعبيرات مثل «{hit}». يُرجى إعادة الصياغة.',\n localGeneric: 'يحتوي هذا على ألفاظ نابية، لذا لا يمكن نشره. يُرجى إعادة الصياغة.',\n genericBlocked: 'يحتوي هذا على محتوى لا يمكن نشره. يُرجى تعديله.',\n categories: {\n abuse: 'ألفاظ نابية أو إهانات',\n spam: 'رسائل مزعجة أو إعلانات',\n adult: 'محتوى جنسي أو للبالغين',\n violence: 'عنف أو تهديدات',\n other: 'محتوى غير لائق',\n },\n },\n moderationStrike: {\n liftSoon: 'يُرفع قريبًا',\n liftInHours: 'يُرفع بعد {hours} ساعة تقريبًا',\n liftInDays: 'يُرفع بعد {days} يوم تقريبًا',\n liftInDaysHours: 'يُرفع بعد {days} يوم و{hours} ساعة تقريبًا',\n },\n posts: {\n boardIdRequired: '[memi-board] boardId مطلوب.',\n photoRequired: 'يُرجى إضافة صورة.',\n bodyRequired: 'يُرجى إدخال نص أو إرفاق صورة.',\n titleRequired: 'يُرجى إدخال عنوان.',\n },\n profile: {\n notFound: 'لم يتم العثور على المستخدم.',\n noName: 'بلا اسم',\n joined: 'انضم {time}',\n lastVisit: 'آخر ظهور {time}',\n },\n profileEditModal: {\n imageOnly: 'يمكن اختيار ملفات الصور فقط.',\n nameRequired: 'يُرجى إدخال اسم.',\n saveFailed: 'تعذّر حفظ الملف الشخصي.',\n title: 'تعديل الملف الشخصي',\n changePhoto: 'تغيير الصورة',\n name: 'الاسم',\n bio: 'نبذة',\n bioPlaceholder: 'عرّف الآخرين بنفسك',\n },\n reportButton: {\n failed: 'تعذّر إرسال البلاغ.',\n reported: 'تم الإبلاغ',\n title: 'الإبلاغ عن المنشور',\n done: 'تم استلام البلاغ. سيراجعه فريق العمل.',\n reason: 'السبب',\n detailPlaceholder: 'التفاصيل (اختياري)',\n submit: 'إبلاغ',\n },\n reportList: {\n staffOnly: 'يمكن لفريق العمل فقط عرض البلاغات.',\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد بلاغات معلّقة.',\n untitled: 'منشور بلا عنوان',\n author: 'بواسطة {name}',\n dismiss: 'رفض',\n confirm: 'معالجة',\n },\n reports: {\n reason: {\n spam: 'رسائل مزعجة / إعلانات',\n abuse: 'إساءة / كراهية / تحرّش',\n adult: 'محتوى جنسي',\n illegal: 'محتوى غير قانوني',\n other: 'أخرى',\n },\n fallbackLabel: 'بلاغ',\n signInRequired: 'يُرجى تسجيل الدخول.',\n cannotReportOwn: 'لا يمكنك الإبلاغ عن منشورك.',\n reasonRequired: 'يُرجى اختيار سبب.',\n detailTooLong: 'يمكن أن تصل التفاصيل إلى {max} حرف كحد أقصى.',\n },\n sectionUtil: {\n kind: {\n list: 'قائمة المنشورات',\n post: 'منشورات',\n comments: 'تعليقات',\n },\n sort: {\n latest: 'الأحدث',\n likes: 'الأكثر إعجابًا',\n },\n untitledPost: 'منشور',\n view: {\n media: 'الوسائط',\n list: 'قائمة',\n },\n },\n sections: {\n defaultTitle: 'القسم {n}',\n },\n seo: {\n allCategory: 'الكل',\n boardDescription: 'لوحة {name}',\n allDescription: 'اللوحة — الإعلانات وأخبار المجتمع.',\n postFallbackTitle: 'منشور | {site}',\n postFallbackDescription: 'اللوحة',\n photo: 'صورة',\n postDescriptionFallback: 'منشور في اللوحة',\n listTitle: '{name} | {site}',\n listTitleAll: 'اللوحة | {site}',\n listDescription: '{name} — تابع أحدث المنشورات.',\n listDescriptionAll: 'اللوحة — إعلانات وقصص.',\n },\n settings: {\n loading: 'جارٍ تحميل الإعدادات…',\n noAccess: 'ليس لديك صلاحية الوصول',\n notFound: {\n title: 'لم يتم العثور على اللوحة',\n checkAddress: 'يُرجى التحقق من العنوان.',\n checkBoardAddress: 'يُرجى التحقق من عنوان اللوحة.',\n },\n newBoard: {\n title: 'هذه اللوحة غير موجودة بعد',\n description: 'املأ البيانات أدناه واحفظها لإنشائها بهذا المعرّف.',\n },\n noLabel: 'بلا تسمية',\n option: {\n default: 'قياسي',\n },\n id: {\n label: 'معرّف الفئة',\n help: 'يُستخدم في URL والبيانات',\n },\n writeRole: {\n label: 'من يمكنه النشر',\n help: 'الحد الأدنى من الدور المطلوب للنشر في هذه الفئة',\n helpShort: 'الحد الأدنى من الدور المطلوب للنشر',\n options: {\n user: 'المستخدمون فما فوق',\n staff: 'فريق العمل فما فوق',\n admin: 'المشرفون فقط',\n },\n },\n commentWriteRole: {\n label: 'من يمكنه التعليق',\n help: 'الحد الأدنى من الدور المطلوب للتعليق في هذه الفئة',\n helpShort: 'الحد الأدنى من الدور المطلوب للتعليق',\n hiddenFixed: 'فريق العمل المعيَّن فقط (ثابت للوحات المخفية)',\n },\n staff: {\n label: 'فريق العمل المعيَّن',\n help: 'يمكن لفريق العمل المحدد فقط إعداد هذه اللوحة وإدارتها. اتركه فارغًا ليقتصر الأمر على المشرفين',\n placeholder: 'المشرفون فقط (دون تعيين فريق عمل)',\n },\n label: {\n label: 'الاسم المعروض',\n help: 'الاسم الذي يراه المستخدمون',\n },\n description: {\n label: 'الوصف',\n help: 'يظهر أعلى اللوحة وفي أماكن أخرى',\n placeholder: 'وصف قصير لهذه اللوحة (اختياري)',\n },\n visibility: {\n label: 'الظهور',\n options: {\n public: {\n label: 'ظاهرة',\n description: 'تظهر في القائمة الكاملة وعوامل التصفية',\n },\n hidden: {\n label: 'مخفية',\n description: 'يوميات أو خاصة. يمكن لفريق العمل المعيَّن فقط التعليق',\n },\n },\n },\n listView: {\n label: 'عرض القائمة',\n help: 'طريقة عرض قائمة المنشورات',\n options: {\n dense: 'مضغوط',\n video: 'فيديو',\n },\n },\n editorType: {\n label: 'نموذج النشر',\n help: 'طريقة كتابة المنشورات',\n options: {\n default: 'كتابة عنوان ونص',\n image: 'إضافة عدة صور وصورة غلاف',\n },\n },\n bulk: {\n title: 'تطبيق على كل اللوحات',\n apply: 'تطبيق على {count} لوحات',\n applyShort: 'تطبيق',\n confirmTitle: 'تطبيق على كل اللوحات',\n translateUntranslated: 'ترجمة اللوحات غير المترجمة ({count})',\n },\n translationLocales: {\n label: 'لغات الترجمة',\n },\n locale: {\n label: 'لغة اللوحة',\n auto: 'تلقائي (حسب لغة الموقع)',\n },\n autoTranslate: {\n action: \"ترجمة إلى {count} لغات\",\n manualHelp: \"ترجم اسم العرض والوصف معًا، ثم اضغط على حفظ للتطبيق.\",\n pending: \"الترجمات إلى {count} لغات جاهزة. اضغط على حفظ للتطبيق.\",\n manualFailed: \"فشلت الترجمة. تم الاحتفاظ بالنص. يرجى المحاولة مرة أخرى.\",\n label: 'الترجمة إلى {count} لغات عند الحفظ',\n help: 'عند التشغيل تُترجم الاسم والوصف إلى {count} لغات. عند الإيقاف لا تُترجم. لا تُعاد ترجمة النص إذا لم يتغير.',\n failed: 'حُفظت الإعدادات، لكن فشلت الترجمة إلى {count} لغات. احفظ مرة أخرى.',\n ready: 'الاسم والوصف محفوظان بـ {count} لغات.',\n },\n action: {\n moveDown: 'للأسفل',\n goToBoard: 'الانتقال إلى اللوحة',\n deleteBoard: 'حذف اللوحة',\n create: 'إنشاء',\n },\n newCategoryPlaceholder: 'اسم الفئة الجديدة',\n savedCategory: 'تم حفظ الفئة «{label}».',\n savedSettings: 'تم حفظ إعدادات اللوحة.',\n created: 'تم إنشاء اللوحة.',\n error: {\n orderFailed: 'تعذّر حفظ ترتيب الفئات.',\n deleteFailed: 'تعذّر حذف اللوحة وبياناتها.',\n saveFailed: 'تعذّر حفظ إعدادات اللوحة.',\n deleteAllFailed: 'تعذّر حذف بيانات اللوحة.',\n },\n danger: {\n title: 'منطقة الخطر',\n confirmLabel: 'اكتب «{phrase}» للتأكيد',\n phrase: 'حذف بيانات اللوحة',\n button: 'حذف كل البيانات',\n done: 'تم حذف كل بيانات اللوحة.',\n },\n },\n shareButton: {\n copied: 'تم نسخ الرابط',\n },\n signIn: {\n withGoogle: 'تسجيل الدخول باستخدام Google',\n withApple: 'تسجيل الدخول باستخدام Apple',\n or: 'أو',\n name: 'الاسم',\n email: 'البريد الإلكتروني',\n password: 'كلمة المرور',\n signUp: 'إنشاء حساب',\n toSignUp: 'ليس لديك حساب؟ أنشئ حسابًا',\n toSignIn: 'لديك حساب بالفعل؟ سجّل الدخول',\n },\n storage: {\n sourceTooLarge: 'يجب ألا يتجاوز حجم الصورة الأصلية {max}MB.',\n imageOnly: 'يمكن رفع ملفات الصور فقط.',\n canvasUnavailable: 'Canvas غير متاح',\n compressFailed: 'فشل الضغط',\n loadFailed: 'فشل تحميل الصورة',\n },\n swipeHint: {\n title: 'جرّب السحب يمينًا أو يسارًا',\n description: 'اسحب لليسار للمنشور التالي، ولليمين للمنشور السابق.',\n },\n userCommentList: {\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد تعليقات بعد.',\n blinded: 'أخفى المشرف هذا التعليق.',\n likes: 'الإعجابات {count}',\n },\n userPostList: {\n loadFailed: 'تعذّر تحميل القائمة: {error}',\n empty: 'لا توجد منشورات بعد.',\n },\n users: {\n changeRoleFailed: 'تعذّر تغيير الدور.',\n loading: 'جارٍ تحميل المستخدمين…',\n noPermission: {\n title: 'لا توجد صلاحية',\n description: 'يمكن لمشرفي اللوحة فقط إدارة أدوار المستخدمين.',\n },\n empty: 'لم يسجّل أي مستخدم الدخول إلى اللوحة بعد.',\n noName: 'بلا اسم',\n moderationWarnings: 'تحذيرات المحتوى: {count}',\n },\n writingAssistant: {\n dailyLimit: 'يمكن استخدام مساعد الكتابة بالذكاء الاصطناعي حتى {limit} مرة في اليوم. حاول مرة أخرى بعد حوالي {hours} ساعة.',\n loginRequired: 'سجّل الدخول لاستخدام مساعد الكتابة بالذكاء الاصطناعي.',\n userMissing: 'تعذّر التحقق من معلومات المستخدم. يُرجى المحاولة مرة أخرى.',\n contentRequired: 'أدخل أولًا محتوى ليعمل عليه AI.',\n customRequired: 'أدخل تعليمات لطريقة إعادة الصياغة.',\n emptyResult: 'لم يتمكن AI من إنتاج نتيجة. يُرجى المحاولة مرة أخرى.',\n translateEmpty: 'أدخل عنوانًا أو نصًا للترجمة أولًا.',\n translateTooLong: 'لا يمكن حفظ نص أطول من {limit} حرفًا بـ {count} لغات. اختصره ثم أعد المحاولة.',\n translateIncomplete: 'عادت بعض اللغات فارغة. يُرجى المحاولة مرة أخرى.',\n failed: 'فشلت مهمة AI. يُرجى المحاولة مرة أخرى.',\n actions: {\n proofread: 'تدقيق الإملاء',\n polish: 'تحسين الجمل',\n continue: 'متابعة الكتابة',\n summarize: 'تلخيص',\n translateEn: 'الترجمة إلى الإنجليزية',\n translateKo: 'الترجمة إلى الكورية',\n translateAll: 'ترجمة وحفظ بـ {count} لغات',\n translateSaved: 'تم الحفظ بـ {count} لغات. يرى القارئ ترجمة لغته.',\n translatePending: 'ترجمات {count} لغات جاهزة. تُحفظ مع المنشور.',\n translateEmpty: 'أدخل عنوانًا أو نصًا للترجمة أولًا.',\n title: 'إنشاء عنوان من النص',\n custom: 'إعادة الصياغة بأسلوب مخصص…',\n },\n },\n}\n\nexport default messages\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { computed as e, getCurrentInstance as t, hasInjectionContext as n, inject as r, onServerPrefetch as i, provide as a, reactive as o, shallowRef as s, toValue as c, watch as ee } from "vue";
2
- import { collection as l, doc as u } from "firebase/firestore";
1
+ import { computed as e, getCurrentInstance as t, hasInjectionContext as n, inject as r, onServerPrefetch as i, provide as a, reactive as o, shallowRef as s, toValue as c, watch as l } from "vue";
2
+ import { collection as u, doc as d } from "firebase/firestore";
3
3
  //#region src/utils/boardPaths.ts
4
- var d = "memiBoardPosts", f = "memiBoardComments", p = "memiBoardLikes", m = "memiBoardReports", h = "memiBoardSettings", g = "memiBoardUsers";
5
- function _(e) {
4
+ var f = "memiBoardPosts", p = "memiBoardComments", m = "memiBoardLikes", h = "memiBoardReports", g = "memiBoardSettings", _ = "memiBoardUsers";
5
+ function v(e) {
6
6
  return {
7
7
  postsCollection: e.postsCollection?.trim() || "memiBoardPosts",
8
8
  commentsCollection: e.commentsCollection?.trim() || "memiBoardComments",
@@ -12,58 +12,58 @@ function _(e) {
12
12
  usersCollection: e.usersCollection?.trim() || "memiBoardUsers"
13
13
  };
14
14
  }
15
- function v(e, t) {
16
- return l(e, t.settingsCollection);
17
- }
18
- function y(e, t, n) {
19
- return u(e, t.settingsCollection, n);
20
- }
21
- function b(e, t) {
22
- return l(e, t.postsCollection);
15
+ function ee(e, t) {
16
+ return u(e, t.settingsCollection);
23
17
  }
24
18
  function te(e, t, n) {
25
- return u(e, t.postsCollection, n);
19
+ return d(e, t.settingsCollection, n);
26
20
  }
27
- function ne(e, t, n) {
28
- return u(e, t.postsCollection, n, "body", "main");
21
+ function ne(e, t) {
22
+ return u(e, t.postsCollection);
29
23
  }
30
- function re(e, t) {
31
- return l(e, t.commentsCollection);
24
+ function re(e, t, n) {
25
+ return d(e, t.postsCollection, n);
32
26
  }
33
27
  function ie(e, t, n) {
34
- return u(e, t.commentsCollection, n);
28
+ return d(e, t.postsCollection, n, "body", "main");
35
29
  }
36
30
  function ae(e, t) {
37
- return l(e, t.likesCollection);
31
+ return u(e, t.commentsCollection);
32
+ }
33
+ function y(e, t, n) {
34
+ return d(e, t.commentsCollection, n);
35
+ }
36
+ function b(e, t) {
37
+ return u(e, t.likesCollection);
38
38
  }
39
39
  function x(e, t) {
40
40
  return `${e}_${t}`;
41
41
  }
42
- function oe(e, t, n, r) {
43
- return u(e, t.likesCollection, x(n, r));
42
+ function S(e, t, n, r) {
43
+ return d(e, t.likesCollection, x(n, r));
44
44
  }
45
- function se(e, t) {
46
- return l(e, t.reportsCollection);
45
+ function oe(e, t) {
46
+ return u(e, t.reportsCollection);
47
47
  }
48
- function S(e, t) {
48
+ function C(e, t) {
49
49
  return `${e}_${t}`;
50
50
  }
51
- function ce(e, t, n, r) {
52
- return u(e, t.reportsCollection, S(n, r));
51
+ function se(e, t, n, r) {
52
+ return d(e, t.reportsCollection, C(n, r));
53
53
  }
54
- function le(e, t) {
55
- return l(e, t.usersCollection);
54
+ function ce(e, t) {
55
+ return u(e, t.usersCollection);
56
56
  }
57
- function ue(e, t, n) {
58
- return u(e, t.usersCollection, n);
57
+ function le(e, t, n) {
58
+ return d(e, t.usersCollection, n);
59
59
  }
60
- function de(e, t, n) {
61
- return u(e, t.usersCollection, n, "private", "info");
60
+ function ue(e, t, n) {
61
+ return d(e, t.usersCollection, n, "private", "info");
62
62
  }
63
- function fe(e, t, n, r) {
64
- return u(e, t.usersCollection, n, "memos", r);
63
+ function de(e, t, n, r) {
64
+ return d(e, t.usersCollection, n, "memos", r);
65
65
  }
66
- function C(e, t) {
66
+ function fe(e, t) {
67
67
  return `${e.postsCollection}/${t}`;
68
68
  }
69
69
  function pe(e, t) {
@@ -75,12 +75,12 @@ var w = "__MEMI_BOARD_CONFIG__";
75
75
  function T() {
76
76
  let e = globalThis;
77
77
  return e[w] || (e[w] = o({
78
- postsCollection: d,
79
- commentsCollection: f,
80
- likesCollection: p,
81
- reportsCollection: m,
82
- settingsCollection: h,
83
- usersCollection: g,
78
+ postsCollection: f,
79
+ commentsCollection: p,
80
+ likesCollection: m,
81
+ reportsCollection: h,
82
+ settingsCollection: g,
83
+ usersCollection: _,
84
84
  auth: { providers: ["google", "apple"] },
85
85
  moderation: {
86
86
  enabled: !0,
@@ -123,7 +123,7 @@ function k() {
123
123
  if (!O()) throw Object.assign(/* @__PURE__ */ Error("Content translation is disabled for this board service."), { code: "memi-board/translation-disabled" });
124
124
  }
125
125
  function A() {
126
- return _(E());
126
+ return v(E());
127
127
  }
128
128
  //#endregion
129
129
  //#region src/i18n/locales.ts
@@ -202,6 +202,8 @@ function I(e) {
202
202
  var L = {
203
203
  attachments: {
204
204
  attach: "파일 첨부 ({count} / {max})",
205
+ dropOrClick: "파일을 놓거나 클릭해서 추가",
206
+ uploading: "파일 업로드 중…",
205
207
  maxFiles: "최대 {max}개까지 첨부할 수 있습니다."
206
208
  },
207
209
  auth: {
@@ -371,7 +373,6 @@ var L = {
371
373
  contentPlaceholder: "본문을 입력하세요… / 를 입력하면 블록 메뉴가 열립니다.",
372
374
  imageContentPlaceholder: "내용을 입력하세요…",
373
375
  tagsPlaceholder: "태그 입력 후 Enter",
374
- skipModeration: "비속어 필터 무시 (관리자)",
375
376
  pinNotice: "공지로 등록",
376
377
  submitEdit: "수정 완료",
377
378
  submitNext: "다음: 미리보기",
@@ -737,6 +738,18 @@ var L = {
737
738
  help: "게시판 상단 등에 보이는 안내 문구",
738
739
  placeholder: "이 게시판에 대한 짧은 설명 (선택)"
739
740
  },
741
+ list: {
742
+ filterAll: "전체",
743
+ filterPlaceholder: "이름 또는 주소",
744
+ sort: "정렬",
745
+ sortName: "이름",
746
+ sortDescription: "설명",
747
+ sortId: "주소",
748
+ empty: "해당하는 게시판이 없습니다.",
749
+ none: "없음",
750
+ fieldCount: "{count}개",
751
+ localeAuto: "자동"
752
+ },
740
753
  visibility: {
741
754
  pending: "공개 범위 변경이 아직 끝나지 않았습니다. 같은 설정으로 다시 저장하면 이어서 처리합니다.",
742
755
  label: "공개 범위",
@@ -768,6 +781,21 @@ var L = {
768
781
  image: "여러 사진과 대표사진을 작성"
769
782
  }
770
783
  },
784
+ customFields: {
785
+ label: "커스텀 필드",
786
+ help: "글에 추가로 저장할 항목입니다. 키는 나중에 그 값으로 검색할 때 쓰고, 이름은 입력한 그대로 보이며 번역하지 않습니다.",
787
+ key: "키",
788
+ keyPlaceholder: "channel",
789
+ name: "이름",
790
+ namePlaceholder: "채널",
791
+ placeholder: "플레이스홀더",
792
+ inputPlaceholder: "글쓰기 칸에 흐리게 보일 문구",
793
+ add: "필드 추가",
794
+ limit: "커스텀 필드는 8개까지입니다.",
795
+ invalidKey: "키는 영문 소문자로 시작하고, 영문·숫자·밑줄만 32자 이내로 쓸 수 있습니다.",
796
+ duplicateKey: "키 {key}가 중복입니다.",
797
+ labelRequired: "키 {key}의 이름을 입력해 주세요."
798
+ },
771
799
  locale: {
772
800
  label: "게시판 언어",
773
801
  help: "비우면 사이트 언어를 따릅니다. 고르면 이 게시판은 항상 그 언어로 보입니다.",
@@ -809,7 +837,9 @@ var L = {
809
837
  deleteBoard: "게시판 삭제",
810
838
  create: "만들기"
811
839
  },
812
- newCategoryPlaceholder: "새 카테고리 이름",
840
+ newCategoryPlaceholder: "새 게시판 이름",
841
+ newCategoryHelp: "입력한 이름이 게시판 주소가 됩니다. 40자까지이고, 공백은 - 가 되며, 영문·숫자·한글만 남습니다.",
842
+ newCategoryUrl: "주소: {path}",
813
843
  deleteConfirm: "‘{label}’ 게시판을 삭제하시겠습니까?\n\n이 게시판의 모든 게시물, 댓글, 대댓글, 본문 이미지, 댓글 이미지와 첨부파일이 영구 삭제됩니다. 이 작업은 되돌릴 수 없습니다.",
814
844
  savedCategory: "‘{label}’ 카테고리를 저장했습니다.",
815
845
  savedSettings: "게시판 설정을 저장했습니다.",
@@ -917,15 +947,15 @@ var L = {
917
947
  }
918
948
  }
919
949
  }, R = {
920
- en: () => import("./en-CyZH4Ct1.js"),
921
- ja: () => import("./ja-D-Nrtjk-.js"),
922
- de: () => import("./de-DXtmk-4H.js"),
923
- fr: () => import("./fr-vnizG3rD.js"),
924
- es: () => import("./es-BtRbHicT.js"),
925
- pt: () => import("./pt-CSsshr7u.js"),
926
- zh: () => import("./zh-BzrsqVN2.js"),
927
- ar: () => import("./ar-3hd6xh6U.js"),
928
- id: () => import("./id-Cf8yw8n_.js")
950
+ en: () => import("./en-hMF_prdm.js"),
951
+ ja: () => import("./ja-q1DilxZV.js"),
952
+ de: () => import("./de-DiqhMTJO.js"),
953
+ fr: () => import("./fr-BlRWQtSh.js"),
954
+ es: () => import("./es-RfbaViQj.js"),
955
+ pt: () => import("./pt-sB9letRc.js"),
956
+ zh: () => import("./zh-Dag8WCjt.js"),
957
+ ar: () => import("./ar-DBv_xFzj.js"),
958
+ id: () => import("./id-C0-e3Gwc.js")
929
959
  }, z = "__MEMI_BOARD_I18N__";
930
960
  function B() {
931
961
  let e = globalThis;
@@ -946,10 +976,10 @@ function V(e) {
946
976
  function H(e) {
947
977
  return e === "ko" ? Promise.resolve() : Promise.all([V(e), V("en")]).then(() => void 0);
948
978
  }
949
- function U(e) {
979
+ function he(e) {
950
980
  return !!B().messages[e];
951
981
  }
952
- function W(e, t) {
982
+ function U(e, t) {
953
983
  let n = e;
954
984
  for (let e of t.split(".")) {
955
985
  if (!n || typeof n == "string") return;
@@ -957,36 +987,36 @@ function W(e, t) {
957
987
  }
958
988
  return typeof n == "string" ? n : void 0;
959
989
  }
960
- function he(e, t) {
990
+ function ge(e, t) {
961
991
  return t ? e.replace(/\{(\w+)\}/g, (e, n) => {
962
992
  let r = t[n];
963
993
  return r == null ? e : String(r);
964
994
  }) : e;
965
995
  }
966
- function G(e, t, n) {
996
+ function W(e, t, n) {
967
997
  let r = B();
968
998
  r.version.value;
969
- let i = e ?? "ko", a = W(r.messages[i], t) ?? (i === "ko" ? void 0 : W(r.messages.en, t)) ?? W(r.messages.ko, t);
970
- return a == null ? t : he(a, n);
999
+ let i = e ?? "ko", a = U(r.messages[i], t) ?? (i === "ko" ? void 0 : U(r.messages.en, t)) ?? U(r.messages.ko, t);
1000
+ return a == null ? t : ge(a, n);
971
1001
  }
972
1002
  //#endregion
973
1003
  //#region src/utils/formatDate.ts
974
- function K(e) {
1004
+ function G(e) {
975
1005
  return I(e ?? "ko").intl;
976
1006
  }
977
- function q(e, t) {
978
- return e?.toDate ? e.toDate().toLocaleDateString(K(t)) : "";
1007
+ function K(e, t) {
1008
+ return e?.toDate ? e.toDate().toLocaleDateString(G(t)) : "";
979
1009
  }
980
- var ge = 60, J = 3600, _e = 24 * J;
981
- function Y(e, t = Date.now(), n) {
982
- if (!e?.toDate) return G(n, "common.date.justNow");
1010
+ var _e = 60, q = 3600, ve = 24 * q;
1011
+ function J(e, t = Date.now(), n) {
1012
+ if (!e?.toDate) return W(n, "common.date.justNow");
983
1013
  let r = Math.max(0, Math.round((t - e.toDate().getTime()) / 1e3));
984
- if (r < 45) return G(n, "common.date.fewSecondsAgo");
985
- let i = new Intl.RelativeTimeFormat(K(n), { numeric: "always" }), a = r / _e;
986
- return r < 90 ? i.format(-1, "minute") : r < 2700 ? i.format(-Math.round(r / ge), "minute") : r < 5400 ? i.format(-1, "hour") : r < 22 * J ? i.format(-Math.round(r / J), "hour") : r < 36 * J ? i.format(-1, "day") : a < 26 ? i.format(-Math.round(a), "day") : a < 46 ? i.format(-1, "month") : a < 320 ? i.format(-Math.round(a / 30.4), "month") : a < 548 ? i.format(-1, "year") : i.format(-Math.round(a / 365), "year");
1014
+ if (r < 45) return W(n, "common.date.fewSecondsAgo");
1015
+ let i = new Intl.RelativeTimeFormat(G(n), { numeric: "always" }), a = r / ve;
1016
+ return r < 90 ? i.format(-1, "minute") : r < 2700 ? i.format(-Math.round(r / _e), "minute") : r < 5400 ? i.format(-1, "hour") : r < 22 * q ? i.format(-Math.round(r / q), "hour") : r < 36 * q ? i.format(-1, "day") : a < 26 ? i.format(-Math.round(a), "day") : a < 46 ? i.format(-1, "month") : a < 320 ? i.format(-Math.round(a / 30.4), "month") : a < 548 ? i.format(-1, "year") : i.format(-Math.round(a / 365), "year");
987
1017
  }
988
- function X(e, t) {
989
- return e?.toDate ? new Intl.DateTimeFormat(K(t), {
1018
+ function Y(e, t) {
1019
+ return e?.toDate ? new Intl.DateTimeFormat(G(t), {
990
1020
  year: "numeric",
991
1021
  month: "long",
992
1022
  day: "numeric",
@@ -994,55 +1024,56 @@ function X(e, t) {
994
1024
  minute: "2-digit",
995
1025
  second: "2-digit",
996
1026
  hourCycle: "h23"
997
- }).format(e.toDate()) : G(t, "common.date.checking");
1027
+ }).format(e.toDate()) : W(t, "common.date.checking");
998
1028
  }
999
- function Z(e, t, n) {
1000
- let r = X(e, n), i = e?.toMillis?.(), a = t?.toMillis?.();
1001
- return a == null || i == null || i === a ? [r] : [G(n, "common.date.createdAt", { time: r }), G(n, "common.date.updatedAt", { time: X(t, n) })];
1029
+ function X(e, t, n) {
1030
+ let r = Y(e, n), i = e?.toMillis?.(), a = t?.toMillis?.();
1031
+ return a == null || i == null || i === a ? [r] : [W(n, "common.date.createdAt", { time: r }), W(n, "common.date.updatedAt", { time: Y(t, n) })];
1002
1032
  }
1003
1033
  //#endregion
1004
1034
  //#region src/i18n/useMemiBoardI18n.ts
1005
- var Q = "memiBoard:hostLocale", $ = Symbol("memiBoard:boardLocale");
1006
- function ve(o = {}) {
1007
- let s = n(), l = s ? r($, null) : null, u = s ? r(Q, null) : null, d = E(), f = e(D), p = e(O), m = e(() => f.value ? F(c(o.boardLocale)) ?? l?.value ?? F(c(u)) ?? F(d.locale) ?? "ko" : F(d.locale) ?? "ko");
1008
- o.boardLocale !== void 0 && s && a($, m), ee(m, (e) => void H(e), { immediate: !0 }), t() && i(() => H(m.value));
1009
- let h = e(() => I(m.value));
1035
+ var Z = "memiBoard:hostLocale", Q = Symbol("memiBoard:boardLocale");
1036
+ function ye(o = {}) {
1037
+ let s = n(), u = s ? r(Q, null) : null, d = s ? r(Z, null) : null, f = E(), p = e(D), m = e(O), h = e(() => p.value ? F(c(o.boardLocale)) ?? u?.value ?? F(c(d)) ?? F(f.locale) ?? "ko" : F(f.locale) ?? "ko");
1038
+ o.boardLocale !== void 0 && s && a(Q, h), l(h, (e) => void H(e), { immediate: !0 }), t() && i(() => H(h.value));
1039
+ let g = e(() => I(h.value));
1010
1040
  return {
1011
- locale: m,
1012
- i18nEnabled: f,
1013
- translationEnabled: p,
1014
- dir: e(() => h.value.dir),
1015
- intlLocale: e(() => h.value.intl),
1041
+ locale: h,
1042
+ i18nEnabled: p,
1043
+ translationEnabled: m,
1044
+ dir: e(() => g.value.dir),
1045
+ intlLocale: e(() => g.value.intl),
1016
1046
  t: (e, t) => {
1017
1047
  let n = e.startsWith("common.role.") ? e.slice(12) : "";
1018
- return d.roleLabels?.[n] ?? G(m.value, e, t);
1048
+ return f.roleLabels?.[n] ?? W(h.value, e, t);
1019
1049
  },
1020
- formatDate: (e) => q(e, m.value),
1021
- formatFullDate: (e) => X(e, m.value),
1022
- formatRelativeDate: (e, t) => Y(e, t, m.value),
1023
- formatTimestampDetails: (e, t) => Z(e, t, m.value),
1024
- formatNumber: (e) => e.toLocaleString(h.value.intl)
1050
+ formatDate: (e) => K(e, h.value),
1051
+ formatFullDate: (e) => Y(e, h.value),
1052
+ formatRelativeDate: (e, t) => J(e, t, h.value),
1053
+ formatTimestampDetails: (e, t) => X(e, t, h.value),
1054
+ formatNumber: (e) => e.toLocaleString(g.value.intl)
1025
1055
  };
1026
1056
  }
1027
1057
  //#endregion
1028
1058
  //#region src/utils/slugify.ts
1029
- function ye(e) {
1059
+ var be = 40;
1060
+ function xe(e) {
1030
1061
  return e.trim().replace(/\s+/g, "-").replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎㅏ-ㅣ-]/g, "").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
1031
1062
  }
1032
- function be(e, t = 60) {
1063
+ function Se(e, t = 60) {
1033
1064
  return e.replace(/[^a-zA-Z0-9가-힣ㄱ-ㅎ._-]/g, "-").slice(0, t);
1034
1065
  }
1035
1066
  //#endregion
1036
1067
  //#region src/utils/commentImages.ts
1037
- var xe = /* @__PURE__ */ new Set([
1068
+ var Ce = /* @__PURE__ */ new Set([
1038
1069
  "image/jpeg",
1039
1070
  "image/png",
1040
1071
  "image/gif",
1041
1072
  "image/webp"
1042
1073
  ]);
1043
- function Se(e) {
1074
+ function $(e) {
1044
1075
  let t = (e.type || "").toLowerCase();
1045
- if (xe.has(t)) return !0;
1076
+ if (Ce.has(t)) return !0;
1046
1077
  let n = e.name.toLowerCase();
1047
1078
  return [
1048
1079
  ".jpg",
@@ -1052,7 +1083,7 @@ function Se(e) {
1052
1083
  ".webp"
1053
1084
  ].some((e) => n.endsWith(e));
1054
1085
  }
1055
- function Ce(e) {
1086
+ function we(e) {
1056
1087
  if (!e?.length) return [];
1057
1088
  for (let t of e) if (t?.name && t.url?.startsWith("https://") && t.path && !t.path.includes("..") && t.type?.startsWith("image/") && !(!Number.isFinite(t.size) || t.size <= 0)) return [{
1058
1089
  name: t.name.slice(0, 200),
@@ -1063,7 +1094,7 @@ function Ce(e) {
1063
1094
  }];
1064
1095
  return [];
1065
1096
  }
1066
- function we(e, t) {
1097
+ function Te(e, t) {
1067
1098
  let n = t.endsWith("/") ? t : `${t}/`;
1068
1099
  if (!Array.isArray(e)) return [];
1069
1100
  let r = /* @__PURE__ */ new Set();
@@ -1075,6 +1106,6 @@ function we(e, t) {
1075
1106
  return [...r];
1076
1107
  }
1077
1108
  //#endregion
1078
- export { h as A, x as B, O as C, p as D, f as E, de as F, b as G, ne as H, le as I, se as J, ce as K, ie as L, fe as M, pe as N, d as O, ue as P, re as R, D as S, E as T, te as U, ae as V, C as W, v as X, _ as Y, y as Z, j as _, ye as a, k as b, q as c, Z as d, U as f, N as g, M as h, be as i, g as j, m as k, X as l, G as m, Se as n, Q as o, H as p, S as q, Ce as r, ve as s, we as t, Y as u, I as v, A as w, me as x, F as y, oe as z };
1109
+ export { h as A, S as B, D as C, p as D, E, le as F, fe as G, b as H, ue as I, C as J, ne as K, ce as L, _ as M, de as N, m as O, pe as P, te as Q, y as R, me as S, A as T, ie as U, x as V, re as W, v as X, oe as Y, ee as Z, N as _, Se as a, F as b, ye as c, J as d, X as f, M as g, W as h, be as i, g as j, f as k, K as l, H as m, $ as n, xe as o, he as p, se as q, we as r, Z as s, Te as t, Y as u, j as v, O as w, k as x, I as y, ae as z };
1079
1110
 
1080
- //# sourceMappingURL=commentImages-4IOk2u0O.js.map
1111
+ //# sourceMappingURL=commentImages-t4lu_hxD.js.map