آيات الأرقم
AyyatAlArqam
تَعَاهَدُوا الْقُرْآنَ
هذا العمل خالص لوجه الله. اللهم ثبتنا على ذلك. This work is purely for the sake of Allah
بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
كل ما تم تحديثه وإضافته في آيات الأرقم — منصة تتبع حفظ القرآن للعائلات والحلقات
عرض ١–٢٠ من أصل ٧٢ إصدار
Fix mobile burger menu: replaced the small absolute dropdown with a full-screen fixed overlay on mobile. Added a sticky logo + close button header at the top of the mobile menu. Body scroll is locked while the menu is open. Desktop dropdown behavior unchanged.
Admin Panel Redesign: full RTL Arabic redesign of the admin panel. New sticky sidebar (248px) with brand logo, nav icons, and admin user card. New top bar with page title, system status indicator, and site link. Overview page rebuilt with KPI hero cards (animated glow blobs, monthly delta badges), platform health panel (DAU/WAU/MAU chips, SVG line+bar charts for signups and ayahs), Surah popularity panel (top/bottom toggle with progress bars), recent users table (searchable). Users page rebuilt with stat strip, filter tabs, sortable columns, ayahs memorized mini-bar, role badges, Arabic relative time, and pagination. Groups page rebuilt with stat strip, grid/list view toggle, group cards (avatar stack, progress bar, level chip, family badge), list table, and deleted groups section. All settings panels rewritten with shared components (PanelShell, Field, SaveRow). All inline styles using brand color system — no Tailwind gray classes.
Inactivity Return Message (رسالة العودة): dismissable modal shown on dashboard when a user returns after 2+ days away. Three tiers: gentle nudge after 2 days (5 messages), firmer push after 5 days (5 messages), scripture-backed emotional appeal after 7+ days (10 messages). Message picked randomly per tier. Dismissed once per calendar day per tier via localStorage. `last_seen_at` added to the dashboard profile query.
Releases page: Arabic numerals, 20 entries per page with الإصدارات الأحدث / الإصدارات الأقدم pagination buttons.
Release Notes page (/releases): public timeline of all version entries parsed from version.md at request time; gold badges for major, teal for minor, muted for patch; dark teal hero matching site style; "ما الجديد؟" link added to AppFooter nav.
Swap أحفظها الآن pagination arrows
SecondaryNav: user name now links to /dashboard instead of /profile
Fix أحفظها الآن card on mobile: row-2 grid in StatsView now uses `grid-cols-1 lg:grid-cols-4` so the card takes full width on small screens instead of being squashed to 25% of the viewport.
آخر نشاطاتي box now shows the exact date (day, month, year) below the relative time on each activity row.
Admin user deletion now handles owned groups before deleting the account. The admin is shown each group the user owns with two options per group: transfer ownership to a chosen co-owner, or soft-delete the group (members keep their data). Soft-deleted groups are reassigned to the performing admin's account so they survive the FK cascade and real members still see the "محذوفة" card. The user is also silently removed from any co-owner roles. If the user owns no groups, a simple confirm proceeds directly. New API route `GET /api/admin/users/[id]/groups` returns owned groups with co-owners. `DELETE /api/admin/users/[id]` now accepts a `groupDecisions` payload. New `DeleteUserModal` component used in both the users list and the user detail page.
Group Soft-Delete: deleting a group is now a soft-delete with smart member handling. Before confirming deletion, the owner is offered an instant transfer to any co-owner (if the group has co-owners). On confirmed delete: fake members (no real account) are hard-deleted with all their data; real-account members keep their data and see the group marked as "محذوفة" in their dashboard with the deletion date and an "إزالة من القائمة" button. Pending member invites and transfer requests are cancelled on deletion. The delete button now calls `/api/delete-group` (POST) — admin uses service_role for all operations. Admin panel groups page now shows a separate "Deleted Groups" table with owner, deletion date, real member count, and manual member count.
Group Ownership Transfer: primary group owners can now initiate a transfer of ownership to another user via their profile code from the Edit Group modal (نقل الملكية section). The sender optionally keeps themselves as a co-owner after transfer. The transfer is a two-step flow: sender creates a pending request (7-day expiry), recipient accepts or rejects from a new "طلبات نقل الملكية" section on their profile page. On acceptance: `groups.owner_id` is updated, the new owner is removed from `group_owners` if they were a co-owner, and the old owner is optionally inserted as a co-owner. New `group_transfer_requests` table with RLS; API routes at `/api/transfer-group-ownership` (GET pending / POST create) and `/api/transfer-group-ownership/[id]` (PATCH accept/reject/cancel).
Group Co-Ownership: group owners can now invite co-owners by profile code from the Edit Group modal (المشرفون المشتركون section). Co-owners get full management access (members, progress, invites, messages, group settings) except they cannot delete the group. New `group_owners` table; `current_user_owns_group()` updated to include co-owners; all ownership-gated RLS policies now use the helper. Co-owned groups appear in the dashboard with a "مشرف مشارك" badge. API route at `/api/group-coowners` (GET list + POST add by profile code); removal is direct client-side via RLS.
Member add/edit forms now use the same EmojiPicker component as groups (popover grid of 50 emojis + custom input), replacing the old flat inline grid. EmojiPicker extracted to a shared component at components/ui/EmojiPicker.tsx.
Groups tab: group cards now show metadata chips (location, family flag, age group, level, type tags, schedule) below the description; group detail view replaces the plain description line with a styled info card showing all metadata as teal/gold chips.
Group modals UX improvements: emoji field replaced with a picker (grid of 30 preset emojis + custom input); info tooltip added beside the "مجموعة عامة" toggle explaining public visibility; info tooltip added beside the "أضف نفسي كعضو" toggle explaining its purpose. Both create and edit modals updated.
Create group modal now includes the "معلومات المجموعة (اختياري)" section (country, city, schedule, age group, level, group type tags, family group toggle) matching the edit group modal. Both modals are now scrollable for small screens.
Fix login: server action + captcha instant render. `signInWithPassword` moved to a Server Action (`actions.ts`) so Supabase sets the session cookie in the HTTP response before the redirect, eliminating the middleware bounce-back-to-login bug. MathCaptcha switched from `useState(null)` + `useEffect` to `useState(() => makeNums())` so the math question renders immediately with no "..."/`؟` flash. PWA splash screen updated to show both "آيات الأرقم" and "AyyatAlArqam" labels.
Group Rich Profiles: added 7 nullable metadata columns to the `groups` table (country, city, schedule, age_group, level, group_type[], is_family_group). EditGroupModal gains a "معلومات المجموعة" section with inputs for all new fields. Group public profile page (`/groups/[slug]`) displays metadata as teal chips (family flag, age group, level, type tags, location) and a schedule line. Groups search page (`/groups`) adds three filter dropdowns (age group, level, type) that narrow the live results.
SEO: Arabic keyword optimization across all public pages. Wove target keywords (تتبع حفظ القرآن، برنامج تحفيظ القرآن، حلقات التحفيظ، متابعة حفظ القرآن، العائلات والحلقات) naturally into meta descriptions, OG descriptions, and the landing page hero text (ar.json). Updated root layout, about, guide, groups, compare, and login pages.
اللَّهُمَّ صَلِّ عَلَى نَبِيِّنَا مُحَمَّدٍ