diff --git a/resources/js/singles/singles.ts b/resources/js/singles/singles.ts
new file mode 100644
index 0000000..a4402f1
--- /dev/null
+++ b/resources/js/singles/singles.ts
@@ -0,0 +1,94 @@
+import handleIndexPanels from './index-panel';
+
+export default function singles(): void {
+ const isSingleRevue: HTMLElement | null = document.querySelector('.page--single-revue');
+ const isSingleArticle: HTMLElement | null = document.querySelector('.page--single-articles');
+ if (!isSingleRevue && !isSingleArticle) return;
+
+ injectIdToNativeTitles();
+
+ handleIndexPanels();
+ handleCiteButton();
+ handleSmoothScrollToTitle();
+}
+
+function handleCiteButton(): void {
+ const citeButton: HTMLElement | null = document.querySelector('.socials-buttons__button--cite');
+ const citeReference: HTMLElement | null = document.querySelector('#cite-reference');
+ if (!citeButton || !citeReference) return;
+
+ if (!window.isSecureContext) {
+ citeButton.setAttribute('disabled', 'true');
+ citeButton.setAttribute(
+ 'title',
+ 'Vous devez utiliser un navigation sécurisé (https) pour copier la citation'
+ );
+ }
+
+ citeButton.addEventListener('click', () => {
+ const textToCopy = citeReference.textContent;
+ if (!textToCopy) return;
+
+ if (navigator.clipboard && window.isSecureContext) {
+ navigator.clipboard
+ .writeText(textToCopy)
+ .then(() => {
+ const notyf = new Notyf({
+ duration: 4000,
+ ripple: false,
+ dismissible: true,
+ types: [
+ {
+ type: 'success',
+ icon: {
+ className: 'notyf__icon--success',
+ tagName: 'i',
+ },
+ },
+ ],
+ position: {
+ x: 'right',
+ y: 'top',
+ },
+ });
+ notyf.success(
+ 'Citation copiée dans le presse-papiers !
Vous pouvez maintenant la coller dans votre document.'
+ );
+ })
+ .catch((err) => {
+ console.error('Failed to copy text: ', err);
+ });
+ }
+ });
+}
+
+function injectIdToNativeTitles(): void {
+ const titles = document.querySelectorAll('.content-area h2, .content-area h3');
+ titles.forEach((title) => {
+ const titleText = title.textContent || '';
+ const slug = titleText
+ .toLowerCase()
+ .normalize('NFD')
+ .replace(/[\u0300-\u036f]/g, '')
+ .replace(/\s+/g, '-')
+ .replace(/[^\w-]+/g, '');
+ title.setAttribute('id', slug);
+ });
+}
+
+function handleSmoothScrollToTitle(): void {
+ const sommaireTitles: NodeListOf = document.querySelectorAll('.sommaire-index li a');
+ for (const title of sommaireTitles) {
+ title.addEventListener('click', (e) => {
+ e.preventDefault();
+
+ const target = title.getAttribute('href');
+ if (!target) return;
+
+ const targetElement = document.querySelector(target);
+ if (!targetElement) return;
+
+ targetElement.scrollIntoView({ behavior: 'smooth' });
+ });
+ }
+}