Extracts Q/A pairs from the post body (an <h3> ending in the Persian
question mark ؟ followed by the next <p>) and emits FAQPage JSON-LD in
<head>. Makes posts with FAQ sections eligible for FAQ rich results in
Google. Non-question <h3> headings are ignored.
Verified: post with 3 h3s emits exactly 2 Question entries (the plain
heading excluded), valid escaped JSON.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Blog list (/blog): add robots, full Open Graph + Twitter, Blog +
BreadcrumbList JSON-LD, per-page self-canonical, and rel=prev/next for
paginated pages.
Blog post: add robots, og:site_name, article:published_time /
modified_time / author / section, twitter:image, og:image:alt, and a
BreadcrumbList JSON-LD (Home → Blog → Category → Post).
Gallery (/gallery): add robots, full OG + Twitter (with first image as
og:image), ImageGallery + BreadcrumbList JSON-LD.
Encoding: register HtmlEncoder.Create(UnicodeRanges.All) so Persian text
in meta tags and JSON-LD renders literally instead of &#xXXXX; entities
(smaller, cleaner output; friendlier to SEO validators).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add UseExceptionHandler(/error) so unhandled exceptions return a
proper HTML 500 instead of a raw response Googlebot was logging as
a server error in Search Console.
Replace manual quote-only escaping in blog JSON-LD with a J() helper
that uses JsonSerializer so newlines, backslashes, and all other
control characters are safely escaped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Editor: new 🎠 اسلایدر toolbar button — pick multiple images (min 2),
uploads them all, inserts a <div class="post-carousel" data-carousel>
block at the cursor. Editor preview shows a tidy filmstrip with the
non-functional arrows/dots hidden.
Public post page: carousel CSS (scroll-snap track) + JS that wires up
prev/next arrows, clickable dots, and native touch swipe. Single-image
blocks auto-collapse their controls.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Homepage gallery:
- Show only 3 before/after samples as a teaser (was: all items)
- Add "مشاهده گالری کامل (N نمونه)" CTA when more than 3 exist
- Remove the now-pointless category tabs from the teaser
New /gallery page:
- Full before/after grid with category filter tabs (deduped from data)
- Responsive cards with قبل/بعد labels + captions, empty state
- Added to sitemap.xml (priority 0.8)
Blog content editor:
- New 🖼 تصویر toolbar button inserts an uploaded image at the cursor
(direct upload, no forced crop) — for richer post bodies
- Responsive img styling on the public post page
Note: the filler-lab-soorat cover not showing is a data issue — that
post has an empty featuredImage in the DB (verified); re-upload + save
fixes it. The upload/save path itself is correct.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add UseForwardedHeaders middleware so Request.Scheme = "https" behind nginx
- Add SITE_BASE_URL env var fallback for sitemap.xml, robots.txt, and all
Razor page canonical/og URLs — set it to https://draletaha.ir in .env
- Add og:image to homepage using hero photo
- Add SITE_BASE_URL to docker-compose.yml environment block
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Post.cshtml.cs: load hero image, tag from SiteSettings in SetViewDataAsync
- Post.cshtml: show <img> with hero image in .doc-avatar when set,
fall back to emoji only if no image is configured
- .doc-avatar: circular crop with object-fit:cover, gold border
- doc-title now uses HeroTag from settings (not hardcoded)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>