{
  "version": 3,
  "sources": ["src/app/core/services/seo.service.ts", "src/app/pages/blog/pages/blog-detail/blog-detail.component.ts", "src/app/pages/blog/pages/blog-detail/blog-detail.component.html"],
  "sourcesContent": ["import {inject, Inject, Injectable, PLATFORM_ID} from '@angular/core';\r\nimport {Meta, Title} from '@angular/platform-browser';\r\nimport {BlogArticle} from '../interfaces/blogArticle.interface';\r\nimport {environment} from '../../../environment/environment';\r\nimport {isPlatformBrowser} from '@angular/common';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SeoService {\r\n\r\n  private schemaScript?: HTMLScriptElement;\r\nprivate platformId =   inject(PLATFORM_ID);\r\n\r\n  constructor(private titleService: Title,\r\n              private meta: Meta) {\r\n  }\r\n\r\n  setBlogPostingSchema(article: BlogArticle): void {\r\n\r\n    this.removeSchema();\r\n    const baseUrl = environment.baseUrl;\r\n\r\n    const schema = {\r\n      '@context': 'https://schema.org',\r\n      '@type': 'BlogPosting',\r\n\r\n      headline: article.title,\r\n\r\n      description: article.excerpt,\r\n\r\n      image: [\r\n        `${baseUrl}/${article.coverImage.replace(/^\\//, '')}`\r\n      ],\r\n\r\n      datePublished: article.publishedAt,\r\n\r\n      dateModified:\r\n        article.updatedAt ??\r\n        article.publishedAt,\r\n\r\n      articleSection:\r\n      article.category,\r\n\r\n      keywords:\r\n        article.tags.join(', '),\r\n\r\n      author: {\r\n        '@type': 'Person',\r\n        name: 'Cristian TUDOROIU'\r\n      },\r\n\r\n      publisher: {\r\n        '@type': 'Organization',\r\n        name: 'TGC Studios',\r\n        logo: {\r\n          '@type': 'ImageObject',\r\n          url: `${baseUrl}/assets/img/logo.webp`\r\n        }\r\n      },\r\n\r\n      mainEntityOfPage: {\r\n        '@type': 'WebPage',\r\n        '@id': `${baseUrl}/blog/${article.slug}`\r\n      }\r\n    };\r\n\r\n    if (!isPlatformBrowser(this.platformId)) return;\r\n    this.schemaScript =\r\n      document.createElement('script');\r\n\r\n    this.schemaScript.type =\r\n      'application/ld+json';\r\n\r\n    this.schemaScript.textContent =\r\n      JSON.stringify(schema);\r\n\r\n    document.head.appendChild(\r\n      this.schemaScript\r\n    );\r\n  }\r\n\r\n  removeSchema(): void {\r\n    this.schemaScript?.remove();\r\n  }\r\n}\r\n", "import {\r\n  AfterViewInit,\r\n  Component,\r\n  computed, effect,\r\n  ElementRef,\r\n  inject,\r\n  OnDestroy,\r\n  OnInit,\r\n  signal,\r\n  ViewChild\r\n} from '@angular/core';\r\nimport {BlogService} from '../../services/blog.service';\r\nimport {ActivatedRoute, Router, RouterLink} from '@angular/router';\r\nimport {\r\n  LucideArrowLeft,\r\n  LucideCalendar,\r\n  LucideClock4, LucideGlobe,\r\n  LucideRepeat2\r\n} from '@lucide/angular';\r\nimport {DatePipe} from '@angular/common';\r\nimport {MarkdownComponent} from 'ngx-markdown';\r\n\r\nimport {PLATFORM_ID} from '@angular/core';\r\nimport {isPlatformBrowser} from '@angular/common';\r\nimport {myInfo} from '../../../../core/data/my-data';\r\nimport {NewsletterComponent} from '../../components/newsletter/newsletter.component';\r\nimport {ProjectCtaComponent} from '../../components/project-cta/project-cta.component';\r\nimport {BlogArticle} from '../../../../core/interfaces/blogArticle.interface';\r\nimport {SeoService} from '../../../../core/services/seo.service';\r\nimport {ArticleCardComponent} from '../../components/blog-article/article-card.component';\r\nimport {BlogArticleDetailResponse} from '../../../../core/interfaces/BlogArticleDetailResponse';\r\nimport {toSignal} from '@angular/core/rxjs-interop';\r\n\r\n\r\n\r\n@Component({\r\n  selector: 'app-blog-detail',\r\n  imports: [\r\n    LucideArrowLeft,\r\n    DatePipe,\r\n    LucideClock4,\r\n    LucideCalendar,\r\n    MarkdownComponent,\r\n    RouterLink,\r\n    NewsletterComponent,\r\n    ProjectCtaComponent,\r\n    LucideRepeat2,\r\n    ArticleCardComponent,\r\n    LucideGlobe\r\n  ],\r\n  templateUrl: './blog-detail.component.html',\r\n  styleUrl: './blog-detail.component.sass'\r\n})\r\nexport class BlogDetailComponent implements  AfterViewInit, OnDestroy {\r\n\r\n  private blogService = inject(BlogService);\r\n  private route = inject(ActivatedRoute);\r\n  private seoService = inject(SeoService);\r\n  private router = inject(Router);\r\n\r\n  article = signal<BlogArticle | null>(null);\r\n  relatedArticles = signal<BlogArticle[]>([]);\r\n  summary = computed(() => {\r\n    const article = this.article();\r\n    if (!article) {\r\n      return [];\r\n    }\r\n\r\n    return this.blogService.generateSummary(article.content);\r\n  });\r\n  @ViewChild('articleContent')\r\n  articleContent!: ElementRef;\r\n  private platformId = inject(PLATFORM_ID);\r\n  activeHeading = '';\r\n  private observer?: IntersectionObserver;\r\n  private routeData = toSignal(this.route.data);\r\n  mydata = myInfo;\r\n\r\n  constructor() {\r\n\r\n    effect(() => {\r\n\r\n      const data =\r\n        this.routeData()?.['articleData'] as BlogArticleDetailResponse;\r\n\r\n      if (!data?.article) {\r\n        return;\r\n      }\r\n\r\n      this.article.set(data.article);\r\n      this.relatedArticles.set(data.relatedArticles);\r\n\r\n      this.seoService.setBlogPostingSchema(data.article);\r\n\r\n      if (isPlatformBrowser(this.platformId)) {\r\n        setTimeout(() => this.initSummaryObserver());\r\n      }\r\n\r\n    });\r\n\r\n  }\r\n  ngAfterViewInit() {\r\n    if (!isPlatformBrowser(this.platformId)) {\r\n      return;\r\n    }\r\n    this.initSummaryObserver();\r\n  }\r\n\r\n  private initSummaryObserver(): void {\r\n\r\n    this.observer?.disconnect();\r\n\r\n    setTimeout(() => {\r\n\r\n      const headings =\r\n        this.articleContent.nativeElement.querySelectorAll('h2');\r\n\r\n      if (!headings.length) {\r\n        return;\r\n      }\r\n\r\n      headings.forEach((heading: HTMLElement) => {\r\n\r\n        heading.id = this.blogService.generateHeadingId(\r\n          heading.textContent ?? ''\r\n        );\r\n\r\n      });\r\n\r\n      this.observer = new IntersectionObserver(\r\n        (entries) => {\r\n\r\n          entries.forEach(entry => {\r\n\r\n            if (entry.isIntersecting) {\r\n              this.activeHeading =\r\n                (entry.target as HTMLElement).id;\r\n            }\r\n\r\n          });\r\n\r\n        },\r\n        {\r\n          rootMargin: '-100px 0px -70% 0px'\r\n        }\r\n      );\r\n\r\n      headings.forEach((heading: HTMLElement) => {\r\n        this.observer?.observe(heading);\r\n      });\r\n\r\n    });\r\n\r\n  }\r\n\r\n  scrollTo(id: string) {\r\n    const element = document.getElementById(id);\r\n\r\n    if (!element) {\r\n      return;\r\n    }\r\n\r\n    element.scrollIntoView({\r\n      behavior: 'smooth',\r\n      block: 'start'\r\n    });\r\n\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.observer?.disconnect();\r\n    this.seoService.removeSchema();\r\n  }\r\n\r\n}\r\n", "@if (article(); as article){\r\n  <section class=\"blog-detail-container\" >\r\n    <section class=\"blog-detail\">\r\n      <div class=\"blog-detail-header\">\r\n        <a routerLink=\"/blog\" class=\"back-btn\">\r\n          <svg lucideArrowLeft class=\"icon\"></svg>\r\n          Retour au blog</a>\r\n        <div class=\"header-meta\">\r\n          <span class=\"article-category\">{{ article.category }}</span>\r\n          <div class=\"infos\">\r\n          <span class=\"article-reading-time\"><svg lucideClock4 class=\"icon\" ></svg>\r\n            {{ article.readingTime }}min</span>\r\n            <time\r\n              class=\"article-date\"\r\n              [attr.datetime]=\"article.publishedAt\">\r\n\r\n              <svg lucideCalendar class=\"icon\"></svg>\r\n              {{ article.publishedAt | date:'dd MMMM yyyy' }}\r\n\r\n            </time>\r\n            @if (article.updatedAt) {\r\n              <time>\r\n                <svg lucideRepeat2 class=\"icon\"></svg>\r\n                {{ article.updatedAt | date:'dd MMMM yyyy' }}\r\n              </time>\r\n            }\r\n          </div>\r\n        </div>\r\n        <h1 class=\"article-title\">{{ article.title }}</h1>\r\n      </div>\r\n      <div class=\"article-image\">\r\n        <img\r\n          [src]=\"'assets/img/blog/cover/'+article.coverImage\"\r\n          [alt]=\"article.title\"\r\n          width=\"1200\"\r\n          height=\"630\"\r\n          fetchpriority=\"high\">\r\n      </div>\r\n      <div class=\"article-body\">\r\n        <div class=\"article-content\" #articleContent>\r\n          <markdown [data]=\"article.content\" class=\"blog-content\"></markdown>\r\n          <div class=\"author-content\">\r\n            <div class=\"author-avatar\">\r\n              <span>TGC</span>\r\n            </div>\r\n            <div class=\"content\">\r\n              <h5 class=\"nom\">Cristian TUDOROIU</h5>\r\n              <h6 class=\"metier\">Développeur Fullstack Freelance</h6>\r\n              <p class=\"texte\">Développeur web freelance passionné par la création d'interfaces performantes et\r\n                l'optimisation SEO. J'aide les entreprises à transformer leur présence en ligne en véritable levier de\r\n                croissance.</p>\r\n              <div class=\"icons\">\r\n                <a href=\"{{mydata.linkedinLink}}\" target=\"_blank\"> <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 640 640\" fill=\"currentColor\"><path d=\"M196.3 512L103.4 512L103.4 212.9L196.3 212.9L196.3 512zM149.8 172.1C120.1 172.1 96 147.5 96 117.8C96 103.5 101.7 89.9 111.8 79.8C121.9 69.7 135.6 64 149.8 64C164 64 177.7 69.7 187.8 79.8C197.9 89.9 203.6 103.6 203.6 117.8C203.6 147.5 179.5 172.1 149.8 172.1zM543.9 512L451.2 512L451.2 366.4C451.2 331.7 450.5 287.2 402.9 287.2C354.6 287.2 347.2 324.9 347.2 363.9L347.2 512L254.4 512L254.4 212.9L343.5 212.9L343.5 253.7L344.8 253.7C357.2 230.2 387.5 205.4 432.7 205.4C526.7 205.4 544 267.3 544 347.7L544 512L543.9 512z\"/></svg></a>\r\n                <a href=\"https://www.cristian-tudoroiu.fr\" target=\"_blank\"> <svg lucideGlobe class=\"icon\"></svg></a>\r\n                <a href=\"{{mydata.googleLink}}\" target=\"_blank\"> <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\" width=\"24\" height=\"24\" fill=\"currentColor\"><path d=\"M564 325.8C564 467.3 467.1 568 324 568C186.8 568 76 457.2 76 320C76 182.8 186.8 72 324 72C390.8 72 447 96.5 490.3 136.9L422.8 201.8C334.5 116.6 170.3 180.6 170.3 320C170.3 406.5 239.4 476.6 324 476.6C422.2 476.6 459 406.2 464.8 369.7L324 369.7L324 284.4L560.1 284.4C562.4 297.1 564 309.3 564 325.8z\"/></svg></a>\r\n\r\n\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <aside class=\"article-summary\">\r\n\r\n          <div class=\"summary-card\">\r\n\r\n            <h3>Sommaire</h3>\r\n\r\n            @for (item of summary(); track item.id) {\r\n\r\n              <a (click)=\"scrollTo(item.id)\" [class.active]=\"activeHeading === item.id\">\r\n                {{ item.title }}\r\n              </a>\r\n\r\n            }\r\n\r\n          </div>\r\n\r\n        </aside>\r\n      </div>\r\n    </section>\r\n    <section class=\"related-articles\">\r\n      <div class=\"related-articles-header\">\r\n        <h6 class=\"subtitle\">Continuez votre lecture</h6>\r\n        <h2 class=\"title\">Articles similaires</h2>\r\n        <p class=\"texte\">Découvrez d'autres ressources séléctionnées pour approfondir le sujet et faire passer votre présence en ligne\r\n          au niveau supérieur.\r\n        </p>\r\n\r\n      </div>\r\n      <div class=\"list-related-articles\">\r\n        @if (relatedArticles().length > 0) {\r\n          @for (relatedArticle of relatedArticles(); track relatedArticle.id) {\r\n            <app-article-card [article]=\"relatedArticle\"></app-article-card>\r\n          }\r\n        }\r\n\r\n\r\n\r\n      </div>\r\n    </section>\r\n    <app-newsletter></app-newsletter>\r\n    <app-project-cta></app-project-cta>\r\n  </section>\r\n\r\n}\r\n"],
  "mappings": "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",
  "names": ["SeoService", "titleService", "meta", "schemaScript", "platformId", "inject", "PLATFORM_ID", "constructor", "setBlogPostingSchema", "article", "removeSchema", "baseUrl", "environment", "schema", "headline", "title", "description", "excerpt", "image", "coverImage", "replace", "datePublished", "publishedAt", "dateModified", "updatedAt", "articleSection", "category", "keywords", "tags", "join", "author", "name", "publisher", "logo", "url", "mainEntityOfPage", "slug", "isPlatformBrowser", "document", "createElement", "type", "textContent", "JSON", "stringify", "head", "appendChild", "remove", "\u0275\u0275inject", "Title", "Meta", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind2", "article_r1", "updatedAt", "\u0275\u0275listener", "item_r3", "\u0275\u0275restoreView", "_r2", "$implicit", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "scrollTo", "id", "\u0275\u0275classProp", "activeHeading", "title", "\u0275\u0275property", "relatedArticle_r5", "\u0275\u0275repeaterCreate", "BlogDetailComponent_Conditional_0_Conditional_61_For_1_Template", "_forTrack0", "\u0275\u0275repeater", "relatedArticles", "\u0275\u0275conditionalCreate", "BlogDetailComponent_Conditional_0_Conditional_17_Template", "BlogDetailComponent_Conditional_0_For_51_Template", "BlogDetailComponent_Conditional_0_Conditional_61_Template", "\u0275\u0275textInterpolate", "category", "readingTime", "publishedAt", "\u0275\u0275conditional", "coverImage", "\u0275\u0275sanitizeUrl", "content", "\u0275\u0275interpolate", "mydata", "linkedinLink", "googleLink", "summary", "length", "BlogDetailComponent", "blogService", "inject", "BlogService", "route", "ActivatedRoute", "seoService", "SeoService", "router", "Router", "article", "signal", "computed", "generateSummary", "articleContent", "platformId", "PLATFORM_ID", "observer", "routeData", "toSignal", "data", "myInfo", "constructor", "effect", "set", "setBlogPostingSchema", "isPlatformBrowser", "setTimeout", "initSummaryObserver", "ngAfterViewInit", "disconnect", "headings", "nativeElement", "querySelectorAll", "forEach", "heading", "generateHeadingId", "textContent", "IntersectionObserver", "entries", "entry", "isIntersecting", "target", "rootMargin", "observe", "element", "document", "getElementById", "scrollIntoView", "behavior", "block", "ngOnDestroy", "removeSchema", "selectors", "viewQuery", "rf", "ctx", "BlogDetailComponent_Conditional_0_Template", "tmp_0_0", "LucideArrowLeft", "LucideClock4", "LucideCalendar", "MarkdownComponent", "RouterLink", "NewsletterComponent", "ProjectCtaComponent", "LucideRepeat2", "ArticleCardComponent", "LucideGlobe", "DatePipe", "styles"]
}
