living-documentation 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +329 -0
  3. package/dist/bin/cli.d.ts +3 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +62 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/src/frontend/admin.html +1073 -0
  8. package/dist/src/frontend/annotations.js +546 -0
  9. package/dist/src/frontend/boot.js +90 -0
  10. package/dist/src/frontend/config.js +19 -0
  11. package/dist/src/frontend/dark-mode.js +20 -0
  12. package/dist/src/frontend/diagram/alignment.js +161 -0
  13. package/dist/src/frontend/diagram/clipboard.js +172 -0
  14. package/dist/src/frontend/diagram/constants.js +109 -0
  15. package/dist/src/frontend/diagram/debug.js +43 -0
  16. package/dist/src/frontend/diagram/edge-panel.js +260 -0
  17. package/dist/src/frontend/diagram/edge-rendering.js +12 -0
  18. package/dist/src/frontend/diagram/grid.js +78 -0
  19. package/dist/src/frontend/diagram/groups.js +102 -0
  20. package/dist/src/frontend/diagram/history.js +153 -0
  21. package/dist/src/frontend/diagram/image-name-modal.js +48 -0
  22. package/dist/src/frontend/diagram/image-upload.js +36 -0
  23. package/dist/src/frontend/diagram/label-editor.js +115 -0
  24. package/dist/src/frontend/diagram/link-panel.js +144 -0
  25. package/dist/src/frontend/diagram/main.js +299 -0
  26. package/dist/src/frontend/diagram/network.js +1473 -0
  27. package/dist/src/frontend/diagram/node-panel.js +267 -0
  28. package/dist/src/frontend/diagram/node-rendering.js +773 -0
  29. package/dist/src/frontend/diagram/persistence.js +161 -0
  30. package/dist/src/frontend/diagram/ports.js +386 -0
  31. package/dist/src/frontend/diagram/selection-overlay.js +336 -0
  32. package/dist/src/frontend/diagram/state.js +39 -0
  33. package/dist/src/frontend/diagram/t.js +3 -0
  34. package/dist/src/frontend/diagram/toast.js +21 -0
  35. package/dist/src/frontend/diagram/unlock-hold.js +182 -0
  36. package/dist/src/frontend/diagram/zoom.js +20 -0
  37. package/dist/src/frontend/diagram-link-modal.js +137 -0
  38. package/dist/src/frontend/diagram.html +1279 -0
  39. package/dist/src/frontend/documents.js +373 -0
  40. package/dist/src/frontend/export.js +338 -0
  41. package/dist/src/frontend/i18n/en.json +406 -0
  42. package/dist/src/frontend/i18n/fr.json +406 -0
  43. package/dist/src/frontend/i18n.js +32 -0
  44. package/dist/src/frontend/image-paste.js +101 -0
  45. package/dist/src/frontend/index.html +2314 -0
  46. package/dist/src/frontend/misc.js +25 -0
  47. package/dist/src/frontend/new-doc-modal.js +260 -0
  48. package/dist/src/frontend/new-folder-modal.js +174 -0
  49. package/dist/src/frontend/search.js +157 -0
  50. package/dist/src/frontend/sidebar-helpers.js +58 -0
  51. package/dist/src/frontend/sidebar.js +182 -0
  52. package/dist/src/frontend/snippet-detect.js +25 -0
  53. package/dist/src/frontend/snippet-table.js +85 -0
  54. package/dist/src/frontend/snippet-tree.js +94 -0
  55. package/dist/src/frontend/snippets.js +534 -0
  56. package/dist/src/frontend/state.js +28 -0
  57. package/dist/src/frontend/utils.js +21 -0
  58. package/dist/src/frontend/vendor/wordcloud2.js +1187 -0
  59. package/dist/src/frontend/wordcloud.js +693 -0
  60. package/dist/src/lib/config.d.ts +17 -0
  61. package/dist/src/lib/config.d.ts.map +1 -0
  62. package/dist/src/lib/config.js +79 -0
  63. package/dist/src/lib/config.js.map +1 -0
  64. package/dist/src/lib/parser.d.ts +11 -0
  65. package/dist/src/lib/parser.d.ts.map +1 -0
  66. package/dist/src/lib/parser.js +111 -0
  67. package/dist/src/lib/parser.js.map +1 -0
  68. package/dist/src/mcp/server.d.ts +3 -0
  69. package/dist/src/mcp/server.d.ts.map +1 -0
  70. package/dist/src/mcp/server.js +986 -0
  71. package/dist/src/mcp/server.js.map +1 -0
  72. package/dist/src/mcp/tools/diagrams.d.ts +44 -0
  73. package/dist/src/mcp/tools/diagrams.d.ts.map +1 -0
  74. package/dist/src/mcp/tools/diagrams.js +245 -0
  75. package/dist/src/mcp/tools/diagrams.js.map +1 -0
  76. package/dist/src/mcp/tools/documents.d.ts +26 -0
  77. package/dist/src/mcp/tools/documents.d.ts.map +1 -0
  78. package/dist/src/mcp/tools/documents.js +127 -0
  79. package/dist/src/mcp/tools/documents.js.map +1 -0
  80. package/dist/src/mcp/tools/source.d.ts +29 -0
  81. package/dist/src/mcp/tools/source.d.ts.map +1 -0
  82. package/dist/src/mcp/tools/source.js +200 -0
  83. package/dist/src/mcp/tools/source.js.map +1 -0
  84. package/dist/src/routes/annotations.d.ts +3 -0
  85. package/dist/src/routes/annotations.d.ts.map +1 -0
  86. package/dist/src/routes/annotations.js +83 -0
  87. package/dist/src/routes/annotations.js.map +1 -0
  88. package/dist/src/routes/browse.d.ts +3 -0
  89. package/dist/src/routes/browse.d.ts.map +1 -0
  90. package/dist/src/routes/browse.js +75 -0
  91. package/dist/src/routes/browse.js.map +1 -0
  92. package/dist/src/routes/config.d.ts +3 -0
  93. package/dist/src/routes/config.d.ts.map +1 -0
  94. package/dist/src/routes/config.js +97 -0
  95. package/dist/src/routes/config.js.map +1 -0
  96. package/dist/src/routes/diagrams.d.ts +3 -0
  97. package/dist/src/routes/diagrams.d.ts.map +1 -0
  98. package/dist/src/routes/diagrams.js +69 -0
  99. package/dist/src/routes/diagrams.js.map +1 -0
  100. package/dist/src/routes/documents.d.ts +8 -0
  101. package/dist/src/routes/documents.d.ts.map +1 -0
  102. package/dist/src/routes/documents.js +332 -0
  103. package/dist/src/routes/documents.js.map +1 -0
  104. package/dist/src/routes/export.d.ts +3 -0
  105. package/dist/src/routes/export.d.ts.map +1 -0
  106. package/dist/src/routes/export.js +277 -0
  107. package/dist/src/routes/export.js.map +1 -0
  108. package/dist/src/routes/images.d.ts +3 -0
  109. package/dist/src/routes/images.d.ts.map +1 -0
  110. package/dist/src/routes/images.js +49 -0
  111. package/dist/src/routes/images.js.map +1 -0
  112. package/dist/src/routes/wordcloud.d.ts +3 -0
  113. package/dist/src/routes/wordcloud.d.ts.map +1 -0
  114. package/dist/src/routes/wordcloud.js +95 -0
  115. package/dist/src/routes/wordcloud.js.map +1 -0
  116. package/dist/src/server.d.ts +7 -0
  117. package/dist/src/server.d.ts.map +1 -0
  118. package/dist/src/server.js +76 -0
  119. package/dist/src/server.js.map +1 -0
  120. package/dist/starting-doc/.annotations.json +3 -0
  121. package/dist/starting-doc/.diagrams.json +1884 -0
  122. package/dist/starting-doc/.living-doc.json +39 -0
  123. package/dist/starting-doc/1_tutorial/2026_04_11_13_25_[General]_crer_vos_dossiers.md +16 -0
  124. package/dist/starting-doc/1_tutorial/2026_04_11_18_58_[General]_creer_un_document_dans_un_dossier.md +9 -0
  125. package/dist/starting-doc/1_tutorial/2026_04_12_09_00_[General]_editer_et_sauvegarder.md +39 -0
  126. package/dist/starting-doc/1_tutorial/2026_04_12_10_00_[General]_utiliser_les_snippets.md +71 -0
  127. package/dist/starting-doc/2026_04_08_20_52_[General]_welcome.md +17 -0
  128. package/dist/starting-doc/2026_04_11_12_55_[General]_premiers_pas.md +271 -0
  129. package/dist/starting-doc/2_guide/2026_04_08_00_04_[DOCUMENT]_utilisation_des_images_plein_ecran_lien_clickable.md +40 -0
  130. package/dist/starting-doc/2_guide/2026_04_08_23_38_[Configuration]_demarrage_de_living_documentation.md +32 -0
  131. package/dist/starting-doc/2_guide/2026_04_09_09_00_[NAVIGATION]_recherche_plein_texte.md +65 -0
  132. package/dist/starting-doc/2_guide/2026_04_09_10_00_[EXPORT]_exporter_en_pdf.md +43 -0
  133. package/dist/starting-doc/2_guide/2026_04_09_11_00_[Configuration]_configurer_le_panneau_admin.md +55 -0
  134. package/dist/starting-doc/2_guide/2026_04_09_12_00_[Configuration]_extra_files.md +68 -0
  135. package/dist/starting-doc/2_guide/2026_04_09_13_00_[WORDCLOUD]_word_cloud.md +54 -0
  136. package/dist/starting-doc/2_guide/2026_04_09_14_00_[DIAGRAM]_creer_et_lier_un_diagramme.md +77 -0
  137. package/dist/starting-doc/3_concept/2026_04_08_20_58_[DOCUMENTING]_ADRS.md +20 -0
  138. package/dist/starting-doc/3_concept/2026_04_08_22_15_[DOCUMENTING]_living_documentation.md +17 -0
  139. package/dist/starting-doc/3_concept/2026_04_08_22_46_[METHODOLOGY]_diataxis_architecture_du_contenu.md +16 -0
  140. package/dist/starting-doc/4_reference/2026_04_08_23_14_[FUNDAMENTALS]_the_living_documentation_tool.md +41 -0
  141. package/dist/starting-doc/4_reference/2026_04_09_01_00_[REFERENCE]_raccourcis_clavier.md +61 -0
  142. package/dist/starting-doc/4_reference/2026_04_09_02_00_[REFERENCE]_tokens_pattern_nommage.md +75 -0
  143. package/dist/starting-doc/4_reference/2026_04_09_03_00_[REFERENCE]_types_de_snippets.md +68 -0
  144. package/dist/starting-doc/4_reference/2026_04_11_17_31_[FUNDAMENTALS]_architecturer_une_documentation.md +12 -0
  145. package/dist/starting-doc/4_reference/2026_04_12_14_07_[FUNDAMENTALS]_dossiers_et_catgories.md +89 -0
  146. package/dist/starting-doc/images/admin_screenshot.png +0 -0
  147. package/dist/starting-doc/images/ajout-document.png +0 -0
  148. package/dist/starting-doc/images/ajouter-document-categorie.png +0 -0
  149. package/dist/starting-doc/images/ajouter_un_document_dans_un_dossier.png +0 -0
  150. package/dist/starting-doc/images/architecturer_une_documentation_reference.png +0 -0
  151. package/dist/starting-doc/images/cr_er_un_document.png +0 -0
  152. package/dist/starting-doc/images/creation-nouveau-dossier.png +0 -0
  153. package/dist/starting-doc/images/creer-document-context-engineering.png +0 -0
  154. package/dist/starting-doc/images/creer-dossier-only-tutoriel.png +0 -0
  155. package/dist/starting-doc/images/creer-dossier-tutoriel.png +0 -0
  156. package/dist/starting-doc/images/creer-dossiers-done.png +0 -0
  157. package/dist/starting-doc/images/creer-un-document.png +0 -0
  158. package/dist/starting-doc/images/creer-vos-dossiers-tutoriel.png +0 -0
  159. package/dist/starting-doc/images/creer-vos-dossiers.png +0 -0
  160. package/dist/starting-doc/images/decouverte_adrs.png +0 -0
  161. package/dist/starting-doc/images/diataxis.png +0 -0
  162. package/dist/starting-doc/images/diataxis_callout.png +0 -0
  163. package/dist/starting-doc/images/document-cree.png +0 -0
  164. package/dist/starting-doc/images/liens_snippets.png +0 -0
  165. package/dist/starting-doc/images/living_documentation.png +0 -0
  166. package/dist/starting-doc/images/npm_logo.png +0 -0
  167. package/dist/starting-doc/images/popup-creer-document.png +0 -0
  168. package/dist/starting-doc/images/popup-creer-dossier.png +0 -0
  169. package/dist/starting-doc/images/popup-dossier-cree.png +0 -0
  170. package/dist/starting-doc/images/quatre-dossiers-crees.png +0 -0
  171. package/dist/starting-doc/images/screenshot-living-doc.png +0 -0
  172. package/dist/starting-doc/images/the_living_documentation_tool.png +0 -0
  173. package/package.json +49 -0
