Commit Graph
107 Commits
Author SHA1 Message Date
moh dc21c33867 ADDED - Admin SEO page, robots/sitemap hardening and media/maintenance security fixes
SEO
- New Settings > SEO admin page (seo_settings in app_config): indexing switch,
  Google/Bing verification, X handle, JSON-LD identity (Person/Organization,
  sameAs), per-locale keywords, readiness checklist and open links for
  sitemap.xml / robots.txt / manifest.
- robots.txt is now dynamic: disallows admin, api, success and coming-soon
  paths; blocks everything while indexing is off or maintenance is on.
- sitemap.xml carries hreflang alternates per URL, lists only categories with
  published projects, and is empty while hidden.
- Metadata: robots + verification meta, og:locale in de_DE/en_US/ar_AR form,
  alternateLocale, twitter site/creator, project cover as OG image with
  article type, noindex on /success and /coming-soon.
- JSON-LD: WebSite + publisher graph on all public pages, CreativeWork per
  project (view-mode independent).

Security
- Maintenance bypass now requires a correctly signed admin cookie; the
  middleware previously only checked the cookie existed. Token helpers moved
  to lib/admin-session-token.ts (shared by proxy.ts and lib/admin-auth.ts).
- Media uploads: magic-byte validation against the declared type, SVG
  sanitization (script/handlers/foreignObject/javascript: rejected), upload
  folder sanitized, kind inferred from the real file.
- Media route: fixed prefix-based path check that accepted sibling
  directories, unknown extensions return 404, nosniff header, CSP sandbox on
  SVG, gif content type added.
