cilog-lib 1.11.11 → 1.11.13

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.
@@ -42,7 +42,7 @@ import * as i5$1 from 'primeng/progressspinner';
42
42
  import { ProgressSpinnerModule } from 'primeng/progressspinner';
43
43
  import * as i6$1 from 'primeng/tabs';
44
44
  import { TabsModule } from 'primeng/tabs';
45
- import { MarkdownComponent } from 'ngx-markdown';
45
+ import { MarkdownComponent, provideMarkdown } from 'ngx-markdown';
46
46
  import * as i1$1 from '@angular/common/http';
47
47
 
48
48
  class CilogLibComponent {
@@ -1400,17 +1400,19 @@ class DocumentationContextuelleComponent {
1400
1400
  http;
1401
1401
  router;
1402
1402
  zone;
1403
+ cdr;
1403
1404
  config;
1404
1405
  categories = [];
1405
1406
  filteredCategories = [];
1406
1407
  tabs = [];
1407
1408
  searchQuery = '';
1408
- activeTabIndex = 0;
1409
+ activeTabValue = '';
1409
1410
  urlSub;
1410
- constructor(http, router, zone) {
1411
+ constructor(http, router, zone, cdr) {
1411
1412
  this.http = http;
1412
1413
  this.router = router;
1413
1414
  this.zone = zone;
1415
+ this.cdr = cdr;
1414
1416
  }
1415
1417
  ngOnInit() {
1416
1418
  this.http.get('assets/docs/doc-config/config.json').subscribe((config) => {
@@ -1488,14 +1490,14 @@ class DocumentationContextuelleComponent {
1488
1490
  }
1489
1491
  openTabAndActivate(tab) {
1490
1492
  this.tabs.push(tab);
1491
- setTimeout(() => {
1492
- this.activeTabIndex = this.tabs.length - 1;
1493
- });
1493
+ this.activeTabValue = tab.value;
1494
+ this.cdr.detectChanges();
1494
1495
  }
1495
1496
  openDocumentationAndSwitch(doc) {
1496
1497
  const existingTab = this.tabs.find(tab => tab.fileName === doc.fileName);
1497
1498
  if (existingTab) {
1498
- this.activeTabIndex = this.tabs.indexOf(existingTab);
1499
+ this.activeTabValue = existingTab.value;
1500
+ this.cdr.detectChanges();
1499
1501
  return;
1500
1502
  }
1501
1503
  const newTab = {
@@ -1508,21 +1510,24 @@ class DocumentationContextuelleComponent {
1508
1510
  value: doc.fileName
1509
1511
  };
1510
1512
  this.openTabAndActivate(newTab);
1511
- fetch(`assets/docs/${doc.fileName}`)
1512
- .then(res => res.text())
1513
- .then(content => {
1514
- newTab.content = content;
1515
- newTab.loading = false;
1516
- })
1517
- .catch(() => {
1518
- newTab.content = '❌ Erreur lors du chargement du fichier markdown.';
1519
- newTab.loading = false;
1513
+ this.http.get(`assets/docs/${doc.fileName}`, { responseType: 'text' }).subscribe({
1514
+ next: (content) => {
1515
+ newTab.content = content;
1516
+ newTab.loading = false;
1517
+ this.cdr.detectChanges();
1518
+ },
1519
+ error: () => {
1520
+ newTab.content = '❌ Erreur lors du chargement du fichier markdown.';
1521
+ newTab.loading = false;
1522
+ this.cdr.detectChanges();
1523
+ }
1520
1524
  });
1521
1525
  }
1522
1526
  openDocumentationList() {
1523
1527
  const existing = this.tabs.find(t => t.type === 'list');
1524
1528
  if (existing) {
1525
- this.activeTabIndex = this.tabs.indexOf(existing);
1529
+ this.activeTabValue = existing.value;
1530
+ this.cdr.detectChanges();
1526
1531
  return;
1527
1532
  }
1528
1533
  this.openTabAndActivate({ type: 'list', title: '📚 Sommaire des Docs', value: 'list' });
@@ -1535,9 +1540,13 @@ class DocumentationContextuelleComponent {
1535
1540
  }
1536
1541
  closeTab(event) {
1537
1542
  this.tabs.splice(event.index, 1);
1538
- if (this.activeTabIndex >= this.tabs.length) {
1539
- this.activeTabIndex = this.tabs.length - 1;
1543
+ if (this.tabs.length > 0) {
1544
+ this.activeTabValue = this.tabs[this.tabs.length - 1].value;
1545
+ }
1546
+ else {
1547
+ this.activeTabValue = '';
1540
1548
  }
1549
+ this.cdr.detectChanges();
1541
1550
  }
1542
1551
  ngOnDestroy() {
1543
1552
  this.urlSub?.unsubscribe();
@@ -1569,20 +1578,20 @@ class DocumentationContextuelleComponent {
1569
1578
  .reduce((acc, cat) => acc.concat(cat.docs), [])
1570
1579
  .find(doc => normalizedUrl.toLowerCase().includes(doc.fileName.toLowerCase().replace('.md', '')));
1571
1580
  }
1572
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DocumentationContextuelleComponent, deps: [{ token: i1$1.HttpClient }, { token: i2$3.Router }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
1573
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DocumentationContextuelleComponent, isStandalone: true, selector: "cilog-documentation-contextuelle", ngImport: i0, template: "<div class=\"documentation-container\">\r\n <!-- Menu sup\u00E9rieur -->\r\n <div class=\"documentation-menu\">\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-list\"\r\n label=\"Sommaire des documentations\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openDocumentationList()\"\r\n title=\"Voir toutes les documentations disponibles\">\r\n </button>\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-home\"\r\n label=\"Documentation courante\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openCurrentPageDoc()\"\r\n title=\"Documentation de la page actuelle\">\r\n </button>\r\n </div>\r\n\r\n <!-- Syst\u00E8me d'onglets -->\r\n <p-tabs (onClose)=\"closeTab($event)\"\r\n styleClass=\"documentation-tabs\">\r\n <p-tablist>\r\n @for (tab of tabs; track tab.value) {\r\n <p-tab [value]=\"tab.value\">{{ tab.title }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels>\r\n @for (tab of tabs; track tab.value; let i = $index) {\r\n <p-tabpanel [value]=\"tab.value\">\r\n <!-- Contenu pour onglet de liste - Version am\u00E9lior\u00E9e -->\r\n @if (tab.type === 'list') {\r\n <div class=\"docs-list-container\">\r\n <div class=\"docs-header\">\r\n <h2>\uD83D\uDCDA Sommaire de la Documentation</h2>\r\n <p class=\"docs-subtitle\">Explorez toutes les fonctionnalit\u00E9s disponibles dans LogeProj</p>\r\n </div>\r\n <!-- Barre de recherche -->\r\n <div class=\"search-bar\">\r\n <span class=\"p-input-icon-left\" style=\"width: 100%; max-width: 800px;\">\r\n <i class=\"pi pi-search\"></i>\r\n <input type=\"text\"\r\n pInputText\r\n placeholder=\"Rechercher dans les documentations...\"\r\n name=\"recherche\"\r\n [(ngModel)]=\"searchQuery\"\r\n ngDefaultControl\r\n (input)=\"filterDocumentation()\"\r\n style=\"width: 100% !important; padding: 12px 20px 12px 40px !important; border-radius: 25px !important;\">\r\n </span>\r\n </div>\r\n <!-- Liste des cat\u00E9gories -->\r\n <div class=\"categories-container\">\r\n @for (category of filteredCategories; track category.key) {\r\n <div class=\"category-section\">\r\n <div class=\"category-header\" (click)=\"toggleCategory(category.key)\">\r\n <i class=\"pi\" [ngClass]=\"category.expanded ? 'pi-chevron-down' : 'pi-chevron-right'\"></i>\r\n <span class=\"category-icon\">{{ category.icon }}</span>\r\n <h3 class=\"category-title\">{{ category.name }}</h3>\r\n <span class=\"category-count\">({{ category.docs.length }})</span>\r\n </div>\r\n <div class=\"category-content\" [ngClass]=\"{ 'expanded': category.expanded }\">\r\n <div class=\"docs-grid\">\r\n @for (doc of category.docs; track doc.fileName) {\r\n <div class=\"doc-card\"\r\n (click)=\"openDocumentationAndSwitch(doc)\"\r\n [title]=\"doc.description\">\r\n <div class=\"doc-card-content\">\r\n <h4 class=\"doc-name\">{{ doc.displayName }}</h4>\r\n <markdown class=\"doc-description\" [data]=\"doc.description\"\r\n (click)=\"onMarkdownClick($event)\"></markdown>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <!-- Stats en bas -->\r\n <div class=\"docs-stats\">\r\n <div class=\"stat-item\">\r\n <strong>{{ getTotalDocsCount() }}</strong> documentations disponibles\r\n </div>\r\n <div class=\"stat-item\">\r\n <strong>{{ getOpenTabsCount() }}</strong> onglets ouverts\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <!-- Contenu pour onglet de documentation -->\r\n @if (tab.type === 'doc') {\r\n <div class=\"markdown-container\">\r\n <!-- Breadcrumb pour navigation -->\r\n @if (tab.category) {\r\n <div class=\"doc-breadcrumb\">\r\n <span class=\"breadcrumb-item\">{{ tab.category }}</span>\r\n <i class=\"pi pi-angle-right\"></i>\r\n <span class=\"breadcrumb-current\">{{ tab.title }}</span>\r\n </div>\r\n }\r\n @if (tab.loading) {\r\n <div class=\"loading-container\">\r\n <p-progressSpinner strokeWidth=\"4\"></p-progressSpinner>\r\n <span>Chargement de la documentation...</span>\r\n </div>\r\n }\r\n @if (!tab.loading) {\r\n <markdown [data]=\"tab.content || 'Aucun contenu disponible'\"\r\n (click)=\"onMarkdownClick($event)\">\r\n </markdown>\r\n }\r\n </div>\r\n }\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n</div>\r\n", styles: [".documentation-container{display:flex;flex-direction:column;height:100%;width:100%}.documentation-menu{padding:15px;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #e9ecef;display:flex;gap:10px;flex-shrink:0}.documentation-menu .p-button{background:#fff3;border:1px solid rgba(255,255,255,.3);color:#fff}.documentation-menu .p-button:hover{background:#ffffff4d}.docs-list-container{padding:20px;flex:1;overflow-y:auto;background:#f8f9fa}.docs-header{text-align:center;margin-bottom:30px}.docs-header h2{margin:0 0 10px;color:#2c3e50;font-size:2rem}.docs-header .docs-subtitle{color:#7f8c8d;font-size:1.1rem;margin:0}.search-bar{margin-bottom:30px;display:flex;justify-content:center}.search-bar .search-input{width:100%;padding:12px 20px 12px 40px;border-radius:25px;border:2px solid #e9ecef;font-size:1rem}.search-bar .search-input:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.categories-container{max-width:1200px;margin:0 auto}.category-section{margin-bottom:25px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.category-section .category-header{padding:20px;background:linear-gradient(135deg,#f5f7fa,#c3cfe2);cursor:pointer;display:flex;align-items:center;gap:15px;transition:all .3s ease}.category-section .category-header:hover{background:linear-gradient(135deg,#e8eaf6,#b39ddb)}.category-section .category-header .pi{color:#667eea;font-size:1rem;transition:transform .3s ease}.category-section .category-header .category-icon{font-size:1.5rem}.category-section .category-header .category-title{margin:0;color:#2c3e50;font-size:1.3rem;flex:1}.category-section .category-header .category-count{color:#7f8c8d;font-size:.9rem;background:#677eea1a;padding:4px 12px;border-radius:15px}.category-section .category-content{max-height:0;overflow:hidden;transition:max-height .4s ease-out}.category-section .category-content.expanded{max-height:2000px;transition:max-height .6s ease-in}.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px;padding:25px}.doc-card{border:1px solid #e9ecef;border-radius:12px;padding:20px;cursor:pointer;transition:all .3s ease;background:#fff;position:relative;overflow:hidden}.doc-card:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(90deg,#667eea,#764ba2);transform:scaleX(0);transition:transform .3s ease}.doc-card:hover{border-color:#667eea;box-shadow:0 8px 25px #667eea26;transform:translateY(-4px)}.doc-card:hover:before{transform:scaleX(1)}.doc-card .doc-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.doc-card .doc-card-header .doc-icon{font-size:2rem}.doc-card .doc-card-header .doc-badge{padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase}.doc-card .doc-card-header .doc-badge.doc-badge-high{background:#e8f5e8;color:#2e7d2e}.doc-card .doc-card-header .doc-badge.doc-badge-medium{background:#fff3cd;color:#856404}.doc-card .doc-card-header .doc-badge.doc-badge-low{background:#f8f9fa;color:#6c757d}.doc-card .doc-card-content .doc-name{margin:0 0 10px;color:#2c3e50;font-size:1.1rem;font-weight:600;line-height:1.3}.doc-card .doc-card-content .doc-description{color:#6c757d;font-size:.9rem;line-height:1.4;margin:0 0 10px}.doc-card .doc-card-content .doc-description ::ng-deep p{margin:0;display:inline}.doc-card .doc-card-content .doc-description ::ng-deep a{color:#667eea;text-decoration:none;pointer-events:auto}.doc-card .doc-card-content .doc-description ::ng-deep a:hover{text-decoration:underline}.doc-card .doc-card-content .doc-filename{color:#adb5bd;font-size:.8rem;font-family:Courier New,monospace}.docs-stats{display:flex;justify-content:center;gap:40px;margin-top:40px;padding:20px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.docs-stats .stat-item{text-align:center;color:#6c757d}.docs-stats .stat-item strong{color:#667eea;font-size:1.2rem}.markdown-container{flex:1;overflow-y:auto;padding:20px;background:#fff}.markdown-container .doc-breadcrumb{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding:10px 0;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:.9rem}.markdown-container .doc-breadcrumb .breadcrumb-current{color:#2c3e50;font-weight:600}.markdown-container markdown{display:block;line-height:1.6}.markdown-container markdown ::ng-deep a[href$=\".md\"]{color:#667eea;text-decoration:none;cursor:pointer;border-bottom:1px dashed #667eea}.markdown-container markdown ::ng-deep a[href$=\".md\"]:hover{text-decoration:none;border-bottom-style:solid}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px;color:#6c757d;gap:20px}.loading-container span{font-size:1.1rem}.documentation-tabs{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-panels{flex:1;display:flex}.documentation-tabs ::ng-deep .p-tabview-panels .p-tabview-panel{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-nav{background:#f8f9fa;border-bottom:2px solid #e9ecef}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link{background:transparent;border:none;color:#6c757d;font-weight:500}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link:not(.p-disabled):focus{box-shadow:0 0 0 2px #667eea33}.documentation-tabs ::ng-deep .p-tabview-nav .p-highlight .p-tabview-nav-link{background:#fff;color:#667eea;border-bottom:2px solid #667eea}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i5$1.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i6$1.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i6$1.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i6$1.TabPanel, selector: "p-tabpanel", inputs: ["lazy", "value"], outputs: ["valueChange"] }, { kind: "component", type: i6$1.TabList, selector: "p-tablist" }, { kind: "component", type: i6$1.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: EditorModule }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }] });
1581
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DocumentationContextuelleComponent, deps: [{ token: i1$1.HttpClient }, { token: i2$3.Router }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1582
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DocumentationContextuelleComponent, isStandalone: true, selector: "cilog-documentation-contextuelle", providers: [provideMarkdown()], ngImport: i0, template: "<div class=\"documentation-container\">\r\n <!-- Menu sup\u00E9rieur -->\r\n <div class=\"documentation-menu\">\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-list\"\r\n label=\"Sommaire des documentations\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openDocumentationList()\"\r\n title=\"Voir toutes les documentations disponibles\">\r\n </button>\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-home\"\r\n label=\"Documentation courante\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openCurrentPageDoc()\"\r\n title=\"Documentation de la page actuelle\">\r\n </button>\r\n </div>\r\n\r\n <!-- Syst\u00E8me d'onglets -->\r\n <p-tabs [(value)]=\"activeTabValue\"\r\n (onClose)=\"closeTab($event)\"\r\n styleClass=\"documentation-tabs\">\r\n <p-tablist>\r\n @for (tab of tabs; track tab.value) {\r\n <p-tab [value]=\"tab.value\">{{ tab.title }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels>\r\n @for (tab of tabs; track tab.value; let i = $index) {\r\n <p-tabpanel [value]=\"tab.value\">\r\n <!-- Contenu pour onglet de liste - Version am\u00E9lior\u00E9e -->\r\n @if (tab.type === 'list') {\r\n <div class=\"docs-list-container\">\r\n <div class=\"docs-header\">\r\n <h2>\uD83D\uDCDA Sommaire de la Documentation</h2>\r\n <p class=\"docs-subtitle\">Explorez toutes les fonctionnalit\u00E9s disponibles dans LogeProj</p>\r\n </div>\r\n <!-- Barre de recherche -->\r\n <div class=\"search-bar\">\r\n <span class=\"p-input-icon-left\" style=\"width: 100%; max-width: 800px;\">\r\n <i class=\"pi pi-search\"></i>\r\n <input type=\"text\"\r\n pInputText\r\n placeholder=\"Rechercher dans les documentations...\"\r\n name=\"recherche\"\r\n [(ngModel)]=\"searchQuery\"\r\n ngDefaultControl\r\n (input)=\"filterDocumentation()\"\r\n style=\"width: 100% !important; padding: 12px 20px 12px 40px !important; border-radius: 25px !important;\">\r\n </span>\r\n </div>\r\n <!-- Liste des cat\u00E9gories -->\r\n <div class=\"categories-container\">\r\n @for (category of filteredCategories; track category.key) {\r\n <div class=\"category-section\">\r\n <div class=\"category-header\" (click)=\"toggleCategory(category.key)\">\r\n <i class=\"pi\" [ngClass]=\"category.expanded ? 'pi-chevron-down' : 'pi-chevron-right'\"></i>\r\n <span class=\"category-icon\">{{ category.icon }}</span>\r\n <h3 class=\"category-title\">{{ category.name }}</h3>\r\n <span class=\"category-count\">({{ category.docs.length }})</span>\r\n </div>\r\n <div class=\"category-content\" [ngClass]=\"{ 'expanded': category.expanded }\">\r\n <div class=\"docs-grid\">\r\n @for (doc of category.docs; track doc.fileName) {\r\n <div class=\"doc-card\"\r\n (click)=\"openDocumentationAndSwitch(doc)\"\r\n [title]=\"doc.description\">\r\n <div class=\"doc-card-content\">\r\n <h4 class=\"doc-name\">{{ doc.displayName }}</h4>\r\n <markdown class=\"doc-description\" [data]=\"doc.description\"\r\n (click)=\"onMarkdownClick($event)\"></markdown>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <!-- Stats en bas -->\r\n <div class=\"docs-stats\">\r\n <div class=\"stat-item\">\r\n <strong>{{ getTotalDocsCount() }}</strong> documentations disponibles\r\n </div>\r\n <div class=\"stat-item\">\r\n <strong>{{ getOpenTabsCount() }}</strong> onglets ouverts\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <!-- Contenu pour onglet de documentation -->\r\n @if (tab.type === 'doc') {\r\n <div class=\"markdown-container\">\r\n <!-- Breadcrumb pour navigation -->\r\n @if (tab.category) {\r\n <div class=\"doc-breadcrumb\">\r\n <span class=\"breadcrumb-item\">{{ tab.category }}</span>\r\n <i class=\"pi pi-angle-right\"></i>\r\n <span class=\"breadcrumb-current\">{{ tab.title }}</span>\r\n </div>\r\n }\r\n @if (tab.loading) {\r\n <div class=\"loading-container\">\r\n <p-progressSpinner strokeWidth=\"4\"></p-progressSpinner>\r\n <span>Chargement de la documentation...</span>\r\n </div>\r\n }\r\n @if (!tab.loading) {\r\n <markdown [data]=\"tab.content || 'Aucun contenu disponible'\"\r\n (click)=\"onMarkdownClick($event)\">\r\n </markdown>\r\n }\r\n </div>\r\n }\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n</div>\r\n", styles: [".documentation-container{display:flex;flex-direction:column;height:100%;width:100%}.documentation-menu{padding:15px;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #e9ecef;display:flex;gap:10px;flex-shrink:0}.documentation-menu .p-button{background:#fff3;border:1px solid rgba(255,255,255,.3);color:#fff}.documentation-menu .p-button:hover{background:#ffffff4d}.docs-list-container{padding:20px;flex:1;overflow-y:auto;background:#f8f9fa}.docs-header{text-align:center;margin-bottom:30px}.docs-header h2{margin:0 0 10px;color:#2c3e50;font-size:2rem}.docs-header .docs-subtitle{color:#7f8c8d;font-size:1.1rem;margin:0}.search-bar{margin-bottom:30px;display:flex;justify-content:center}.search-bar .search-input{width:100%;padding:12px 20px 12px 40px;border-radius:25px;border:2px solid #e9ecef;font-size:1rem}.search-bar .search-input:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.categories-container{max-width:1200px;margin:0 auto}.category-section{margin-bottom:25px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.category-section .category-header{padding:20px;background:linear-gradient(135deg,#f5f7fa,#c3cfe2);cursor:pointer;display:flex;align-items:center;gap:15px;transition:all .3s ease}.category-section .category-header:hover{background:linear-gradient(135deg,#e8eaf6,#b39ddb)}.category-section .category-header .pi{color:#667eea;font-size:1rem;transition:transform .3s ease}.category-section .category-header .category-icon{font-size:1.5rem}.category-section .category-header .category-title{margin:0;color:#2c3e50;font-size:1.3rem;flex:1}.category-section .category-header .category-count{color:#7f8c8d;font-size:.9rem;background:#677eea1a;padding:4px 12px;border-radius:15px}.category-section .category-content{max-height:0;overflow:hidden;transition:max-height .4s ease-out}.category-section .category-content.expanded{max-height:2000px;transition:max-height .6s ease-in}.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px;padding:25px}.doc-card{border:1px solid #e9ecef;border-radius:12px;padding:20px;cursor:pointer;transition:all .3s ease;background:#fff;position:relative;overflow:hidden}.doc-card:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(90deg,#667eea,#764ba2);transform:scaleX(0);transition:transform .3s ease}.doc-card:hover{border-color:#667eea;box-shadow:0 8px 25px #667eea26;transform:translateY(-4px)}.doc-card:hover:before{transform:scaleX(1)}.doc-card .doc-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.doc-card .doc-card-header .doc-icon{font-size:2rem}.doc-card .doc-card-header .doc-badge{padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase}.doc-card .doc-card-header .doc-badge.doc-badge-high{background:#e8f5e8;color:#2e7d2e}.doc-card .doc-card-header .doc-badge.doc-badge-medium{background:#fff3cd;color:#856404}.doc-card .doc-card-header .doc-badge.doc-badge-low{background:#f8f9fa;color:#6c757d}.doc-card .doc-card-content .doc-name{margin:0 0 10px;color:#2c3e50;font-size:1.1rem;font-weight:600;line-height:1.3}.doc-card .doc-card-content .doc-description{color:#6c757d;font-size:.9rem;line-height:1.4;margin:0 0 10px}.doc-card .doc-card-content .doc-description ::ng-deep p{margin:0;display:inline}.doc-card .doc-card-content .doc-description ::ng-deep a{color:#667eea;text-decoration:none;pointer-events:auto}.doc-card .doc-card-content .doc-description ::ng-deep a:hover{text-decoration:underline}.doc-card .doc-card-content .doc-filename{color:#adb5bd;font-size:.8rem;font-family:Courier New,monospace}.docs-stats{display:flex;justify-content:center;gap:40px;margin-top:40px;padding:20px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.docs-stats .stat-item{text-align:center;color:#6c757d}.docs-stats .stat-item strong{color:#667eea;font-size:1.2rem}.markdown-container{flex:1;overflow-y:auto;padding:20px;background:#fff}.markdown-container .doc-breadcrumb{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding:10px 0;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:.9rem}.markdown-container .doc-breadcrumb .breadcrumb-current{color:#2c3e50;font-weight:600}.markdown-container markdown{display:block;line-height:1.6}.markdown-container markdown ::ng-deep a[href$=\".md\"]{color:#667eea;text-decoration:none;cursor:pointer;border-bottom:1px dashed #667eea}.markdown-container markdown ::ng-deep a[href$=\".md\"]:hover{text-decoration:none;border-bottom-style:solid}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px;color:#6c757d;gap:20px}.loading-container span{font-size:1.1rem}.documentation-tabs{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-panels{flex:1;display:flex}.documentation-tabs ::ng-deep .p-tabview-panels .p-tabview-panel{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-nav{background:#f8f9fa;border-bottom:2px solid #e9ecef}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link{background:transparent;border:none;color:#6c757d;font-weight:500}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link:not(.p-disabled):focus{box-shadow:0 0 0 2px #667eea33}.documentation-tabs ::ng-deep .p-tabview-nav .p-highlight .p-tabview-nav-link{background:#fff;color:#667eea;border-bottom:2px solid #667eea}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i5$1.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i6$1.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i6$1.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i6$1.TabPanel, selector: "p-tabpanel", inputs: ["lazy", "value"], outputs: ["valueChange"] }, { kind: "component", type: i6$1.TabList, selector: "p-tablist" }, { kind: "component", type: i6$1.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: EditorModule }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }] });
1574
1583
  }
1575
1584
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DocumentationContextuelleComponent, decorators: [{
1576
1585
  type: Component,
1577
- args: [{ selector: 'cilog-documentation-contextuelle', imports: [
1586
+ args: [{ selector: 'cilog-documentation-contextuelle', providers: [provideMarkdown()], imports: [
1578
1587
  CommonModule,
1579
1588
  FormsModule,
1580
1589
  ProgressSpinnerModule,
1581
1590
  TabsModule,
1582
1591
  EditorModule,
1583
1592
  MarkdownComponent
1584
- ], template: "<div class=\"documentation-container\">\r\n <!-- Menu sup\u00E9rieur -->\r\n <div class=\"documentation-menu\">\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-list\"\r\n label=\"Sommaire des documentations\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openDocumentationList()\"\r\n title=\"Voir toutes les documentations disponibles\">\r\n </button>\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-home\"\r\n label=\"Documentation courante\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openCurrentPageDoc()\"\r\n title=\"Documentation de la page actuelle\">\r\n </button>\r\n </div>\r\n\r\n <!-- Syst\u00E8me d'onglets -->\r\n <p-tabs (onClose)=\"closeTab($event)\"\r\n styleClass=\"documentation-tabs\">\r\n <p-tablist>\r\n @for (tab of tabs; track tab.value) {\r\n <p-tab [value]=\"tab.value\">{{ tab.title }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels>\r\n @for (tab of tabs; track tab.value; let i = $index) {\r\n <p-tabpanel [value]=\"tab.value\">\r\n <!-- Contenu pour onglet de liste - Version am\u00E9lior\u00E9e -->\r\n @if (tab.type === 'list') {\r\n <div class=\"docs-list-container\">\r\n <div class=\"docs-header\">\r\n <h2>\uD83D\uDCDA Sommaire de la Documentation</h2>\r\n <p class=\"docs-subtitle\">Explorez toutes les fonctionnalit\u00E9s disponibles dans LogeProj</p>\r\n </div>\r\n <!-- Barre de recherche -->\r\n <div class=\"search-bar\">\r\n <span class=\"p-input-icon-left\" style=\"width: 100%; max-width: 800px;\">\r\n <i class=\"pi pi-search\"></i>\r\n <input type=\"text\"\r\n pInputText\r\n placeholder=\"Rechercher dans les documentations...\"\r\n name=\"recherche\"\r\n [(ngModel)]=\"searchQuery\"\r\n ngDefaultControl\r\n (input)=\"filterDocumentation()\"\r\n style=\"width: 100% !important; padding: 12px 20px 12px 40px !important; border-radius: 25px !important;\">\r\n </span>\r\n </div>\r\n <!-- Liste des cat\u00E9gories -->\r\n <div class=\"categories-container\">\r\n @for (category of filteredCategories; track category.key) {\r\n <div class=\"category-section\">\r\n <div class=\"category-header\" (click)=\"toggleCategory(category.key)\">\r\n <i class=\"pi\" [ngClass]=\"category.expanded ? 'pi-chevron-down' : 'pi-chevron-right'\"></i>\r\n <span class=\"category-icon\">{{ category.icon }}</span>\r\n <h3 class=\"category-title\">{{ category.name }}</h3>\r\n <span class=\"category-count\">({{ category.docs.length }})</span>\r\n </div>\r\n <div class=\"category-content\" [ngClass]=\"{ 'expanded': category.expanded }\">\r\n <div class=\"docs-grid\">\r\n @for (doc of category.docs; track doc.fileName) {\r\n <div class=\"doc-card\"\r\n (click)=\"openDocumentationAndSwitch(doc)\"\r\n [title]=\"doc.description\">\r\n <div class=\"doc-card-content\">\r\n <h4 class=\"doc-name\">{{ doc.displayName }}</h4>\r\n <markdown class=\"doc-description\" [data]=\"doc.description\"\r\n (click)=\"onMarkdownClick($event)\"></markdown>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <!-- Stats en bas -->\r\n <div class=\"docs-stats\">\r\n <div class=\"stat-item\">\r\n <strong>{{ getTotalDocsCount() }}</strong> documentations disponibles\r\n </div>\r\n <div class=\"stat-item\">\r\n <strong>{{ getOpenTabsCount() }}</strong> onglets ouverts\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <!-- Contenu pour onglet de documentation -->\r\n @if (tab.type === 'doc') {\r\n <div class=\"markdown-container\">\r\n <!-- Breadcrumb pour navigation -->\r\n @if (tab.category) {\r\n <div class=\"doc-breadcrumb\">\r\n <span class=\"breadcrumb-item\">{{ tab.category }}</span>\r\n <i class=\"pi pi-angle-right\"></i>\r\n <span class=\"breadcrumb-current\">{{ tab.title }}</span>\r\n </div>\r\n }\r\n @if (tab.loading) {\r\n <div class=\"loading-container\">\r\n <p-progressSpinner strokeWidth=\"4\"></p-progressSpinner>\r\n <span>Chargement de la documentation...</span>\r\n </div>\r\n }\r\n @if (!tab.loading) {\r\n <markdown [data]=\"tab.content || 'Aucun contenu disponible'\"\r\n (click)=\"onMarkdownClick($event)\">\r\n </markdown>\r\n }\r\n </div>\r\n }\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n</div>\r\n", styles: [".documentation-container{display:flex;flex-direction:column;height:100%;width:100%}.documentation-menu{padding:15px;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #e9ecef;display:flex;gap:10px;flex-shrink:0}.documentation-menu .p-button{background:#fff3;border:1px solid rgba(255,255,255,.3);color:#fff}.documentation-menu .p-button:hover{background:#ffffff4d}.docs-list-container{padding:20px;flex:1;overflow-y:auto;background:#f8f9fa}.docs-header{text-align:center;margin-bottom:30px}.docs-header h2{margin:0 0 10px;color:#2c3e50;font-size:2rem}.docs-header .docs-subtitle{color:#7f8c8d;font-size:1.1rem;margin:0}.search-bar{margin-bottom:30px;display:flex;justify-content:center}.search-bar .search-input{width:100%;padding:12px 20px 12px 40px;border-radius:25px;border:2px solid #e9ecef;font-size:1rem}.search-bar .search-input:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.categories-container{max-width:1200px;margin:0 auto}.category-section{margin-bottom:25px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.category-section .category-header{padding:20px;background:linear-gradient(135deg,#f5f7fa,#c3cfe2);cursor:pointer;display:flex;align-items:center;gap:15px;transition:all .3s ease}.category-section .category-header:hover{background:linear-gradient(135deg,#e8eaf6,#b39ddb)}.category-section .category-header .pi{color:#667eea;font-size:1rem;transition:transform .3s ease}.category-section .category-header .category-icon{font-size:1.5rem}.category-section .category-header .category-title{margin:0;color:#2c3e50;font-size:1.3rem;flex:1}.category-section .category-header .category-count{color:#7f8c8d;font-size:.9rem;background:#677eea1a;padding:4px 12px;border-radius:15px}.category-section .category-content{max-height:0;overflow:hidden;transition:max-height .4s ease-out}.category-section .category-content.expanded{max-height:2000px;transition:max-height .6s ease-in}.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px;padding:25px}.doc-card{border:1px solid #e9ecef;border-radius:12px;padding:20px;cursor:pointer;transition:all .3s ease;background:#fff;position:relative;overflow:hidden}.doc-card:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(90deg,#667eea,#764ba2);transform:scaleX(0);transition:transform .3s ease}.doc-card:hover{border-color:#667eea;box-shadow:0 8px 25px #667eea26;transform:translateY(-4px)}.doc-card:hover:before{transform:scaleX(1)}.doc-card .doc-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.doc-card .doc-card-header .doc-icon{font-size:2rem}.doc-card .doc-card-header .doc-badge{padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase}.doc-card .doc-card-header .doc-badge.doc-badge-high{background:#e8f5e8;color:#2e7d2e}.doc-card .doc-card-header .doc-badge.doc-badge-medium{background:#fff3cd;color:#856404}.doc-card .doc-card-header .doc-badge.doc-badge-low{background:#f8f9fa;color:#6c757d}.doc-card .doc-card-content .doc-name{margin:0 0 10px;color:#2c3e50;font-size:1.1rem;font-weight:600;line-height:1.3}.doc-card .doc-card-content .doc-description{color:#6c757d;font-size:.9rem;line-height:1.4;margin:0 0 10px}.doc-card .doc-card-content .doc-description ::ng-deep p{margin:0;display:inline}.doc-card .doc-card-content .doc-description ::ng-deep a{color:#667eea;text-decoration:none;pointer-events:auto}.doc-card .doc-card-content .doc-description ::ng-deep a:hover{text-decoration:underline}.doc-card .doc-card-content .doc-filename{color:#adb5bd;font-size:.8rem;font-family:Courier New,monospace}.docs-stats{display:flex;justify-content:center;gap:40px;margin-top:40px;padding:20px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.docs-stats .stat-item{text-align:center;color:#6c757d}.docs-stats .stat-item strong{color:#667eea;font-size:1.2rem}.markdown-container{flex:1;overflow-y:auto;padding:20px;background:#fff}.markdown-container .doc-breadcrumb{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding:10px 0;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:.9rem}.markdown-container .doc-breadcrumb .breadcrumb-current{color:#2c3e50;font-weight:600}.markdown-container markdown{display:block;line-height:1.6}.markdown-container markdown ::ng-deep a[href$=\".md\"]{color:#667eea;text-decoration:none;cursor:pointer;border-bottom:1px dashed #667eea}.markdown-container markdown ::ng-deep a[href$=\".md\"]:hover{text-decoration:none;border-bottom-style:solid}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px;color:#6c757d;gap:20px}.loading-container span{font-size:1.1rem}.documentation-tabs{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-panels{flex:1;display:flex}.documentation-tabs ::ng-deep .p-tabview-panels .p-tabview-panel{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-nav{background:#f8f9fa;border-bottom:2px solid #e9ecef}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link{background:transparent;border:none;color:#6c757d;font-weight:500}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link:not(.p-disabled):focus{box-shadow:0 0 0 2px #667eea33}.documentation-tabs ::ng-deep .p-tabview-nav .p-highlight .p-tabview-nav-link{background:#fff;color:#667eea;border-bottom:2px solid #667eea}\n"] }]
1585
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2$3.Router }, { type: i0.NgZone }] });
1593
+ ], template: "<div class=\"documentation-container\">\r\n <!-- Menu sup\u00E9rieur -->\r\n <div class=\"documentation-menu\">\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-list\"\r\n label=\"Sommaire des documentations\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openDocumentationList()\"\r\n title=\"Voir toutes les documentations disponibles\">\r\n </button>\r\n <button pButton\r\n type=\"button\"\r\n icon=\"pi pi-home\"\r\n label=\"Documentation courante\"\r\n class=\"p-button-sm p-button-outlined\"\r\n (click)=\"openCurrentPageDoc()\"\r\n title=\"Documentation de la page actuelle\">\r\n </button>\r\n </div>\r\n\r\n <!-- Syst\u00E8me d'onglets -->\r\n <p-tabs [(value)]=\"activeTabValue\"\r\n (onClose)=\"closeTab($event)\"\r\n styleClass=\"documentation-tabs\">\r\n <p-tablist>\r\n @for (tab of tabs; track tab.value) {\r\n <p-tab [value]=\"tab.value\">{{ tab.title }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels>\r\n @for (tab of tabs; track tab.value; let i = $index) {\r\n <p-tabpanel [value]=\"tab.value\">\r\n <!-- Contenu pour onglet de liste - Version am\u00E9lior\u00E9e -->\r\n @if (tab.type === 'list') {\r\n <div class=\"docs-list-container\">\r\n <div class=\"docs-header\">\r\n <h2>\uD83D\uDCDA Sommaire de la Documentation</h2>\r\n <p class=\"docs-subtitle\">Explorez toutes les fonctionnalit\u00E9s disponibles dans LogeProj</p>\r\n </div>\r\n <!-- Barre de recherche -->\r\n <div class=\"search-bar\">\r\n <span class=\"p-input-icon-left\" style=\"width: 100%; max-width: 800px;\">\r\n <i class=\"pi pi-search\"></i>\r\n <input type=\"text\"\r\n pInputText\r\n placeholder=\"Rechercher dans les documentations...\"\r\n name=\"recherche\"\r\n [(ngModel)]=\"searchQuery\"\r\n ngDefaultControl\r\n (input)=\"filterDocumentation()\"\r\n style=\"width: 100% !important; padding: 12px 20px 12px 40px !important; border-radius: 25px !important;\">\r\n </span>\r\n </div>\r\n <!-- Liste des cat\u00E9gories -->\r\n <div class=\"categories-container\">\r\n @for (category of filteredCategories; track category.key) {\r\n <div class=\"category-section\">\r\n <div class=\"category-header\" (click)=\"toggleCategory(category.key)\">\r\n <i class=\"pi\" [ngClass]=\"category.expanded ? 'pi-chevron-down' : 'pi-chevron-right'\"></i>\r\n <span class=\"category-icon\">{{ category.icon }}</span>\r\n <h3 class=\"category-title\">{{ category.name }}</h3>\r\n <span class=\"category-count\">({{ category.docs.length }})</span>\r\n </div>\r\n <div class=\"category-content\" [ngClass]=\"{ 'expanded': category.expanded }\">\r\n <div class=\"docs-grid\">\r\n @for (doc of category.docs; track doc.fileName) {\r\n <div class=\"doc-card\"\r\n (click)=\"openDocumentationAndSwitch(doc)\"\r\n [title]=\"doc.description\">\r\n <div class=\"doc-card-content\">\r\n <h4 class=\"doc-name\">{{ doc.displayName }}</h4>\r\n <markdown class=\"doc-description\" [data]=\"doc.description\"\r\n (click)=\"onMarkdownClick($event)\"></markdown>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <!-- Stats en bas -->\r\n <div class=\"docs-stats\">\r\n <div class=\"stat-item\">\r\n <strong>{{ getTotalDocsCount() }}</strong> documentations disponibles\r\n </div>\r\n <div class=\"stat-item\">\r\n <strong>{{ getOpenTabsCount() }}</strong> onglets ouverts\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <!-- Contenu pour onglet de documentation -->\r\n @if (tab.type === 'doc') {\r\n <div class=\"markdown-container\">\r\n <!-- Breadcrumb pour navigation -->\r\n @if (tab.category) {\r\n <div class=\"doc-breadcrumb\">\r\n <span class=\"breadcrumb-item\">{{ tab.category }}</span>\r\n <i class=\"pi pi-angle-right\"></i>\r\n <span class=\"breadcrumb-current\">{{ tab.title }}</span>\r\n </div>\r\n }\r\n @if (tab.loading) {\r\n <div class=\"loading-container\">\r\n <p-progressSpinner strokeWidth=\"4\"></p-progressSpinner>\r\n <span>Chargement de la documentation...</span>\r\n </div>\r\n }\r\n @if (!tab.loading) {\r\n <markdown [data]=\"tab.content || 'Aucun contenu disponible'\"\r\n (click)=\"onMarkdownClick($event)\">\r\n </markdown>\r\n }\r\n </div>\r\n }\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n</div>\r\n", styles: [".documentation-container{display:flex;flex-direction:column;height:100%;width:100%}.documentation-menu{padding:15px;background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:1px solid #e9ecef;display:flex;gap:10px;flex-shrink:0}.documentation-menu .p-button{background:#fff3;border:1px solid rgba(255,255,255,.3);color:#fff}.documentation-menu .p-button:hover{background:#ffffff4d}.docs-list-container{padding:20px;flex:1;overflow-y:auto;background:#f8f9fa}.docs-header{text-align:center;margin-bottom:30px}.docs-header h2{margin:0 0 10px;color:#2c3e50;font-size:2rem}.docs-header .docs-subtitle{color:#7f8c8d;font-size:1.1rem;margin:0}.search-bar{margin-bottom:30px;display:flex;justify-content:center}.search-bar .search-input{width:100%;padding:12px 20px 12px 40px;border-radius:25px;border:2px solid #e9ecef;font-size:1rem}.search-bar .search-input:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.categories-container{max-width:1200px;margin:0 auto}.category-section{margin-bottom:25px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.category-section .category-header{padding:20px;background:linear-gradient(135deg,#f5f7fa,#c3cfe2);cursor:pointer;display:flex;align-items:center;gap:15px;transition:all .3s ease}.category-section .category-header:hover{background:linear-gradient(135deg,#e8eaf6,#b39ddb)}.category-section .category-header .pi{color:#667eea;font-size:1rem;transition:transform .3s ease}.category-section .category-header .category-icon{font-size:1.5rem}.category-section .category-header .category-title{margin:0;color:#2c3e50;font-size:1.3rem;flex:1}.category-section .category-header .category-count{color:#7f8c8d;font-size:.9rem;background:#677eea1a;padding:4px 12px;border-radius:15px}.category-section .category-content{max-height:0;overflow:hidden;transition:max-height .4s ease-out}.category-section .category-content.expanded{max-height:2000px;transition:max-height .6s ease-in}.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px;padding:25px}.doc-card{border:1px solid #e9ecef;border-radius:12px;padding:20px;cursor:pointer;transition:all .3s ease;background:#fff;position:relative;overflow:hidden}.doc-card:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(90deg,#667eea,#764ba2);transform:scaleX(0);transition:transform .3s ease}.doc-card:hover{border-color:#667eea;box-shadow:0 8px 25px #667eea26;transform:translateY(-4px)}.doc-card:hover:before{transform:scaleX(1)}.doc-card .doc-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.doc-card .doc-card-header .doc-icon{font-size:2rem}.doc-card .doc-card-header .doc-badge{padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase}.doc-card .doc-card-header .doc-badge.doc-badge-high{background:#e8f5e8;color:#2e7d2e}.doc-card .doc-card-header .doc-badge.doc-badge-medium{background:#fff3cd;color:#856404}.doc-card .doc-card-header .doc-badge.doc-badge-low{background:#f8f9fa;color:#6c757d}.doc-card .doc-card-content .doc-name{margin:0 0 10px;color:#2c3e50;font-size:1.1rem;font-weight:600;line-height:1.3}.doc-card .doc-card-content .doc-description{color:#6c757d;font-size:.9rem;line-height:1.4;margin:0 0 10px}.doc-card .doc-card-content .doc-description ::ng-deep p{margin:0;display:inline}.doc-card .doc-card-content .doc-description ::ng-deep a{color:#667eea;text-decoration:none;pointer-events:auto}.doc-card .doc-card-content .doc-description ::ng-deep a:hover{text-decoration:underline}.doc-card .doc-card-content .doc-filename{color:#adb5bd;font-size:.8rem;font-family:Courier New,monospace}.docs-stats{display:flex;justify-content:center;gap:40px;margin-top:40px;padding:20px;background:#fff;border-radius:12px;box-shadow:0 2px 8px #0000001a}.docs-stats .stat-item{text-align:center;color:#6c757d}.docs-stats .stat-item strong{color:#667eea;font-size:1.2rem}.markdown-container{flex:1;overflow-y:auto;padding:20px;background:#fff}.markdown-container .doc-breadcrumb{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding:10px 0;border-bottom:1px solid #e9ecef;color:#6c757d;font-size:.9rem}.markdown-container .doc-breadcrumb .breadcrumb-current{color:#2c3e50;font-weight:600}.markdown-container markdown{display:block;line-height:1.6}.markdown-container markdown ::ng-deep a[href$=\".md\"]{color:#667eea;text-decoration:none;cursor:pointer;border-bottom:1px dashed #667eea}.markdown-container markdown ::ng-deep a[href$=\".md\"]:hover{text-decoration:none;border-bottom-style:solid}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px;color:#6c757d;gap:20px}.loading-container span{font-size:1.1rem}.documentation-tabs{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-panels{flex:1;display:flex}.documentation-tabs ::ng-deep .p-tabview-panels .p-tabview-panel{flex:1;display:flex;flex-direction:column}.documentation-tabs ::ng-deep .p-tabview-nav{background:#f8f9fa;border-bottom:2px solid #e9ecef}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link{background:transparent;border:none;color:#6c757d;font-weight:500}.documentation-tabs ::ng-deep .p-tabview-nav .p-tabview-nav-link:not(.p-disabled):focus{box-shadow:0 0 0 2px #667eea33}.documentation-tabs ::ng-deep .p-tabview-nav .p-highlight .p-tabview-nav-link{background:#fff;color:#667eea;border-bottom:2px solid #667eea}\n"] }]
1594
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2$3.Router }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }] });
1586
1595
 
1587
1596
  class CilogLibService {
1588
1597
  constructor() { }