آيات الأرقم
AyyatAlArqam
تَعَاهَدُوا الْقُرْآنَ
هذا العمل خالص لوجه الله. اللهم ثبتنا على ذلك. This work is purely for the sake of Allah
بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
كل ما تم تحديثه وإضافته في آيات الأرقم — منصة تتبع حفظ القرآن للعائلات والحلقات
عرض ١–٢٠ من أصل ٨٩ إصدار
Switched version numbering from the custom 4-digit `vA.B.C.D` scheme to standard semantic versioning. MAJOR is now reserved for breaking changes (architecture overhauls, data-invalidating migrations, removed features/routes), MINOR for backwards-compatible functionality, PATCH for backwards-compatible fixes. Old entries keep their 4-digit numbers — rewriting them would collide, since `v3.6.3.0` and `v3.6.3.1` are separate releases that both collapse to `3.6.3`. The `/releases` parser now accepts 3- and 4-segment versions and derives its gold/teal/muted tier badge from whichever scheme an entry uses.
AppHeader redesign. The bar carried 14 targets at roughly equal weight, so nothing read as primary. Now:
الأهداف: dropped the "العضو" selector from the add-goal form. `GoalsPanel` was written for a group context where an owner picks which member a goal belongs to, but the dashboard card is scoped to your own member — so the select held one real option that was already pre-selected, and its only usable interaction was choosing the blank entry, which disabled حفظ. Goals now always target the card's member. Removed the unused `goals.member` / `goals.selectMember` keys from both locales.
الأهداف: "إضافة هدف" is a real button now — solid teal pill (`bg-[#0D5466]`, `rounded-xl`, white text, `hover:bg-[#619B8A]`) instead of bare teal text, matching the راجِع button in the review card.
Surah Reader: the back control moved from the right edge of the header to the left. It was first in the RTL flex row; it's now last, after the قائمة/مصحف toggle and the محفوظ chip.
Dashboard audit and cleanup, eight fixes in one pass.
Height-matching slack is now shared across rows instead of pooling under the last one: in both آخر نشاطاتي and أحفظها الآن the row list is `flex-1 flex flex-col` and each row `flex-1`, so the shorter card's rows grow evenly to fill the height set by its taller neighbour and the pagination footer sits on the card's bottom edge.
Fix آخر نشاطاتي / أحفظها الآن height mismatch: v3.6.3.0 put `items-start` on the two-column row so a collapsed card wouldn't stretch, which also stopped expanded cards from matching heights. The row is back to the default stretch alignment and `CollapsibleCard` sets `self-start` on itself only while collapsed — expanded cards line up, collapsed ones still shrink to their header.
Dashboard cards collapse: clicking the title bar of توزيع الجودة، آخر نشاطاتي، or أحفظها الآن folds the card down to its header, with a chevron that rotates to show the state. New shared `CollapsibleCard` component; collapsed ids persist in one `dashboardCollapsedCards` localStorage entry, read through `useSyncExternalStore` (server snapshot = open) so the state survives reloads without an SSR/hydration mismatch. The two-column row uses `items-start` so a collapsed card shrinks instead of stretching to match its neighbour.
Dashboard: "أحفظها الآن" consolidated into the surah grid view. The 🔧 قريباً placeholder beside آخر نشاطاتي is replaced by a full أحفظها الآن panel (surah number tile, name, ayah count, quality-colored progress bar and percentage, 5 per page with السابق/التالي), styled to match the activity card. The old compact أحفظها الآن card in the stats row is gone — توزيع الجودة now spans the full width. The حفظي view is removed entirely: its toolbar button, the mobile bottom-tab entry, the SecondaryNav link, and the `?view=memorization` route value; the empty "مراجعة اليوم — قريباً" placeholder that lived in that view is dropped. `?view=memorization` now falls back to the grid view. The two-column row above the surah filter stacks on screens under `md` so surah names no longer truncate on mobile.
Mushaf view now uses real Madani page boundaries: new bundled `lib/quran/pages.json` (4.6 KB, 604 page-start markers sourced from alquran.cloud meta, validated against the bundled Quran text) replaces the ~550-char approximate pagination. Each page card shows exactly the ayahs that sit on that page of the printed Madani mushaf, with the real page number (١–٦٠٤) at the bottom; the page indicator shows real mushaf page numbers too (صفحة/الصفحتان … من المصحف). First/last pages of a surah shared with neighboring surahs show only this surah's portion. Verified: الفاتحة ص١، البقرة ص٢–٤٩، الكهف ص٢٩٣–٣٠٤، يس ص٤٤٠–٤٤٥، الإخلاص والناس ص٦٠٤.
Surah Reader mushaf view: new view toggle in the reader header (قائمة / مصحف), persisted in localStorage. Mushaf mode renders the surah as facing pages — two side-by-side on desktop, one page on mobile — each in a cream page card with a double gold frame, ayahs flowing inline with gold circled ayah-number medallions and the page number at the bottom, plus السابق/التالي page-flip buttons with a locale-aware page indicator. Tapping an ayah still selects the memorization position (selected = teal highlight, memorized = mint), and opening mushaf mode jumps to the spread containing the selected or first unmemorized ayah. Pages are split by text amount (~550 chars/page, never mid-ayah) since the bundled Quran JSON has no Madani page boundaries — true 604-page mushaf layout would need an ayah→page dataset (possible future enhancement). List view unchanged.
Guide page redesign (/guide): dark teal hero matching the site style (Bismillah, gold eyebrow, subtitle, stat chips: ١٢ قسماً / ٥٣ خطوة / ٨ نصائح) with the faded logo watermark and gradient accent line; sticky sidebar table of contents on desktop (two-column grid block on mobile); section cards refreshed (icon tile, step-count chip, locale-aware Arabic-Indic numerals). Content rewritten in both locales from 8 sections/32 steps to 12 sections/53 steps, documenting everything shipped since the original guide: dashboard 3-panel layout and mobile tabs, group metadata + public groups, co-owners, ownership transfer, soft-delete, add member by profile code, surah reader, ختمة السورة counter, message tabs with push notifications, profile code + public profile + role upgrades + notification preferences, group discovery page with filters, and 3-way compare. Tips expanded 6 → 8 (notifications, PWA/offline).
Push notifications complete (web): group-message notifications + goal/review reminders + per-type preferences. Group message sends now go through new `POST /api/group-messages` — it stamps `author_id` (fixing a silent bug where every message insert failed the NOT NULL constraint and the messages feature stored nothing) and push-notifies the whole group (owner, co-owners, linked members) minus the sender; admin announcements and member messages are separate notification types, urgent announcements marked 🔴. Daily cron gains goal-deadline warnings (fires at exactly 3 days and 1 day before `goals.deadline`; sent to the member's linked users, else the group owner) and a review-due digest (count of `review_schedule` rows past `next_review_at`, per linked user, Arabic count grammar). New `profiles.notification_prefs` JSONB column (missing key = enabled) with six per-type toggles (daily reminder, inactivity nudge, goal deadline, review due, admin announcements, member messages) editable in the profile التنبيهات card while notifications are on. Remaining on roadmap: per-user reminder time, native mobile push.
Fix mobile input zoom: iOS Safari auto-zooms into focused form fields with font-size under 16px, leaving the page zoomed-in. Global CSS rule now forces 16px on input/select/textarea on screens under 768px, removing the zoom trigger without disabling pinch-zoom (accessibility-safe, unlike the maximum-scale viewport hack).
Push Notifications (web PWA): full Web Push infrastructure. New `push_subscriptions` table (RLS: users manage own rows); VAPID keypair (env: `NEXT_PUBLIC_VAPID_PUBLIC_KEY`, `VAPID_PRIVATE_KEY`, `VAPID_SUBJECT`); service worker `push` + `notificationclick` handlers (RTL Arabic notifications, click focuses/opens the app); opt-in "التنبيهات" toggle card on the profile page (`NotificationsPanel`, handles unsupported/blocked states); `POST/DELETE /api/push/subscribe` stores/removes the browser subscription; `lib/push.ts` server sender (`web-push`, prunes dead 404/410 subscriptions); daily Vercel Cron at 14:00 UTC (`/api/cron/push`, guarded by `CRON_SECRET`) sends the daily reminder to active subscribers and a one-shot inactivity nudge to users last seen 2–3 days ago. Remaining types (goal deadline, review due, group messages) and per-user preferences stay on the roadmap.
PWA improvements: offline fallback page at `/offline` (precached at service worker install; shown with an Arabic "no connection" message and retry button when a navigation fails offline, instead of the browser error screen); service worker bumped to `ayyat-v8` with online navigation behavior unchanged (network passthrough); manifest gains `id`, `categories`, and three home-screen shortcuts (لوحة التحكم، البحث عن مجموعات، ما الجديد؟); service worker registration now uses `updateViaCache: 'none'` and re-checks for updates when the app returns to the foreground (throttled to once per hour) so installed PWAs pick up new deploys without a full navigation; `themeColor` moved from `metadata` to the Next.js 16 `viewport` export.
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.
اللَّهُمَّ صَلِّ عَلَى نَبِيِّنَا مُحَمَّدٍ