- External media URLs: protocol-relative (//host) URLs rejected.

Portfolio
- Project and category slugs share /portfolio/[slug]; saving now rejects a
  slug already used on the other side instead of silently shadowing it.

Tooling/docs
- Lint: ignore scripts/legacy-prisma-seed.cjs, drop unused import.
- New docs/SEO.md; FEATURES, ARCHITECTURE (Drizzle instead of Prisma), admin
  spec and CLAUDE.md updated.
- Tests for all of the above (unit + integration); suite green.
2026-09-20 21:36:16 +02:00
moh 9fd928cce6 REMOVED - Trim home page: drop projects/capabilities/process, full-bleed tools marquee
- Remove the Selected Projects, Capabilities and Process sections from the
  home page (placeholder-heavy content).
- Take the tools marquee out of its card and let it span the full site width
  (full-bleed band) instead.
2026-09-20 20:31:35 +02:00
moh 1e211c1201 REVERTED - Remove macOS shell window; restore full-bleed content 2026-09-20 20:17:33 +02:00
moh 2fc0641512 ADDED - Frame site content in a macOS-style shell window on an ambient desktop
- Wrap #smooth-wrapper in an .app-shell: a fixed, inset, rounded, bordered
  panel. Its transform makes it the containing block for the fixed wrapper, so
  ScrollSmoother sizes the scroll viewport to the shell (content scrolls inside
  it) without fighting ScrollSmoother's inline styles.
- Dock and corner controls stay outside the shell, on a brand-tinted 'desktop'
  wallpaper painted on body.
- Reduced-motion path: the shell scrolls its content natively.
2026-09-20 20:16:49 +02:00
MOH 31dc72b1c8 fix
CI / quality (push) Canceled after 0s
2026-09-20 20:04:48 +02:00
MOH 10600b48c4 WIP - save all current changes 2026-09-20 20:04:48 +02:00
moh a628b69133 FIXED - Move page transition from template to persistent layout so it animates
CI / quality (push) Canceled after 0s
A template.tsx is re-created on every navigation, resetting AnimatePresence
so neither enter nor exit ran. Move the transition into a PageTransition
client component rendered in the persistent (site) layout, so AnimatePresence
survives navigations and the old page animates out before the new one in.
2026-09-20 19:55:13 +02:00
moh 4df0d9ae86 IMPROVED - Add page exit animation via frozen-router AnimatePresence
CI / quality (push) Canceled after 0s
Wrap the template in AnimatePresence (mode="wait") with a FrozenRouter that
pins the layout-router context, so the outgoing page animates out (blur +
rise) before the incoming page animates in.
2026-09-20 19:50:46 +02:00
moh 5c10bce740 IMPROVED - Replace per-title hero entrance with a unified page transition
- Add (site)/template.tsx: one framer-motion enter animation (fade + rise +
  blur) that runs on every navigation, so moving between dock pages has a
  clean transition.
- Disable the staggered .hero-rise entrance now that the template handles it.
2026-09-20 19:46:58 +02:00
moh ac8746a287 IMPROVED - Use swappable image icons and move controls to a corner dock
- Dock icons are now real SVG files under public/dock/ (macOS squircle
  look, active variants), so they can be replaced with custom art later.
- Full-bleed icons (DockIcon padding 0), fixed logo src to stop the
  refresh flash.
- Remove the top menu bar entirely; relocate theme/language/sound (+admin)
  into a corner control dock that expands on click.
2026-09-20 19:12:44 +02:00
moh 6c213699a2 ADDED - Replace site header menu with macOS menu bar and Magic UI dock
Swap the pill navigation for a macOS-style dock as the primary nav and a
slim top menu bar for utilities:

- components/ui/dock.tsx: Magic UI Dock/DockIcon (magnification via
  useSpring/useTransform), ported to the project's framer-motion.
- components/layout/site-dock.tsx: bottom dock with the logo as the first
  icon, each item a real next/link (SEO preserved, active state from the
  pathname), monochrome squircle tiles, hover tooltips and a "soon" badge
  for Products; top menu bar keeps locale/sound/theme/admin + a live clock.
- (site)/layout.tsx: render SiteDock instead of SiteHeader.

Home bento grid and all page content are unchanged.
2026-09-20 18:56:46 +02:00
moh 3f96abc60f REFACTORED - Flatten portfolio category routes to /portfolio/[slug]
Merge the category and project routes under a single /portfolio/[slug]
segment via resolvePortfolioSlug (category wins over project on a slug
clash). Removes the /portfolio/category/... prefix from links, redirect,
and sitemap. Adds resolver integration tests.
2026-09-20 18:53:48 +02:00
moh 5b019052b1 STYLED - Add CSS hero entrance, title halo, and scroll cue
Replace the framer-motion hero entrance with pure-CSS staggered animations so
the hero is painted immediately instead of flashing blank until hydration.
Add a focused brand glow behind the hero title and an animated scroll cue at
the bottom of the home hero. Entrance and cue respect prefers-reduced-motion.
2026-09-20 18:53:48 +02:00
moh bb9f1a2f6e STYLED - Add a layered ambient backdrop behind all heroes
Replace the flat, empty hero background with a pure-CSS layered backdrop:
faded grid, brand glow, drifting brand orbs, grain, and a bottom fade that
blends the hero into page content. Applies to both the home hero and the
compact page heroes via HeroMotionBackdrop; respects prefers-reduced-motion.
2026-09-20 18:53:48 +02:00
moh d1245204f1 STYLED - Roll out the layered card system to the admin workspace
The double-layer AppCard look showcased in the UI Kit was only applied on
the public frontend; every admin surface was pinned to layer=single and
stayed flat. Convert the admin section/container cards to the default
layered look, keeping compact metric tiles, toolbars, image tiles and
nested leaf cards single.

Add AppCard contentClassName so content utilities (space-y-*, grid, flex)
keep applying to the inner shell after the switch to double layer.
2026-09-20 17:01:20 +02:00
moh 4b535694bc ADDED - Save an unfinished project as a draft
- Add a Save as draft button that bypasses the completeness gate: the user
  can save partial work and finish later
- projectDraftInputSchema makes the user-facing copy (title, summary, service
  label, client) optional; the action auto-generates a slug from the title
  (or draft-<timestamp>), defaults the year to the current year, and forces
  the project unpublished
- Drafts drop not-yet-valid sections/assets instead of failing the save
- Pass intent via a hidden field set on click so the server reliably sees it
- Tests: draft schema accepts empty copy a strict save rejects, and still
  requires a slug and a valid year
2026-09-20 16:52:13 +02:00
moh 39e459fa09 REVERTED - Drop body suppressHydrationWarning
- The hydration warning came from a browser extension, not the app; handling
  it at the extension level instead of masking it in the layout
2026-09-20 16:44:03 +02:00
moh 80b1365ebc FIXED - Suppress body hydration warning from browser extensions
- Browser extensions (e.g. ColorZilla's cz-shortcut-listen) inject attributes
  on <body> before React hydrates, causing a benign hydration mismatch warning
- Add suppressHydrationWarning to <body>, matching the existing <html>
2026-09-20 16:42:58 +02:00
Moh b2b90bd1bf STYLED - Trim coming-soon to title + countdown
CI / quality (push) Canceled after 0s
- Remove the status badge, kicker, and description texts
- Keep only the title and the countdown (all locales)
2026-08-08 03:48:19 +02:00
Moh aadc93e870 STYLED - Simplify closed coming-soon page
CI / quality (push) Canceled after 0s
- Remove CTA buttons (site is closed, no navigation)
- Drop the card wrapper: content sits on the page background, gradient included
- Remove the launch label; keep the countdown
- Fit the viewport (no scroll)
2026-08-08 03:34:02 +02:00
MOH 0a5f77d8de REFACTORED - migrate the data layer from Prisma to Drizzle (unify the stack)
- Add lib/db (Drizzle schema: 7 tables + 6 enums + relations, postgres.js client),
  drizzle.config.ts, lib/db/enums.ts (Prisma-compatible enum objects)
- Rewrite all 14 app consumers + 4 admin components to Drizzle
- Move the test DB layer to Drizzle + in-process PGlite; convert all 8 integration
  test files + factories (371 tests green)
- Remove Prisma: deps, prisma/ schema+migrations, lib/prisma.ts, Dockerfile prisma
  generate; wire db:generate/migrate/push/studio to drizzle-kit; update Makefile
- Preserve the old seed as scripts/legacy-prisma-seed.cjs (needs a Drizzle rewrite)
2026-08-07 14:18:41 +02:00
MOH 777dcbab7b update 2026-08-06 02:27:49 +02:00
MohFarawati dd72f013d4 feat(home): hero availability status and CTAs
The homepage hero had no call to action (Phase 0 finding). Add a live
availability pill and primary/secondary CTAs while keeping the signature title.

- HomeHero: optional availability status pill (pulsing dot) plus primary
  (view work) and secondary (contact) CTAs, RTL-aware arrow, using the type
  scale. Backward compatible (all new props optional).
- Wire copy + hrefs from the homepage; add heroVisual.primaryCta /
  secondaryCta to en/de/ar.

Verified: JSON valid, eslint clean, no new type errors.
2026-07-14 22:23:54 +02:00
MohFarawati 86243b79c2 feat(portfolio): real project-detail hero, no wasted space
The detail page rendered an empty <PageHero /> (blank gradient band) with the
real title buried in a card lower down (Phase 0 finding).

- Populate the detail PageHero with the project category (badge), title and
  summary, so the top of the page is a proper header.
- Slim the in-content ProjectHeader to back-link + meta chips + preview button,
  removing the now-duplicated title and summary. Applies across all three
  detail templates (grid/story/case-study).

Verified: eslint clean, no new type errors.
2026-07-14 22:20:47 +02:00
MohFarawati 4892f27006 feat(home): image-led featured projects section
Bring imagery to the homepage projects block (Phase 3), matching the portfolio
gallery.

- Thread coverImagePath through ProjectCardCopy and the home mapping.
- Rewrite ProjectsSection as image-first cards (reusing PortfolioCover with the
  branded placeholder fallback): whole-card link, featured project spans two
  columns with a larger cover, type-scale title, meta + stack badges, hover
  lift. Replaces the previous text-only cards.

Verified: eslint clean; no new type errors (pre-existing Prisma-gen anys only).
2026-07-14 22:19:05 +02:00
MohFarawati dcffa87be7 feat(design-system): add type scale, spacing rhythm and font tokens
Apply the Phase 2 warm-premium base additively (no existing page changes):
- tailwind.config.ts: add fontSize roles (display, h1, h2, h3, title, body-lg,
  body, small, caption, overline) with line-height/tracking/weight; add
  fontFamily (sans/latin = Museo, arabic = Dubai); add section-sm/section-lg
  spacing rhythm.
- globals.css: add Arabic-safe .eyebrow utility (uppercase + tracking on Latin,
  neutralised for html[lang="ar"]).

Colors and fonts unchanged. Verified: tsc clean, eslint clean, tailwind build
generates the new utilities with correct values.
2026-07-14 22:08:34 +02:00
MohFarawati b8a02f9e90 feat(coming-soon): premium themed redesign with launch countdown
CI / quality (push) Waiting to run
Full refactor of the maintenance/coming-soon page for all locales (de/en/ar,
RTL-aware) with a refined, theme-aware (light + dark) premium composition:
glass panel, live status indicator, hero title, description, launch countdown
and CTAs. Reuses the existing hero/motion system; no new dependencies.

- Add components/site/launch-countdown.tsx: hydration-safe client countdown
  (days/hours/minutes/seconds), localized labels, Arabic-aware typography,
  "launched" fallback when the target passes.
- Rewrite app/[locale]/coming-soon/page.tsx around the countdown and a single
  easy-to-edit LAUNCH_DATE_ISO constant (default ~45 days out).
- Add comingSoon i18n keys (status, countdownLabel, unit labels, launched)
  to en/de/ar.
2026-07-14 21:20:29 +02:00
MohFarawati d48497b992 refactor: drop toast + over-engineered extras, add inline admin feedback
CI / quality (push) Waiting to run
Phase 1 cleanup of the personal-site revamp. Backend/architecture untouched;
changes are limited to removing unused complexity and restoring feedback.

Removals
- Toast system: delete react-hot-toast, Toaster, QueryToastBridge, lib/toast,
  the toggle/easter-egg calls, related i18n keys and the dependency.
- Contact protection: remove Turnstile + per-IP rate limiting
  (lib/contact-guard, lib/contact-protection, admin screen, form widget,
  app-config wiring, nav entry, test).
- Speculative specs: delete orders, products, downloads, project-inquiry.

Inline feedback (replaces toast, no new deps)
- Add lib/admin-feedback (withFlash/readFlash) and components/admin/admin-flash,
  rendered centrally by AdminDashboardShell.
- Emit success/error messages for media, site-settings, portfolio, smtp,
  marquee and maintenance actions; pages read them via searchParams.
- Contact form shows validation/delivery errors inline; success still
  redirects to /success.

Docs
- Fix stale paths in frontend-system-* (components/root -> components/admin,
  lib/root-navigation -> lib/admin-navigation, drop phantom src/) and remove
  contact-protection references from docs and CLAUDE.md.
- Add docs/PHASE0_DIAGNOSIS.md (diagnosis report).

Note: proxy.ts self-fetch kept intentionally; it also drives maintenance mode.
2026-07-14 21:03:51 +02:00
MOH 1a7b3397f6 last update
CI / quality (push) Waiting to run
2026-07-14 20:10:38 +02:00
MOH 4e8056cd04 Improve coming soon page 2026-05-12 09:16:00 +02:00
MOHandClaude Sonnet 4.6 868eb80374 Simplify hero backgrounds and add entrance animations
- Replace animated blob/wave/noise backdrop with clean static gradient
  (radial ellipse highlights + linear fade) in hero-motion-backdrop
- Remove all framer-motion from background layer; delete unused CSS
  classes: hero-blob, hero-sheet-glow, hero-sheet-wave, hero-sheet-noise,
  hero-title-shift keyframe, and responsive blob media queries
- Add framer-motion stagger entrance to HeroContentMotion, HeroMotionItem,
  and HeroTitle (slide-up + fade on mount)
- Refactor coming-soon page to use HeroContentMotion/HeroMotionItem
  instead of MotionFade (whileInView unreliable above the fold)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 22:48:51 +01:00
MOH cf957cbbe2 Refine homepage and restore hero 2026-03-15 18:26:31 +01:00
MOH 6caf723695 refine admin cards and form headers
CI / quality (push) Has been cancelled
2026-03-15 08:59:19 +01:00
MOH 623b492787 Remove locale debugging logs
CI / quality (push) Waiting to run
2026-03-15 08:36:43 +01:00
MOH 4da093bb24 Add runtime locale diagnostics
CI / quality (push) Waiting to run
2026-03-15 08:30:10 +01:00
MOH 1cd907b2fb Add logging for site localization saves
CI / quality (push) Waiting to run
2026-03-15 08:26:46 +01:00
MOH 288e4b37d7 Fix request locale resolution in site pages
CI / quality (push) Waiting to run
2026-03-15 08:20:39 +01:00
MOH c18128c965 Fix runtime default locale resolution
CI / quality (push) Waiting to run
2026-03-15 06:02:27 +01:00
MOH 9b8409a7d3 Fix toaster locale crash
CI / quality (push) Waiting to run
2026-03-15 05:29:44 +01:00
MOH 060d48f9c4 Fix dynamic locale fallback resolution
CI / quality (push) Waiting to run
2026-03-15 05:27:19 +01:00
MOH dfed5ec831 Fix coming soon locale caching
CI / quality (push) Waiting to run
2026-03-15 04:46:44 +01:00
MOH 364f761420 Fix dynamic default locale routing 2026-03-15 04:41:08 +01:00
MOH 50c3f5cce9 Fix maintenance redirects and admin host detection 2026-03-15 04:33:07 +01:00
MOH 5d3f77962a Add admin site settings sections and locale defaults 2026-03-15 04:06:33 +01:00
MOH 3e9edc5873 chore: save current workspace changes 2026-03-14 15:57:33 +01:00
MOH 35734bd2d9 Remove admin entrypoints from public site
CI / quality (push) Has been cancelled
2026-03-13 17:53:01 +01:00
MOH fef44ded80 Add dedicated local admin domain routing 2026-03-13 17:48:45 +01:00
MOH db897e22bf Refactor admin area and remove legacy root paths
CI / quality (push) Waiting to run
2026-03-13 16:14:04 +01:00
MOH e32ac4cacb Upgrade app to Next.js 16
CI / quality (push) Waiting to run
2026-03-13 15:50:37 +01:00
MOH f14116b56c Fix internal admin route for subdomain
CI / quality (push) Has been cancelled
2026-03-12 00:24:08 +01:00