@@ -0,0 +1,406 @@
1
+ {
2
+ "common.save": "Enregistrer",
3
+ "common.cancel": "Annuler",
4
+ "common.reset": "Réinitialiser",
5
+ "common.loading": "Chargement…",
6
+ "common.remove": "Supprimer",
7
+ "common.create": "Créer",
8
+ "common.add": "Ajouter",
9
+ "common.close": "Fermer",
10
+ "common.back": "Retour",
11
+ "common.general": "Général",
12
+ "common.select": "Sélectionner",
13
+ "common.error_prefix": "Erreur : ",
14
+ "common.up": "↑ Haut",
15
+ "common.empty_dir": "Dossier vide",
16
+ "common.cannot_read_dir": "Impossible de lire le dossier",
17
+
18
+ "nav.toggle_sidebar": "Afficher/masquer le panneau",
19
+ "nav.search_placeholder": "Rechercher dans les docs…",
20
+ "nav.search_mobile_placeholder": "Rechercher…",
21
+ "nav.toggle_dark": "Basculer le mode sombre",
22
+ "nav.export": "Exporter",
23
+ "nav.export_html": "Exporter les dossiers en HTML (ZIP)",
24
+ "nav.export_all_pdf": "Exporter tous les documents en PDF",
25
+ "nav.new_folder": "Nouveau dossier",
26
+ "nav.new_document": "Nouveau document",
27
+ "nav.word_cloud": "☁ Nuage de mots",
28
+ "nav.diagram": "◇ Diagramme",
29
+ "nav.admin": "⚙ Admin",
30
+
31
+ "welcome.title": "Sélectionner un document",
32
+ "welcome.hint": "Choisissez un document dans la barre latérale pour commencer à lire.",
33
+ "welcome.pattern_hint": "Modèle de nom de fichier attendu",
34
+
35
+ "sidebar.failed_to_load": "Impossible de charger les documents.",
36
+ "sidebar.no_docs": "Aucun document trouvé.",
37
+ "sidebar.annotation_badge": "annotation",
38
+ "sidebar.annotated_docs_badge": "document contenant des annotations",
39
+
40
+ "doc.marker_mode": "Mode Marqueur — surligner pour annoter",
41
+ "doc.marker_btn": "Marqueur",
42
+ "doc.toggle_width": "Basculer la largeur",
43
+ "doc.full_width_btn": "↔ Pleine largeur",
44
+ "doc.full_width_narrow_btn": "⇤ Réduire",
45
+ "doc.export_pdf": "Exporter en PDF",
46
+ "doc.export_pdf_btn": "Exporter PDF",
47
+ "doc.copy_link": "Copier le lien",
48
+ "doc.copy_link_btn": "Copier le lien",
49
+ "doc.edit": "Modifier le document",
50
+ "doc.edit_btn": "Modifier",
51
+ "doc.delete": "Supprimer le document",
52
+ "doc.delete_btn": "Supprimer",
53
+ "doc.confirm_delete": "Supprimer définitivement ce document ?",
54
+ "doc.confirm_delete_btn": "Supprimer",
55
+ "doc.cancel_edit": "Annuler la modification",
56
+ "doc.snippets": "Insérer un snippet",
57
+ "doc.snippets_btn": "🧩 Snippets",
58
+ "doc.save": "Enregistrer le document",
59
+ "doc.uploading_image": "Téléversement de l'image…",
60
+ "doc.image_upload_failed": "Échec du téléversement : ",
61
+ "doc.saving": "Enregistrement…",
62
+ "doc.failed_to_load": "Impossible de charger le document : ",
63
+ "doc.copied": "✓ Copié !",
64
+
65
+ "modal.new_folder.title": "Nouveau dossier",
66
+ "modal.new_folder.name_label": "Nom du dossier",
67
+ "modal.new_folder.name_placeholder": "mon-dossier",
68
+ "modal.new_folder.location_label": "Emplacement",
69
+ "modal.new_folder.root": "/ (racine)",
70
+ "modal.new_folder.browse_btn": "Parcourir…",
71
+ "modal.new_folder.select_btn": "Sélectionner ce dossier",
72
+ "modal.new_folder.browse_select_btn": "Sélectionner",
73
+ "modal.new_folder.enter_name": "(saisir un nom)",
74
+ "modal.new_folder.will_be_created": "Sera créé à",
75
+ "modal.new_folder.create_btn": "Créer",
76
+ "modal.new_folder.creating_btn": "Création…",
77
+ "modal.new_folder.error_empty": "Veuillez saisir un nom de dossier.",
78
+ "modal.new_folder.error_invalid_chars": "Caractères non autorisés dans le nom du dossier.",
79
+ "modal.new_folder.no_subfolders": "Aucun sous-dossier",
80
+ "modal.new_folder.error_loading": "Erreur de chargement",
81
+
82
+ "modal.new_doc.title": "Nouveau document",
83
+ "modal.new_doc.title_label": "Titre",
84
+ "modal.new_doc.category_label": "Catégorie",
85
+ "modal.new_doc.location_label": "Emplacement",
86
+ "modal.new_doc.filename_label": "Nom de fichier généré",
87
+ "modal.new_doc.title_placeholder": "(saisir un titre)",
88
+ "modal.new_doc.browse_btn": "Parcourir",
89
+ "modal.new_doc.new_folder_placeholder": "Nom du nouveau dossier…",
90
+ "modal.new_doc.create_folder_btn": "+ Créer",
91
+ "modal.new_doc.error_empty_title": "Veuillez saisir un titre.",
92
+ "modal.new_doc.no_subfolders": "Aucun sous-dossier",
93
+ "modal.new_doc.use_folder_btn": "✓ Utiliser ce dossier",
94
+
95
+ "modal.diag_link.title": "◇ Lier un diagramme",
96
+ "modal.diag_link.existing_radio": "Diagramme existant",
97
+ "modal.diag_link.new_radio": "Nouveau diagramme",
98
+ "modal.diag_link.select_label": "Sélectionner un diagramme",
99
+ "modal.diag_link.name_label": "Nom du diagramme",
100
+ "modal.diag_link.name_placeholder": "Mon diagramme",
101
+ "modal.diag_link.img_label": "Nom du fichier image",
102
+ "modal.diag_link.img_hint": "(enregistré dans ./images/)",
103
+ "modal.diag_link.markdown_label": "Markdown qui sera ajouté",
104
+ "modal.diag_link.insert_btn": "Insérer & Ouvrir le diagramme",
105
+ "modal.diag_link.saving_btn": "Enregistrement…",
106
+ "modal.diag_link.no_diagrams": "Aucun diagramme",
107
+
108
+ "snippet.modal_title": "🧩 Insérer un snippet",
109
+ "snippet.type_label": "Type de snippet",
110
+ "snippet.diagram": "Diagramme",
111
+ "snippet.collapsible": "Bloc repliable (détails)",
112
+ "snippet.link": "Lien",
113
+ "snippet.link_doc": "Lien vers un document",
114
+ "snippet.link_anchor": "Lien vers une ancre",
115
+ "snippet.link_doc_anchor": "Lien vers un document avec ancre",
116
+ "snippet.numbered_list": "Liste numérotée",
117
+ "snippet.bullet_list": "Liste à puces",
118
+ "snippet.code_block": "Bloc de code",
119
+ "snippet.blockquote": "Citation (blockquote)",
120
+ "snippet.separator": "Séparateur horizontal",
121
+ "snippet.image": "Image",
122
+ "snippet.table": "Tableau",
123
+ "snippet.tree": "Arborescence",
124
+ "snippet.colored_section": "Section colorée",
125
+ "snippet.colored_section_color_label": "Couleur",
126
+ "snippet.colored_section_swatch_info": "Info (bleu)",
127
+ "snippet.colored_section_swatch_success": "Succès (vert)",
128
+ "snippet.colored_section_swatch_warning": "Avertissement (orange)",
129
+ "snippet.colored_section_swatch_danger": "Danger (rouge)",
130
+ "snippet.colored_section_swatch_note": "Note (violet)",
131
+ "snippet.colored_section_swatch_neutral": "Neutre (gris)",
132
+ "snippet.colored_section_content_label": "Contenu",
133
+ "snippet.colored_section_content_placeholder": "Votre texte ici…",
134
+ "snippet.colored_text": "Texte coloré",
135
+ "snippet.colored_text_color_label": "Couleur",
136
+ "snippet.colored_text_content_label": "Texte",
137
+ "snippet.colored_text_content_placeholder": "Votre texte…",
138
+ "snippet.collapsible_summary_label": "Titre du résumé",
139
+ "snippet.collapsible_details_placeholder": "Détails",
140
+ "snippet.collapsible_summary_value": "Détails",
141
+ "snippet.link_text_label": "Texte du lien",
142
+ "snippet.link_text_placeholder": "Mon lien",
143
+ "snippet.link_url_label": "URL",
144
+ "snippet.link_url_placeholder": "https://…",
145
+ "snippet.link_doc_label": "Document",
146
+ "snippet.link_doc_text_hint": "(optionnel, utilise le titre par défaut)",
147
+ "snippet.link_section_placeholder": "Voir la section",
148
+ "snippet.link_section_hint": "(optionnel, utilise le titre par défaut)",
149
+ "snippet.link_anchor_label": "Ancre",
150
+ "snippet.link_anchor_placeholder": "mon-titre",
151
+ "snippet.link_anchor_hint": "(sans #, ex : mon-titre)",
152
+ "snippet.link_target_doc_label": "Document cible",
153
+ "snippet.code_lang_label": "Langage",
154
+ "snippet.code_lang_hint": "(ex : javascript, python, bash…)",
155
+ "snippet.image_alt_label": "Texte alternatif",
156
+ "snippet.image_alt_placeholder": "Description de l'image",
157
+ "snippet.image_url_label": "URL de l'image",
158
+ "snippet.image_url_placeholder": "(sauvegardé dans ./images/)",
159
+ "snippet.image_src_placeholder": "./images/mon-image.png",
160
+ "snippet.table_rows_label": "Lignes",
161
+ "snippet.table_cols_label": "Colonnes",
162
+ "snippet.tree_hint": "← → pour indenter · les noms avec / seront des dossiers",
163
+ "snippet.tree_add_btn": "+ Ajouter un élément",
164
+ "snippet.markdown_preview_label": "Aperçu du markdown",
165
+ "snippet.insert_btn": "Insérer",
166
+ "snippet.diagram_existing": "Diagramme existant",
167
+ "snippet.diagram_new": "Nouveau diagramme",
168
+ "snippet.diagram_select_label": "Sélectionner un diagramme",
169
+ "snippet.diagram_no_diagrams": "Aucun diagramme",
170
+ "snippet.diagram_name_label": "Nom du diagramme",
171
+ "snippet.diagram_name_placeholder": "Nom du diagramme…",
172
+ "snippet.diag_img_label": "Nom du fichier image",
173
+ "snippet.diag_img_saved_hint": "(sauvegardé dans ./images/)",
174
+ "snippet.diagram_markdown_label": "Markdown qui sera ajouté",
175
+ "snippet.insert_open_btn": "Insérer & Ouvrir le diagramme",
176
+ "snippet.saving_btn": "Enregistrement…",
177
+ "snippet.detected_msg": "✓ Type détecté : {type}. Les champs ont été pré-remplis — modifiez puis cliquez sur Insérer pour remplacer la sélection.",
178
+ "snippet.unknown_type_msg": "⚠ Le texte sélectionné ne correspond à aucun type de snippet reconnu. Choisissez un type ci-dessous — le snippet remplacera quand même la sélection.",
179
+
180
+ "modal.img_paste.title": "Coller l'image du presse-papiers ?",
181
+ "modal.img_paste.filename_label": "Nom du fichier",
182
+ "modal.img_paste.saved_hint": "(enregistré dans images/)",
183
+ "modal.img_paste.paste_btn": "Coller",
184
+
185
+ "modal.export.title": "Exporter",
186
+ "modal.export.tab_markdown": "Markdown",
187
+ "modal.export.tab_html": "HTML",
188
+ "modal.export.tab_pdf": "PDF",
189
+ "modal.export.markdown_hint": "Exporte tous les documents et images en fichiers Markdown, avec les liens internes réécrits en chemins relatifs.",
190
+ "modal.export.markdown_btn": "Exporter Markdown",
191
+ "modal.export.pdf_hint": "Exporte tous les documents en un seul PDF avec table des matières.",
192
+ "modal.export.pdf_btn": "Exporter tout en PDF",
193
+
194
+ "modal.export_html.title": "Exporter les dossiers en HTML",
195
+ "modal.export_html.hint": "Sélectionnez les dossiers à inclure dans l'archive ZIP.",
196
+ "modal.export_html.notion_btn": "Exporter Notion",
197
+ "modal.export_html.confluence_btn": "Exporter Confluence",
198
+
199
+ "annotation.title": "Annotation",
200
+ "annotation.placeholder": "Votre remarque ou suggestion…",
201
+ "annotation.save_btn": "Enregistrer",
202
+ "annotation.delete_btn": "🗑 Supprimer",
203
+ "annotation.confirm_delete": "Supprimer cette annotation ?",
204
+ "annotation.confirm_btn": "Supprimer",
205
+ "annotation.orphan": "⚠ Texte annoté introuvable — l'extrait a été modifié ou supprimé.",
206
+
207
+ "wc.title": "☁ Nuage de mots",
208
+ "wc.close_btn": "✕ Fermer",
209
+ "wc.search_root_label": "Dossier de recherche",
210
+ "wc.browse_btn": "Parcourir",
211
+ "wc.exclude_label": "Exclure",
212
+ "wc.exclude_placeholder": "components/ui, package-lock.json (une par ligne ou séparées par virgule)",
213
+ "wc.extensions_label": "Extensions",
214
+ "wc.all_btn": "Tout",
215
+ "wc.min_files_label": "Fichiers min.",
216
+ "wc.apply_btn": "Appliquer",
217
+ "wc.top_words": "Mots clés",
218
+ "wc.found_in": "Trouvé dans",
219
+ "wc.launch_btn": "Lancer",
220
+
221
+ "search.notice_singular": "{count} résultat pour \"{query}\"",
222
+ "search.notice_plural": "{count} résultats pour \"{query}\"",
223
+
224
+ "error.create_diagram": "Erreur lors de la création du diagramme : ",
225
+ "error.save": "Erreur lors de la sauvegarde : ",
226
+ "error.pdf_popup": "Veuillez autoriser les popups pour exporter en PDF.",
227
+ "error.pdf_export": "Export échoué : ",
228
+ "error.no_diagrams": "Aucun diagramme",
229
+
230
+ "pdf.toc_title": "Table des matières",
231
+
232
+ "admin.title": "Panneau d'administration",
233
+ "admin.toggle_dark": "Basculer le mode sombre",
234
+ "admin.back_to_docs": "← Retour aux docs",
235
+
236
+ "admin.server_info.title": "Informations serveur",
237
+ "admin.server_info.docs_folder": "Dossier docs",
238
+ "admin.server_info.port": "Port",
239
+ "admin.server_info.source_root": "Racine des sources",
240
+ "admin.server_info.source_root_hint": "Chemin absolu utilisé par les outils MCP de lecture du code source. Par défaut, le dossier parent du dossier docs si vide.",
241
+
242
+ "admin.config.title": "Configuration",
243
+ "admin.config.description": "Les paramètres sont sauvegardés dans .living-doc.json dans votre dossier docs.",
244
+ "admin.config.save_btn": "Enregistrer",
245
+
246
+ "admin.appearance.site_title_label": "Titre du site",
247
+ "admin.appearance.site_title_placeholder": "Living Documentation",
248
+ "admin.appearance.site_title_hint": "Affiché dans l'onglet du navigateur et l'en-tête de la barre latérale.",
249
+ "admin.appearance.theme_label": "Thème par défaut",
250
+ "admin.appearance.theme_system": "Système (suivre les préférences OS)",
251
+ "admin.appearance.theme_light": "Clair",
252
+ "admin.appearance.theme_dark": "Sombre",
253
+ "admin.appearance.theme_hint": "Les utilisateurs peuvent toujours basculer avec le bouton dédié.",
254
+ "admin.appearance.language_label": "Langue",
255
+ "admin.appearance.language_en": "English",
256
+ "admin.appearance.language_fr": "Français",
257
+ "admin.appearance.language_hint": "Langue de l'interface pour toutes les pages.",
258
+ "admin.appearance.debug_label": "Afficher le bouton debug dans l'éditeur de diagrammes",
259
+ "admin.appearance.debug_hint": "Affiche un bouton Debug qui superpose les informations brutes de position et de taille sur chaque nœud — utile pour diagnostiquer les problèmes de grille.",
260
+
261
+ "admin.pattern.label": "Modèle de nom de fichier",
262
+ "admin.pattern.hint": "Analysé pour extraire la date, la catégorie et le titre.",
263
+ "admin.pattern.preview_title": "Aperçu du modèle",
264
+ "admin.pattern.preview_desc": "Comment votre modèle analyse les noms de fichiers :",
265
+ "admin.pattern.col_date": "Date",
266
+ "admin.pattern.col_category": "Catégorie",
267
+ "admin.pattern.col_title": "Titre",
268
+ "admin.pattern.col_none": "aucune",
269
+ "admin.pattern.col_general": "Général",
270
+
271
+ "admin.extra_files.title": "Général — Fichiers supplémentaires",
272
+ "admin.extra_files.description": "Ajoutez des fichiers Markdown hors du dossier docs dans la section Général.",
273
+ "admin.extra_files.empty": "Aucun fichier supplémentaire ajouté.",
274
+ "admin.extra_files.add_btn": "+ Ajouter",
275
+ "admin.extra_files.added_label": "Ajouté",
276
+ "admin.extra_files.loading": "Chargement…",
277
+
278
+ "admin.palette.title": "Palettes de couleurs des diagrammes",
279
+ "admin.palette.description": "Personnalisez les couleurs disponibles dans l'éditeur de diagrammes. Les modifications prennent effet après enregistrement.",
280
+ "admin.palette.shapes_title": "Couleurs des formes",
281
+ "admin.palette.shapes_hint": "Cliquez sur une couleur pour en choisir une nouvelle.",
282
+ "admin.palette.reset_btn": "Réinitialiser",
283
+ "admin.palette.arrows_title": "Couleurs des flèches",
284
+ "admin.palette.arrows_hint": "Ajoutez ou supprimez des couleurs pour les flèches. Cliquez sur ✕ pour supprimer.",
285
+ "admin.palette.add_color_btn": "Ajouter une couleur",
286
+ "admin.palette.delete_color_title": "Supprimer",
287
+
288
+ "admin.license.title": "Licence AGPL-3.0 — Open Source",
289
+ "admin.license.subtitle": "Libre d'utilisation, de fork et d'extension — les dérivés et services hébergés doivent rester sous AGPL (copyleft + clause SaaS).",
290
+ "admin.license.body": "Ce projet open source vous est gracieusement offert par ses concepteurs <strong>Youssef MEDAGHRI-ALAOUI</strong> &amp; <strong>Claude Code</strong>.",
291
+ "admin.license.linkedin_btn": "Youssef sur LinkedIn",
292
+ "admin.license.npm_btn": "living-documentation sur npm",
293
+
294
+ "admin.msg.saved": "Enregistré !",
295
+ "admin.msg.save_failed": "Échec de l'enregistrement : ",
296
+ "admin.msg.load_failed": "Impossible de charger la configuration.",
297
+ "admin.msg.pattern_no_category": "Le modèle de nom de fichier doit contenir [Category]",
298
+ "admin.msg.pattern_one_category": "Le modèle de nom de fichier doit contenir [Category] exactement une fois",
299
+
300
+ "diagram.back_btn": "← Retour",
301
+ "diagram.diagrams_list_title": "Mes diagrammes",
302
+ "diagram.toolbar.select": "Sélectionner (S)",
303
+ "diagram.toolbar.box": "Rectangle (R)",
304
+ "diagram.toolbar.ellipse": "Ellipse (E)",
305
+ "diagram.toolbar.database": "Base de données (D)",
306
+ "diagram.toolbar.circle": "Cercle (C)",
307
+ "diagram.toolbar.actor": "Acteur (A)",
308
+ "diagram.toolbar.postit": "Post-it (P)",
309
+ "diagram.toolbar.text_free": "Texte libre (T)",
310
+ "diagram.toolbar.image": "Image — double-clic sur le canvas pour choisir un fichier, ou coller (⌘V) depuis le presse-papier",
311
+ "diagram.toolbar.arrow": "Flèche (F)",
312
+ "diagram.toolbar.delete": "Supprimer (Suppr)",
313
+ "diagram.toolbar.align_guides": "Guides d'alignement — indique l'alignement entre formes du même type",
314
+ "diagram.toolbar.grid": "Grille / Magnétisme (G)",
315
+ "diagram.toolbar.edge_style": "Basculer flèches courbes / droites",
316
+ "diagram.toolbar.resize_corner": "Mode redimensionnement : coin fixe (cliquer pour centre fixe)",
317
+ "diagram.toolbar.resize_center": "Mode redimensionnement : centre fixe (cliquer pour coin fixe)",
318
+ "diagram.toolbar.title_placeholder": "Titre du diagramme",
319
+ "diagram.toolbar.zoom_out": "Zoom −",
320
+ "diagram.toolbar.zoom_in": "Zoom +",
321
+ "diagram.toolbar.fit": "Ajuster la vue",
322
+ "diagram.toolbar.debug": "Overlay debug",
323
+ "diagram.toolbar.save": "Enregistrer",
324
+
325
+ "diagram.sidebar.title": "Diagrammes",
326
+ "diagram.sidebar.new_btn": "+ Nouveau",
327
+ "diagram.sidebar.empty": "Aucun diagramme",
328
+ "diagram.sidebar.delete_title": "Supprimer",
329
+
330
+ "diagram.node_panel.lock": "Verrouiller la forme",
331
+ "diagram.node_panel.edit_label": "Modifier le texte (double-clic)",
332
+ "diagram.node_panel.edit_link": "Ajouter / modifier un lien",
333
+ "diagram.node_panel.bg_opacity": "Opacité du fond",
334
+ "diagram.node_panel.font_decrease": "Réduire la police",
335
+ "diagram.node_panel.font_increase": "Agrandir la police",
336
+ "diagram.node_panel.align_left": "Aligner à gauche",
337
+ "diagram.node_panel.align_center": "Centrer horizontalement",
338
+ "diagram.node_panel.align_right": "Aligner à droite",
339
+ "diagram.node_panel.align_top": "Aligner en haut",
340
+ "diagram.node_panel.align_middle": "Centrer verticalement",
341
+ "diagram.node_panel.align_bottom": "Aligner en bas",
342
+ "diagram.node_panel.send_back": "Envoyer en arrière",
343
+ "diagram.node_panel.bring_front": "Amener au premier plan",
344
+ "diagram.node_panel.stamp_color": "Tampon couleur — sélectionner les cibles, cliquer ici, puis cliquer la source",
345
+ "diagram.node_panel.stamp_font": "Tampon taille police — sélectionner les cibles, cliquer ici, puis cliquer la source",
346
+ "diagram.node_panel.stamp_size": "Tampon taille forme — sélectionner les cibles, cliquer ici, puis cliquer la source",
347
+ "diagram.node_panel.rotate_ccw": "Rotation anti-horaire 10°",
348
+ "diagram.node_panel.rotate_cw": "Rotation horaire 10°",
349
+ "diagram.node_panel.copy_png": "Copier la sélection en PNG (⌘⇧C)",
350
+ "diagram.node_panel.group": "Grouper la sélection",
351
+ "diagram.node_panel.ungroup": "Dégrouper",
352
+
353
+ "diagram.link_panel.title": "Lien sur cette forme",
354
+ "diagram.link_panel.external": "URL externe",
355
+ "diagram.link_panel.url_placeholder": "https://…",
356
+ "diagram.link_panel.existing_diagram": "Diagramme existant",
357
+ "diagram.link_panel.new_diagram": "Nouveau diagramme",
358
+ "diagram.link_panel.diagram_name_placeholder": "Nom du diagramme…",
359
+ "diagram.link_panel.save_btn": "Enregistrer",
360
+ "diagram.link_panel.remove_btn": "Retirer",
361
+
362
+ "diagram.edge_panel.lock": "Verrouiller la flèche",
363
+ "diagram.edge_panel.no_arrow": "Trait simple",
364
+ "diagram.edge_panel.arrow_to": "Flèche directionnelle",
365
+ "diagram.edge_panel.arrow_both": "Bidirectionnelle",
366
+ "diagram.edge_panel.solid": "Trait plein",
367
+ "diagram.edge_panel.dashed": "Pointillé",
368
+ "diagram.edge_panel.font_decrease": "Réduire la police",
369
+ "diagram.edge_panel.font_increase": "Agrandir la police",
370
+ "diagram.edge_panel.edit_label": "Modifier le libellé de la flèche",
371
+ "diagram.edge_panel.reset_label_width": "Réinitialiser la largeur du libellé (auto)",
372
+ "diagram.edge_panel.rotate_label_ccw": "Rotation libellé sens antihoraire (−15°)",
373
+ "diagram.edge_panel.rotate_label_cw": "Rotation libellé sens horaire (+15°)",
374
+ "diagram.edge_panel.offset_label_left": "Déplacer le libellé vers la gauche",
375
+ "diagram.edge_panel.offset_label_right": "Déplacer le libellé vers la droite",
376
+ "diagram.edge_panel.offset_label_up": "Déplacer le libellé vers le haut",
377
+ "diagram.edge_panel.offset_label_down": "Déplacer le libellé vers le bas",
378
+ "diagram.edge_panel.offset_label_reset": "Réinitialiser la position du libellé",
379
+ "diagram.edge_panel.width_decrease": "Réduire l'épaisseur",
380
+ "diagram.edge_panel.width_increase": "Augmenter l'épaisseur",
381
+ "diagram.edge_panel.clear_ports": "Supprimer les points d'attache",
382
+
383
+ "diagram.label_input.placeholder": "Libellé…",
384
+ "diagram.empty_state": "Sélectionne ou crée un diagramme",
385
+
386
+ "diagram.image_modal.title": "Nom du fichier image",
387
+ "diagram.image_modal.description": "Lettres, chiffres, _ et - uniquement. Laisser vide pour un nom automatique.",
388
+ "diagram.image_modal.placeholder": "nom_image",
389
+ "diagram.image_modal.error_chars": "Caractères autorisés : lettres, chiffres, _ et -",
390
+ "diagram.image_modal.cancel_btn": "Annuler",
391
+ "diagram.image_modal.paste_btn": "Coller",
392
+
393
+ "diagram.selection.rotate_shape": "Rotation forme",
394
+ "diagram.selection.rotate_text": "Rotation texte",
395
+
396
+ "diagram.toast.png_copied": "PNG copié dans le presse-papier",
397
+ "diagram.toast.png_copy_error": "Impossible de copier l'image",
398
+ "diagram.toast.diagram_saved_png": "Diagramme enregistré en tant qu'image",
399
+ "diagram.toast.diagram_save_png_error": "Impossible d'enregistrer l'image",
400
+ "diagram.toast.image_added": "Image ajoutée",
401
+ "diagram.toast.image_import_error": "Impossible d'importer l'image",
402
+ "diagram.toast.confirm_delete": "Supprimer ce diagramme ?",
403
+ "diagram.toast.new_diagram_title": "Nouveau diagramme",
404
+ "diagram.toast.untitled": "Sans titre",
405
+ "diagram.toast.diagram_linked": "Diagramme \"{title}\" créé et lié"
406
+ }
@@ -0,0 +1,32 @@
1
+ // ── i18n loader ───────────────────────────────────────────────────────────────
2
+ // Regular script (not ES module) — works in all three pages.
3
+ // Exposes window.t(key), window.initI18n(lang), window.applyI18n().
4
+ (function () {
5
+ let _dict = {};
6
+
7
+ window.t = function (key) {
8
+ return _dict[key] !== undefined ? _dict[key] : key;
9
+ };
10
+
11
+ window.initI18n = async function (lang) {
12
+ try {
13
+ const res = await fetch('/i18n/' + (lang || 'en') + '.json');
14
+ if (res.ok) _dict = await res.json();
15
+ } catch { /* keep empty dict — keys used as fallback text */ }
16
+ };
17
+
18
+ window.applyI18n = function () {
19
+ document.querySelectorAll('[data-i18n]').forEach(function (el) {
20
+ el.textContent = window.t(el.dataset.i18n);
21
+ });
22
+ document.querySelectorAll('[data-i18n-title]').forEach(function (el) {
23
+ el.title = window.t(el.dataset.i18nTitle);
24
+ });
25
+ document.querySelectorAll('[data-i18n-placeholder]').forEach(function (el) {
26
+ el.placeholder = window.t(el.dataset.i18nPlaceholder);
27
+ });
28
+ document.querySelectorAll('[data-i18n-html]').forEach(function (el) {
29
+ el.innerHTML = window.t(el.dataset.i18nHtml);
30
+ });
31
+ };
32
+ })();
@@ -0,0 +1,101 @@
1
+ // ── Image paste + lightbox ──────────────────────────────────────────────────
2
+ // Handles Cmd/Ctrl+V image paste in the markdown editor and the image
3
+ // lightbox overlay used when clicking an image in a rendered document.
4
+
5
+ // State for the image paste confirmation flow
6
+ let _imgPasteBlob = null;
7
+ let _imgPasteExt = "png";
8
+ let _imgPasteCursorStart = 0;
9
+ let _imgPasteCursorEnd = 0;
10
+
11
+ async function handleEditorPaste(e) {
12
+ const items = Array.from(e.clipboardData?.items ?? []);
13
+ const imageItem = items.find((item) => item.type.startsWith("image/"));
14
+ if (!imageItem) return;
15
+
16
+ e.preventDefault();
17
+
18
+ const editor = document.getElementById("doc-editor");
19
+ _imgPasteCursorStart = editor.selectionStart;
20
+ _imgPasteCursorEnd = editor.selectionEnd;
21
+ _imgPasteExt =
22
+ imageItem.type.split("/")[1].replace("jpeg", "jpg") || "png";
23
+ _imgPasteBlob = imageItem.getAsFile();
24
+ if (!_imgPasteBlob) return;
25
+
26
+ // Propose a default name: timestamp in ms
27
+ const defaultName = Date.now().toString();
28
+ document.getElementById("img-paste-name").value = defaultName;
29
+ document.getElementById("img-paste-ext").textContent =
30
+ "." + _imgPasteExt;
31
+ document.getElementById("img-paste-modal").classList.remove("hidden");
32
+
33
+ // Focus the name input and select all for quick renaming
34
+ const nameInput = document.getElementById("img-paste-name");
35
+ nameInput.focus();
36
+ nameInput.select();
37
+ }
38
+
39
+ function imgPasteCancel() {
40
+ document.getElementById("img-paste-modal").classList.add("hidden");
41
+ _imgPasteBlob = null;
42
+ }
43
+
44
+ async function imgPasteConfirm() {
45
+ const name =
46
+ document.getElementById("img-paste-name").value.trim() ||
47
+ Date.now().toString();
48
+ document.getElementById("img-paste-modal").classList.add("hidden");
49
+
50
+ const editor = document.getElementById("doc-editor");
51
+ const msgEl = document.getElementById("edit-save-msg");
52
+
53
+ msgEl.textContent = window.t('doc.uploading_image');
54
+ msgEl.className = "text-xs text-gray-400";
55
+
56
+ try {
57
+ const base64 = await new Promise((resolve, reject) => {
58
+ const reader = new FileReader();
59
+ reader.onload = () => resolve(reader.result);
60
+ reader.onerror = reject;
61
+ reader.readAsDataURL(_imgPasteBlob);
62
+ });
63
+
64
+ const res = await fetch("/api/images/upload", {
65
+ method: "POST",
66
+ headers: { "Content-Type": "application/json" },
67
+ body: JSON.stringify({ data: base64, ext: _imgPasteExt, name }),
68
+ });
69
+ if (!res.ok) throw new Error(await res.text());
70
+
71
+ const { filename } = await res.json();
72
+ const mdImage = `![image](./images/${filename})`;
73
+
74
+ const before = editor.value.slice(0, _imgPasteCursorStart);
75
+ const after = editor.value.slice(_imgPasteCursorEnd);
76
+ editor.value = before + mdImage + after;
77
+ editor.selectionStart = editor.selectionEnd =
78
+ _imgPasteCursorStart + mdImage.length;
79
+ editor.focus();
80
+ msgEl.textContent = "";
81
+ } catch (err) {
82
+ msgEl.textContent = window.t('doc.image_upload_failed') + err.message;
83
+ msgEl.className = "text-xs text-red-500 dark:text-red-400";
84
+ } finally {
85
+ _imgPasteBlob = null;
86
+ }
87
+ }
88
+
89
+ // ── Lightbox ────────────────────────────────────────────────────────────────
90
+ function openLightbox(src, alt) {
91
+ const lb = document.getElementById("img-lightbox");
92
+ document.getElementById("img-lightbox-img").src = src;
93
+ document.getElementById("img-lightbox-img").alt = alt || "";
94
+ lb.classList.remove("hidden");
95
+ }
96
+
97
+ function closeLightbox() {
98
+ const lb = document.getElementById("img-lightbox");
99
+ lb.classList.add("hidden");
100
+ document.getElementById("img-lightbox-img").src = "";
101
+ }