inugami-ng 0.0.1 → 0.0.3

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.
package/README.md CHANGED
@@ -1,63 +1,27 @@
1
- # InugamiNg
1
+ # Inugami-NG
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.0.0.
3
+ [![NPM Version](https://img.shields.io/npm/v/inugami-ng.svg)](https://www.npmjs.com/package/inugami-ng)
4
+ [![License: GPLv3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
4
5
 
5
- ## Code scaffolding
6
+ **Inugami-NG** is a modern Angular component library designed for the Inugami project ecosystem.
7
+ It provides high-performance, reusable, and modular UI components.
6
8
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
9
+ ---
8
10
 
9
- ```bash
10
- ng generate component component-name
11
- ```
11
+ ## 🚀 Features
12
12
 
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
13
+ * **Angular Ready**: Built with the latest Angular standards.
14
+ * **Lightweight**: Minimal footprint and dependencies.
14
15
 
15
- ```bash
16
- ng generate --help
17
- ```
16
+ ---
18
17
 
19
- ## Building
18
+ ## 📦 Installation
20
19
 
21
- To build the library, run:
20
+ Install the package using your favorite package manager:
22
21
 
23
22
  ```bash
24
- ng build inugami-ng
25
- ```
26
-
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
-
29
- ### Publishing the Library
30
-
31
- Once the project is built, you can publish your library by following these steps:
32
-
33
- 1. Navigate to the `dist` directory:
34
- ```bash
35
- cd dist/inugami-ng
36
- ```
37
-
38
- 2. Run the `npm publish` command to publish your library to the npm registry:
39
- ```bash
40
- npm publish
41
- ```
42
-
43
- ## Running unit tests
44
-
45
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
46
-
47
- ```bash
48
- ng test
49
- ```
50
-
51
- ## Running end-to-end tests
52
-
53
- For end-to-end (e2e) testing, run:
54
-
55
- ```bash
56
- ng e2e
57
- ```
58
-
59
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
-
61
- ## Additional Resources
23
+ # Using npm
24
+ npm install inugami-ng
62
25
 
63
- For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
26
+ # Using yarn
27
+ yarn add inugami-ng
@@ -1,6 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, signal, Component } from '@angular/core';
2
+ import { input, signal, computed, inject, Component } from '@angular/core';
3
3
  import { InuIcon } from 'inugami-icons';
4
+ import { InuTemplateRegistryService } from 'inugami-ng/directives';
5
+ import { NgTemplateOutlet } from '@angular/common';
4
6
 
5
7
  class InuCite {
6
8
  //==================================================================================================================
@@ -9,27 +11,26 @@ class InuCite {
9
11
  title = input('', ...(ngDevMode ? [{ debugName: "title" }] : []));
10
12
  level = input('', ...(ngDevMode ? [{ debugName: "level" }] : []));
11
13
  icon = signal(null, ...(ngDevMode ? [{ debugName: "icon" }] : []));
14
+ styleClass = signal(null, ...(ngDevMode ? [{ debugName: "styleClass" }] : []));
15
+ titleTemplate = computed(() => this.registry.getTemplate('title'), ...(ngDevMode ? [{ debugName: "titleTemplate" }] : []));
16
+ registry = inject(InuTemplateRegistryService);
12
17
  ngOnInit() {
13
18
  this.level();
14
- const level = this.level();
15
- if (!level) {
16
- return undefined;
17
- }
18
- switch (level.toLowerCase()) {
19
- case 'success':
20
- this.icon.set('approval');
21
- break;
22
- default:
23
- this.icon.set('idea');
24
- break;
25
- }
19
+ const level = this.level()?.toLowerCase() || '';
20
+ const icons = {
21
+ success: 'approval',
22
+ warning: 'warning',
23
+ danger: 'danger',
24
+ };
25
+ this.icon.set(icons[level] || 'idea');
26
+ this.styleClass.set(['inu-cite', level].join(' '));
26
27
  }
27
28
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuCite, deps: [], target: i0.ɵɵFactoryTarget.Component });
28
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: InuCite, isStandalone: true, selector: "inu-cite", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "\n<cite class=\"success\">\n <header>\n <span>\n @if(icon()){\n <inu-icon [icon]=\"icon()\"></inu-icon>\n }\n </span>\n\n <div>\n </div>\n </header>\n <ng-content />\n</cite>\n", styles: [""], dependencies: [{ kind: "component", type: InuIcon, selector: "inu-icon", inputs: ["icon", "styleclass", "size"] }] });
29
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: InuCite, isStandalone: true, selector: "inu-cite", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null } }, providers: [InuTemplateRegistryService], ngImport: i0, template: "\n<cite [class]=\"styleClass()\">\n <header>\n <span>\n @if(icon()){\n <inu-icon [icon]=\"icon()\" [size]=\"2.5\"></inu-icon>\n }\n </span>\n <div class=\"title\">\n @if(titleTemplate()){\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n } @else if (title()){\n {{title()}}\n }\n </div>\n </header>\n <div class=\"content\">\n <ng-content />\n </div>\n\n</cite>\n", styles: [".inu-cite{border-left:.25rem solid var(--neutral);padding:1rem;margin:1rem;display:block;transition:border-left-color .15s}.inu-cite header{display:flex;margin-bottom:1rem;align-items:center;gap:.5rem}.inu-cite header div{flex:1}.inu-cite header i{width:32px;height:32px}.inu-cite.info{border-left:.25rem solid var(--info)}.inu-cite.info:hover{border-left:.25rem solid var(--info-light)}.inu-cite.info header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAACXAAAAlwHUBiyCAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABJVJREFUWIXFl1tsVFUUhr+197QzZ6Y3Li1QW1pqI8QGjT4YEwxYgxgJRKOC1oDYBJqg8sILxAeIMVFD4oPBqEFsMRhiYqJBeFAxKg+YmqBgCE0EwVLkEilQoDNnbudsH4ZezqVOpzy4nmav9e///886e+/ZR4wx/J8RKXlG5pNWHFkKcheYhkJS/gZzAa0PEV13phQ6mVwHdkaxExsxbADuLQLuQ8wurNRHsClz5wbsnucwvAtm7iScjo9ziLsZa/2XUzUgpLq3A9sAKVF8JAwiO7AGXoftbhhg4jWQ6t4DvDRF4ZEQjNlCqnEOcdaFAkI7kOzeivB22AQzfBEz2Ie5dQmTGy6QlCeQRD1S24ZUzAm3YmQLic4dxQ3Yux/GqCOA8uRzSZz+7zFDf4ULjBBWN6HnLYOyhL/kILIIq/OX8UnlR4F6y5836evk+z4vKg5gbpwjf3IfJj3kL2lcE+iA10CyZymGdq/vDO7p/ZC9VVR8NHJJ3FNfgZP15oXFDPc8NrEBcZ/3c7kXesOepmiYzA3ci73BgjIejXEG3lAgKzxgJ4N75UTJ4iPh/vM7OIGzaCXjtvWYgXRDIzB7PNIMnQU375kt0Wr0/GfQC1YjsRlIrAa94NnRsdeBU+DwxhzsnoaRwdg5YKTejzTJQa94zTx0y3JMPgVOFt3WUcBlbwIG3daB038Ic/WPMY7UIOLzBdQD530GqA3ATM5rIGKBLsPt/xlz/TRq1oOgIriXjyKVDeh7nkbKKjEeilSAFuPWBTvgujdRvl0p3rE72AeV9ejmpTj2IO7lo4VCtArd8gTm+hncy7/6TMeCBhQ3xn6OulKXAsDY9EDKPfcTJn0V1boSdBRUBN26ApNP4Zz9DvAdbNHqoAHRo1pjBiorBwDbg6tuDk528zh/HkTKK1HTWpHqJiReh3v6ALj+FS9IzTw/g0208P69BlhlAz94pkerwgggOwwmX3hFt19T2FkhVY1IsAOH4OV0iAEA9vvRqnExqNIvTiiNamoPKcgBD8xTi6u9MNYeAIlNQ9+9HERPXlwE3bwMiU3zVy4Qz+2b2EChNW8G+Gpa0C1PgkzmXiKo5seRGfNDamYbdHn2ZfDfMF7ZDXwboJ3eipr1QFF5VbcQNTP02vgN8apPA/ggbpVDOroa6AuYqF1Y1IDU3R9MGk6RVR2wygngJ7wTpnfNxY18DYwxGsOeg4vD4Zk8Kdth85pe3wFmjqOcp4h1DYTNm3h5x7oGYO8ikrndCC8U7ArXhjLYdp6Unce2HVLpPKm0g3FvP8h4cZF9WGVdsDY5kUyR/bU2SYIO7N3v4ap3EJYcO3GVsojCsiLEopqZ02NYVoR4TBOPlwFnAOlFsZVY5+H/5p/sl5G1vhd4lOGP29ofmf2bElUO4DgGO13oxM3hHFeu2Q6u3EdFZ2D93JmBkajYcPL8xWPHrwymH7Jth2yusKZEIFquqaiI9JciXroBIO+4L1qxyMHamdb8REyLZUWIlmujNV/kDK+WyjfJb8NgrH3t8AfAxtvDD/e+v+SVqfBM2QDAmk0/LgL4bGf7kaly/AsYfKH6uyVp8AAAAABJRU5ErkJggg==)}.inu-cite.success{border-left:.25rem solid var(--success)}.inu-cite.success:hover{border-left:.25rem solid var(--success-light)}.inu-cite.success header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAACXAAAAlwHUBiyCAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA3ZJREFUWIXNl89vVFUUxz/nvVfoTC3TOIWVG6QoIAUr0qRJNe3CpDF2Yk3UFdtKQmIgYAJxYZr4Y4GT1oUmzn9AiaJFSDfGF0KsqVVC0YQEK27ciKM02s7P946LN868znsz0xnG1LObe885n+89786594qqspVmbCkdsFoNnLJHO6NW5ANBImsR8/hbR+bWW8mziQqIzNgTPf6R89fG93ZZ0W8EmQSOdWWcr89fG9/r9/FiRBpmb7QH3r8+PgLuV6imRWQF5a4ajKHENmZiVVzmEXar6h5E4mCMnhm+bNfLv4lP4LwGAiJxhTjCIGGalZgKr3pipDTkTgJ1BdStwHuLL8U78rlfge2NhYZavqD6yLlnrt6r5VBzDyTtRK+Vz777AHCAbZbwdtJO9NZyCFQgef2FIy7upCDHgMgDwP2WF/hckdSZ4StfQgW6QcCMPdFTtPJ/toMoYmAYguM4G8aLyMNnh78oMzZ8gpMjl+4Df7QD/sS+Qwz0H6XD6qhMqKb98IAAz4mVdsB3xnfR/dAOHu874JuTQO6AAIGf2wEHyOWyrPxyp+Kg3K0rYHphrE8NxtoFv3FriUy20qFVeD65kNgXKmDKHu10XHM20OHaBC9Zt+s6s1PfJaIBAV1W9COUgTBArDvG/scOIhLcMgF4PlcL7vkr/dF1N/Xv73IrFkQ1pMfu6O7h8MGnME0L07T48fYyqm5t+PK3NeEV0ZoNVODv4toJ0O+rnQuFHPlCAYCd8V30738SwzDCy74JuAq31iLm65WK+BrR9MJYn+OaS9X7INIZZeDQUbZv87ryvfRvZUHNrBz4S0xz8PTQ3O1ABQBODc3/JC7z1VGZ7Do3lhfJZDNlcLMr91bLVT88IABA4dGw4Ew2w80flsoiyvA6Gy6ogN3VQyHbmj214v0imoYDqhrI3dJhFOmMlgQ1fw1seBgJ8rSiKSATiC5ZJrveLDwvcBHkubPDV+77J2reiJJ2ote1iu+ULp4tm6Ipo2i9eXpk7vew+f/vlQzg3OCnadBLLcJR+KQevKEAz8yPvWyaFlgU5QLCasBNWBXlgsAiqmlvyEgF/KrDGr8NRWbsF2Ol2xLgPUzEcC8Ch0tDN9U1Xn7j2cvlw3/Gnug5OfLZqv/+16KAcJteeCXiOGsfAphm14lTQ7M1/zX/iYB22Za/jv8Bs9OlfzR+46cAAAAASUVORK5CYII=)}.inu-cite.danger{border-left:.25rem solid var(--danger)}.inu-cite.danger:hover{border-left:.25rem solid var(--danger-light)}.inu-cite.danger header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAACXAAAAlwHUBiyCAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAitJREFUWIXFl89rE1EQgL95SUrbmH9BlIJ486C0PYhCaxALHvwBinjSQC2Cf41YC/4CD/XmzYuNB0ElEQIiXgStehIvLbQNJHF3PGjCxu5m3zwqzumxZOf7dmb2vY2oKv8ziqE3tudmj6rTWyAujqO7lRdvX4XkkZAKbFenz4vKE6D051KEaq1cbz6y5nJ7AAcoIPKgfWpm8Z8KZMD7IQrLVglvgRx4sISXgCc8SCJXwAg3S4x8C0bB3cEp3P4DAMTfvhCvf0pLoQJLk2uNlSxG5j6Q9+TFk/OUrl4HoPf4Pt10gX4lyJJIbYFP2bXbTaw7WT9LSqS2Y5eAd887CehogZESQwKWgUs+tXZyBTIlBgLmaU+0YGhtlHAAO3MzR0Rl1RsOwy3wq0BS4s5Wdfb4QEAK1IAxS5ahFvRMAgDOKYsDAUV/WjMMDZ6tAr9D4t5AIFZZBto2gaAZ6EdP4sLtgUBlrfFRVc8AO74ZdGODqNUkajXRzU0T3CmXJutvWvDXVrw9P31CRJ4BZUtGK3yi3njav7DrLPCVkEqF0rUlZHyC7sMV9Md3MxxSdsJ99eZLVV0gpx2li1conb1AsbrAWO1mEDxVwFci/rqeWH8OgkPecZzTDjd1CBmfIPrwLgieK+AjMSJy4eDxReQ7EyFwL4EACW+4t4BBwgQ3CXhImOFmgb4EyDmGz46uil62wiHwvyHA1uljh13kboATxN0rP3/9PiRPsMBexS+pJFTyCd7ipAAAAABJRU5ErkJggg==)}.inu-cite.warning{border-left:.25rem solid var(--warning)}.inu-cite.warning:hover{border-left:.25rem solid var(--warning-light)}.inu-cite.warning header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAdhAAAHYQGVw7i2AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAuxJREFUWIXFl81LVFEYxn/n3PlIG/rARY2SjKJlX+odp0UhFJVQEFFEEREF9Q/UQkvUTK12rqJVixbVH9DGItoUBCHNOCNRlFGbPghqUfg1jnNPC8eZOzkznnsVe3fnvOd9nuc+59z33CuUUvzP8LiufLsjwIz3MQC+1GG2vRl3AyNdC0j6+lCiFSVaSfr63MIIV1sQjQSR1kegPDMzjbTqaIp/dQrlzgFpddrIAVZhyQ43UM4dGAlXAh+Bsn8ySYx0HY2JL07g3DjQXYAcwM+sp9MpmDMHopFqpPUB8BdZkcJIb6Ex8VkX0pkDQnWXIAfwYsmrziB1HYibIZR4D/gAXr+b5da9SQTQdaGccEO2paRIexqIDH/SgdV3wJK98+RKweXBCUbH0iTG0lwanLCv9OJJdevC6gmItdQh1Nn54Z8JxfdfVjb97afF73Gbk0qcY7Rpy/IJkFYvtrYdKAOPkUsbBqwuE/YKg7TRtTwCEs2bUeJ0HrohqN6YK63eIPMEZeIMsZatSxdgyX4KXFo1VTnGUOVCdsBAqGtLE5Bo3g6cLJSqrcqVhoIFBQCcItbS6F6AJfuKrakJ5kwJVRaFkQjV405ANLITOF4sXaPnAMAJ4mazcwHSGiiVr807AyWNFJke4kBANBIGjpZCrVgrWBsQ+LwQrFjkLAt1jLi5S1/A3NOLgjlbhIIGoUqJ1OkmRVxYeBeMhCPAsI6AR89nmEkpTh4sdT/ZQondhKOv7FMLP0qVuIlQi5ID1G8yEForMyHUdeBQ/pTdgbi5ByVe6mD13Z3k/lASgPNH/PRcLF+kIht7MWMv5gf5u6fEgA7C1LTi4ZNkdvxgaIappPaHTV53zAmIRlqB/ToIfp9gXSDn/fo14Pdq78UB4ua+hQKkdUMXQUq4cyVAU71BU72H2+0BvTdhPpTIcs2dgbjZhhJPHUAsR7Rhxp7JjKL2FSYH6IDcFpj/QUCzXUA/8GMFyX+gRD+4/TdcxvgL80fLBXEqmb0AAAAASUVORK5CYII=)}.inu-cite .content{font-style:normal}\n"], dependencies: [{ kind: "component", type: InuIcon, selector: "inu-icon", inputs: ["icon", "styleclass", "size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
29
30
  }
30
31
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuCite, decorators: [{
31
32
  type: Component,
32
- args: [{ selector: 'inu-cite', imports: [InuIcon], template: "\n<cite class=\"success\">\n <header>\n <span>\n @if(icon()){\n <inu-icon [icon]=\"icon()\"></inu-icon>\n }\n </span>\n\n <div>\n </div>\n </header>\n <ng-content />\n</cite>\n" }]
33
+ args: [{ selector: 'inu-cite', standalone: true, providers: [InuTemplateRegistryService], imports: [InuIcon, NgTemplateOutlet], template: "\n<cite [class]=\"styleClass()\">\n <header>\n <span>\n @if(icon()){\n <inu-icon [icon]=\"icon()\" [size]=\"2.5\"></inu-icon>\n }\n </span>\n <div class=\"title\">\n @if(titleTemplate()){\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n } @else if (title()){\n {{title()}}\n }\n </div>\n </header>\n <div class=\"content\">\n <ng-content />\n </div>\n\n</cite>\n", styles: [".inu-cite{border-left:.25rem solid var(--neutral);padding:1rem;margin:1rem;display:block;transition:border-left-color .15s}.inu-cite header{display:flex;margin-bottom:1rem;align-items:center;gap:.5rem}.inu-cite header div{flex:1}.inu-cite header i{width:32px;height:32px}.inu-cite.info{border-left:.25rem solid var(--info)}.inu-cite.info:hover{border-left:.25rem solid var(--info-light)}.inu-cite.info header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAACXAAAAlwHUBiyCAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABJVJREFUWIXFl1tsVFUUhr+197QzZ6Y3Li1QW1pqI8QGjT4YEwxYgxgJRKOC1oDYBJqg8sILxAeIMVFD4oPBqEFsMRhiYqJBeFAxKg+YmqBgCE0EwVLkEilQoDNnbudsH4ZezqVOpzy4nmav9e///886e+/ZR4wx/J8RKXlG5pNWHFkKcheYhkJS/gZzAa0PEV13phQ6mVwHdkaxExsxbADuLQLuQ8wurNRHsClz5wbsnucwvAtm7iScjo9ziLsZa/2XUzUgpLq3A9sAKVF8JAwiO7AGXoftbhhg4jWQ6t4DvDRF4ZEQjNlCqnEOcdaFAkI7kOzeivB22AQzfBEz2Ie5dQmTGy6QlCeQRD1S24ZUzAm3YmQLic4dxQ3Yux/GqCOA8uRzSZz+7zFDf4ULjBBWN6HnLYOyhL/kILIIq/OX8UnlR4F6y5836evk+z4vKg5gbpwjf3IfJj3kL2lcE+iA10CyZymGdq/vDO7p/ZC9VVR8NHJJ3FNfgZP15oXFDPc8NrEBcZ/3c7kXesOepmiYzA3ci73BgjIejXEG3lAgKzxgJ4N75UTJ4iPh/vM7OIGzaCXjtvWYgXRDIzB7PNIMnQU375kt0Wr0/GfQC1YjsRlIrAa94NnRsdeBU+DwxhzsnoaRwdg5YKTejzTJQa94zTx0y3JMPgVOFt3WUcBlbwIG3daB038Ic/WPMY7UIOLzBdQD530GqA3ATM5rIGKBLsPt/xlz/TRq1oOgIriXjyKVDeh7nkbKKjEeilSAFuPWBTvgujdRvl0p3rE72AeV9ejmpTj2IO7lo4VCtArd8gTm+hncy7/6TMeCBhQ3xn6OulKXAsDY9EDKPfcTJn0V1boSdBRUBN26ApNP4Zz9DvAdbNHqoAHRo1pjBiorBwDbg6tuDk528zh/HkTKK1HTWpHqJiReh3v6ALj+FS9IzTw/g0208P69BlhlAz94pkerwgggOwwmX3hFt19T2FkhVY1IsAOH4OV0iAEA9vvRqnExqNIvTiiNamoPKcgBD8xTi6u9MNYeAIlNQ9+9HERPXlwE3bwMiU3zVy4Qz+2b2EChNW8G+Gpa0C1PgkzmXiKo5seRGfNDamYbdHn2ZfDfMF7ZDXwboJ3eipr1QFF5VbcQNTP02vgN8apPA/ggbpVDOroa6AuYqF1Y1IDU3R9MGk6RVR2wygngJ7wTpnfNxY18DYwxGsOeg4vD4Zk8Kdth85pe3wFmjqOcp4h1DYTNm3h5x7oGYO8ikrndCC8U7ArXhjLYdp6Unce2HVLpPKm0g3FvP8h4cZF9WGVdsDY5kUyR/bU2SYIO7N3v4ap3EJYcO3GVsojCsiLEopqZ02NYVoR4TBOPlwFnAOlFsZVY5+H/5p/sl5G1vhd4lOGP29ofmf2bElUO4DgGO13oxM3hHFeu2Q6u3EdFZ2D93JmBkajYcPL8xWPHrwymH7Jth2yusKZEIFquqaiI9JciXroBIO+4L1qxyMHamdb8REyLZUWIlmujNV/kDK+WyjfJb8NgrH3t8AfAxtvDD/e+v+SVqfBM2QDAmk0/LgL4bGf7kaly/AsYfKH6uyVp8AAAAABJRU5ErkJggg==)}.inu-cite.success{border-left:.25rem solid var(--success)}.inu-cite.success:hover{border-left:.25rem solid var(--success-light)}.inu-cite.success header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAACXAAAAlwHUBiyCAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA3ZJREFUWIXNl89vVFUUxz/nvVfoTC3TOIWVG6QoIAUr0qRJNe3CpDF2Yk3UFdtKQmIgYAJxYZr4Y4GT1oUmzn9AiaJFSDfGF0KsqVVC0YQEK27ciKM02s7P946LN868znsz0xnG1LObe885n+89786594qqspVmbCkdsFoNnLJHO6NW5ANBImsR8/hbR+bWW8mziQqIzNgTPf6R89fG93ZZ0W8EmQSOdWWcr89fG9/r9/FiRBpmb7QH3r8+PgLuV6imRWQF5a4ajKHENmZiVVzmEXar6h5E4mCMnhm+bNfLv4lP4LwGAiJxhTjCIGGalZgKr3pipDTkTgJ1BdStwHuLL8U78rlfge2NhYZavqD6yLlnrt6r5VBzDyTtRK+Vz777AHCAbZbwdtJO9NZyCFQgef2FIy7upCDHgMgDwP2WF/hckdSZ4StfQgW6QcCMPdFTtPJ/toMoYmAYguM4G8aLyMNnh78oMzZ8gpMjl+4Df7QD/sS+Qwz0H6XD6qhMqKb98IAAz4mVdsB3xnfR/dAOHu874JuTQO6AAIGf2wEHyOWyrPxyp+Kg3K0rYHphrE8NxtoFv3FriUy20qFVeD65kNgXKmDKHu10XHM20OHaBC9Zt+s6s1PfJaIBAV1W9COUgTBArDvG/scOIhLcMgF4PlcL7vkr/dF1N/Xv73IrFkQ1pMfu6O7h8MGnME0L07T48fYyqm5t+PK3NeEV0ZoNVODv4toJ0O+rnQuFHPlCAYCd8V30738SwzDCy74JuAq31iLm65WK+BrR9MJYn+OaS9X7INIZZeDQUbZv87ryvfRvZUHNrBz4S0xz8PTQ3O1ABQBODc3/JC7z1VGZ7Do3lhfJZDNlcLMr91bLVT88IABA4dGw4Ew2w80flsoiyvA6Gy6ogN3VQyHbmj214v0imoYDqhrI3dJhFOmMlgQ1fw1seBgJ8rSiKSATiC5ZJrveLDwvcBHkubPDV+77J2reiJJ2ote1iu+ULp4tm6Ipo2i9eXpk7vew+f/vlQzg3OCnadBLLcJR+KQevKEAz8yPvWyaFlgU5QLCasBNWBXlgsAiqmlvyEgF/KrDGr8NRWbsF2Ol2xLgPUzEcC8Ch0tDN9U1Xn7j2cvlw3/Gnug5OfLZqv/+16KAcJteeCXiOGsfAphm14lTQ7M1/zX/iYB22Za/jv8Bs9OlfzR+46cAAAAASUVORK5CYII=)}.inu-cite.danger{border-left:.25rem solid var(--danger)}.inu-cite.danger:hover{border-left:.25rem solid var(--danger-light)}.inu-cite.danger header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAACXAAAAlwHUBiyCAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAitJREFUWIXFl89rE1EQgL95SUrbmH9BlIJ486C0PYhCaxALHvwBinjSQC2Cf41YC/4CD/XmzYuNB0ElEQIiXgStehIvLbQNJHF3PGjCxu5m3zwqzumxZOf7dmb2vY2oKv8ziqE3tudmj6rTWyAujqO7lRdvX4XkkZAKbFenz4vKE6D051KEaq1cbz6y5nJ7AAcoIPKgfWpm8Z8KZMD7IQrLVglvgRx4sISXgCc8SCJXwAg3S4x8C0bB3cEp3P4DAMTfvhCvf0pLoQJLk2uNlSxG5j6Q9+TFk/OUrl4HoPf4Pt10gX4lyJJIbYFP2bXbTaw7WT9LSqS2Y5eAd887CehogZESQwKWgUs+tXZyBTIlBgLmaU+0YGhtlHAAO3MzR0Rl1RsOwy3wq0BS4s5Wdfb4QEAK1IAxS5ahFvRMAgDOKYsDAUV/WjMMDZ6tAr9D4t5AIFZZBto2gaAZ6EdP4sLtgUBlrfFRVc8AO74ZdGODqNUkajXRzU0T3CmXJutvWvDXVrw9P31CRJ4BZUtGK3yi3njav7DrLPCVkEqF0rUlZHyC7sMV9Md3MxxSdsJ99eZLVV0gpx2li1conb1AsbrAWO1mEDxVwFci/rqeWH8OgkPecZzTDjd1CBmfIPrwLgieK+AjMSJy4eDxReQ7EyFwL4EACW+4t4BBwgQ3CXhImOFmgb4EyDmGz46uil62wiHwvyHA1uljh13kboATxN0rP3/9PiRPsMBexS+pJFTyCd7ipAAAAABJRU5ErkJggg==)}.inu-cite.warning{border-left:.25rem solid var(--warning)}.inu-cite.warning:hover{border-left:.25rem solid var(--warning-light)}.inu-cite.warning header i{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAdhAAAHYQGVw7i2AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAuxJREFUWIXFl81LVFEYxn/n3PlIG/rARY2SjKJlX+odp0UhFJVQEFFEEREF9Q/UQkvUTK12rqJVixbVH9DGItoUBCHNOCNRlFGbPghqUfg1jnNPC8eZOzkznnsVe3fnvOd9nuc+59z33CuUUvzP8LiufLsjwIz3MQC+1GG2vRl3AyNdC0j6+lCiFSVaSfr63MIIV1sQjQSR1kegPDMzjbTqaIp/dQrlzgFpddrIAVZhyQ43UM4dGAlXAh+Bsn8ySYx0HY2JL07g3DjQXYAcwM+sp9MpmDMHopFqpPUB8BdZkcJIb6Ex8VkX0pkDQnWXIAfwYsmrziB1HYibIZR4D/gAXr+b5da9SQTQdaGccEO2paRIexqIDH/SgdV3wJK98+RKweXBCUbH0iTG0lwanLCv9OJJdevC6gmItdQh1Nn54Z8JxfdfVjb97afF73Gbk0qcY7Rpy/IJkFYvtrYdKAOPkUsbBqwuE/YKg7TRtTwCEs2bUeJ0HrohqN6YK63eIPMEZeIMsZatSxdgyX4KXFo1VTnGUOVCdsBAqGtLE5Bo3g6cLJSqrcqVhoIFBQCcItbS6F6AJfuKrakJ5kwJVRaFkQjV405ANLITOF4sXaPnAMAJ4mazcwHSGiiVr807AyWNFJke4kBANBIGjpZCrVgrWBsQ+LwQrFjkLAt1jLi5S1/A3NOLgjlbhIIGoUqJ1OkmRVxYeBeMhCPAsI6AR89nmEkpTh4sdT/ZQondhKOv7FMLP0qVuIlQi5ID1G8yEForMyHUdeBQ/pTdgbi5ByVe6mD13Z3k/lASgPNH/PRcLF+kIht7MWMv5gf5u6fEgA7C1LTi4ZNkdvxgaIappPaHTV53zAmIRlqB/ToIfp9gXSDn/fo14Pdq78UB4ua+hQKkdUMXQUq4cyVAU71BU72H2+0BvTdhPpTIcs2dgbjZhhJPHUAsR7Rhxp7JjKL2FSYH6IDcFpj/QUCzXUA/8GMFyX+gRD+4/TdcxvgL80fLBXEqmb0AAAAASUVORK5CYII=)}.inu-cite .content{font-style:normal}\n"] }]
33
34
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }] } });
34
35
 
35
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"inugami-ng-components-inu-cite.mjs","sources":["../../../projects/inugami-ng/components/inu-cite/inu-cite.ts","../../../projects/inugami-ng/components/inu-cite/inu-cite.html","../../../projects/inugami-ng/components/inu-cite/inugami-ng-components-inu-cite.ts"],"sourcesContent":["import {Component, input, OnInit, signal, WritableSignal} from '@angular/core';\nimport {InuIcon} from 'inugami-icons';\n\n@Component({\n selector: 'inu-cite',\n imports: [InuIcon],\n templateUrl: './inu-cite.html',\n styleUrl: './inu-cite.scss',\n})\nexport class InuCite implements OnInit{\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n title = input<string | undefined | null>('');\n level = input<string | undefined | null>('');\n\n icon : WritableSignal<string|null> = signal<string|null>(null);\n\n\n ngOnInit(): void {\n this.level();\n const level = this.level();\n if (!level) {\n return undefined;\n }\n switch (level.toLowerCase()) {\n case 'success':\n this.icon.set('approval');\n break;\n default :\n this.icon.set('idea');\n break\n }\n }\n}\n","\n<cite class=\"success\">\n <header>\n <span>\n @if(icon()){\n <inu-icon [icon]=\"icon()\"></inu-icon>\n }\n </span>\n\n <div>\n </div>\n </header>\n <ng-content />\n</cite>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MASa,OAAO,CAAA;;;;AAKlB,IAAA,KAAK,GAAG,KAAK,CAA4B,EAAE,iDAAC;AAC5C,IAAA,KAAK,GAAG,KAAK,CAA4B,EAAE,iDAAC;AAE5C,IAAA,IAAI,GAAiC,MAAM,CAAc,IAAI,gDAAC;IAG9D,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,QAAQ,KAAK,CAAC,WAAW,EAAE;AACzB,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBACzB;AACF,YAAA;AACE,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;gBACrB;;IAEN;uGAzBW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECTpB,kNAcA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDTY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIN,OAAO,EAAA,UAAA,EAAA,CAAA;kBANnB,SAAS;+BACE,UAAU,EAAA,OAAA,EACX,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,kNAAA,EAAA;;;AELpB;;AAEG;;;;"}
1
+ {"version":3,"file":"inugami-ng-components-inu-cite.mjs","sources":["../../../projects/inugami-ng/components/inu-cite/inu-cite.ts","../../../projects/inugami-ng/components/inu-cite/inu-cite.html","../../../projects/inugami-ng/components/inu-cite/inugami-ng-components-inu-cite.ts"],"sourcesContent":["import {\n Component,\n computed,\n inject,\n input,\n OnInit,\n signal,\n TemplateRef,\n viewChildren,\n WritableSignal\n} from '@angular/core';\nimport {InuIcon} from 'inugami-icons';\nimport {InugamiTemplateDirective, InuTemplateRegistryService} from 'inugami-ng/directives';\nimport {NgTemplateOutlet} from '@angular/common';\n\n@Component({\n selector: 'inu-cite',\n standalone: true,\n providers: [InuTemplateRegistryService],\n imports: [InuIcon,NgTemplateOutlet],\n templateUrl: './inu-cite.html',\n styleUrl: './inu-cite.scss',\n})\nexport class InuCite implements OnInit {\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n title = input<string | undefined | null>('');\n level = input<string | undefined | null>('');\n\n icon: WritableSignal<string | null> = signal<string | null>(null);\n styleClass: WritableSignal<string | null> = signal<string | null>(null);\n titleTemplate = computed(() => this.registry.getTemplate('title'));\n registry: InuTemplateRegistryService = inject(InuTemplateRegistryService);\n\n ngOnInit(): void {\n this.level();\n const level = this.level()?.toLowerCase() || '';\n const icons: Record<string, string> = {\n success: 'approval',\n warning: 'warning',\n danger: 'danger',\n };\n\n this.icon.set(icons[level] || 'idea');\n\n this.styleClass.set(['inu-cite', level].join(' '));\n\n }\n}\n","\n<cite [class]=\"styleClass()\">\n <header>\n <span>\n @if(icon()){\n <inu-icon [icon]=\"icon()\" [size]=\"2.5\"></inu-icon>\n }\n </span>\n <div class=\"title\">\n @if(titleTemplate()){\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n } @else if (title()){\n {{title()}}\n }\n </div>\n </header>\n <div class=\"content\">\n <ng-content />\n </div>\n\n</cite>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;MAuBa,OAAO,CAAA;;;;AAKlB,IAAA,KAAK,GAAG,KAAK,CAA4B,EAAE,iDAAC;AAC5C,IAAA,KAAK,GAAG,KAAK,CAA4B,EAAE,iDAAC;AAE5C,IAAA,IAAI,GAAkC,MAAM,CAAgB,IAAI,gDAAC;AACjE,IAAA,UAAU,GAAkC,MAAM,CAAgB,IAAI,sDAAC;AACvE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,yDAAC;AAClE,IAAA,QAAQ,GAA+B,MAAM,CAAC,0BAA0B,CAAC;IAEzE,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,EAAE;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;AAC/C,QAAA,MAAM,KAAK,GAA2B;AACpC,YAAA,OAAO,EAAE,UAAU;AACnB,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,MAAM,EAAE,QAAQ;SACjB;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;AAErC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpD;uGA1BW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EALP,CAAC,0BAA0B,CAAC,0BClBzC,ocAqBA,EAAA,MAAA,EAAA,CAAA,ojMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAC,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIvB,OAAO,EAAA,UAAA,EAAA,CAAA;kBARnB,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,SAAA,EACL,CAAC,0BAA0B,CAAC,EAAA,OAAA,EAC9B,CAAC,OAAO,EAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,ocAAA,EAAA,MAAA,EAAA,CAAA,ojMAAA,CAAA,EAAA;;;AEnBrC;;AAEG;;;;"}
@@ -0,0 +1,181 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, input, effect, Directive, signal, Component } from '@angular/core';
3
+ import { CacheServices } from 'inugami-ng/services';
4
+ import { map, tap, shareReplay } from 'rxjs';
5
+ import { HttpClient } from '@angular/common/http';
6
+ import hljs from 'highlight.js';
7
+
8
+ class InuHighlightDirective {
9
+ el = inject(ElementRef);
10
+ // On utilise des signaux pour la réactivité
11
+ code = input('', { ...(ngDevMode ? { debugName: "code" } : {}), alias: 'inuHighlight' });
12
+ lang = input(undefined, ...(ngDevMode ? [{ debugName: "lang" }] : []));
13
+ constructor() {
14
+ effect(() => {
15
+ const codeValue = this.code() || '';
16
+ const language = this.lang() || '';
17
+ const nativeElement = this.el.nativeElement;
18
+ // Reset du contenu et application de la coloration
19
+ nativeElement.textContent = codeValue;
20
+ if (language) {
21
+ nativeElement.className = `language-${language}`;
22
+ }
23
+ hljs.highlightElement(nativeElement);
24
+ });
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuHighlightDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
27
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.8", type: InuHighlightDirective, isStandalone: true, selector: "code[inuHighlight], pre[inuHighlight]", inputs: { code: { classPropertyName: "code", publicName: "inuHighlight", isSignal: true, isRequired: false, transformFunction: null }, lang: { classPropertyName: "lang", publicName: "lang", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuHighlightDirective, decorators: [{
30
+ type: Directive,
31
+ args: [{
32
+ selector: 'code[inuHighlight], pre[inuHighlight]',
33
+ standalone: true
34
+ }]
35
+ }], ctorParameters: () => [], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "inuHighlight", required: false }] }], lang: [{ type: i0.Input, args: [{ isSignal: true, alias: "lang", required: false }] }] } });
36
+
37
+ class InuCode {
38
+ //==================================================================================================================
39
+ // ATTRIBUTES
40
+ //==================================================================================================================
41
+ source = input(undefined, ...(ngDevMode ? [{ debugName: "source" }] : []));
42
+ url = input(undefined, ...(ngDevMode ? [{ debugName: "url" }] : []));
43
+ tag = input(undefined, ...(ngDevMode ? [{ debugName: "tag" }] : []));
44
+ type = input(undefined, ...(ngDevMode ? [{ debugName: "type" }] : []));
45
+ title = input(undefined, ...(ngDevMode ? [{ debugName: "title" }] : []));
46
+ http = inject(HttpClient);
47
+ cache = inject(CacheServices);
48
+ sourceCode = signal('', ...(ngDevMode ? [{ debugName: "sourceCode" }] : []));
49
+ _title = signal('', ...(ngDevMode ? [{ debugName: "_title" }] : []));
50
+ _type = signal('', ...(ngDevMode ? [{ debugName: "_type" }] : []));
51
+ //==================================================================================================================
52
+ // INITIALIZE
53
+ //==================================================================================================================
54
+ constructor() {
55
+ effect(() => this.init());
56
+ }
57
+ init() {
58
+ const url = this.url();
59
+ if (this.title()) {
60
+ this._title.set(this.title());
61
+ }
62
+ if (url) {
63
+ this.loadFormUrl(url);
64
+ }
65
+ else {
66
+ const source = this.source();
67
+ if (source) {
68
+ this.sourceCode.set(source);
69
+ }
70
+ }
71
+ }
72
+ loadFormUrl(url) {
73
+ const data = this.loadFormCache(url);
74
+ if (data) {
75
+ this.initSourceCode(data);
76
+ return;
77
+ }
78
+ const cacheKey = `inu-code_${url}`;
79
+ const pending = this.cache.getPending(cacheKey);
80
+ if (pending) {
81
+ pending.subscribe(res => this.initSourceCode(res));
82
+ return;
83
+ }
84
+ const request = this.http.get(url, { responseType: 'text' })
85
+ .pipe(map(res => this.parseData(res, url)), tap(data => this.cache.set(cacheKey, data)), shareReplay(1));
86
+ this.cache.setPending(cacheKey, request);
87
+ request.subscribe();
88
+ }
89
+ initSourceCode(data) {
90
+ const values = data.filter(i => this.tag() === i.name);
91
+ if (values.length > 0) {
92
+ const sourceCodeValue = values[0];
93
+ this.sourceCode.set(sourceCodeValue.content);
94
+ const currentTitle = this.title();
95
+ if (this.title()) {
96
+ this._title.set(this.title());
97
+ }
98
+ else if (sourceCodeValue.title) {
99
+ this._title.set(sourceCodeValue.title);
100
+ }
101
+ if (this.type()) {
102
+ this._type.set(this.type());
103
+ }
104
+ else if (sourceCodeValue.type) {
105
+ this._type.set(sourceCodeValue.type);
106
+ }
107
+ }
108
+ }
109
+ //==================================================================================================================
110
+ // PARSE
111
+ //==================================================================================================================
112
+ parseData(response, url) {
113
+ const parser = new DOMParser();
114
+ const node = parser.parseFromString(response, "text/xml");
115
+ const sources = node.getElementsByTagName("src");
116
+ const result = [];
117
+ for (let i = 0; i < sources.length; i++) {
118
+ let sourceNode = sources[i];
119
+ let sourceName = sourceNode.getAttribute('name') ?? '';
120
+ let sourceContent = this.cleanContent(sourceNode.textContent ?? '');
121
+ let type = sourceNode.getAttribute('type') ?? undefined;
122
+ let title = sourceNode.getAttribute('title') ?? undefined;
123
+ result.push({
124
+ name: sourceName,
125
+ content: sourceContent,
126
+ type: type,
127
+ title: title
128
+ });
129
+ }
130
+ this.initSourceCode(result);
131
+ return result;
132
+ }
133
+ //==================================================================================================================
134
+ // TOOLS
135
+ //==================================================================================================================
136
+ loadFormCache(url) {
137
+ const cacheKey = `inu-code_${url}`;
138
+ const result = this.cache.get(cacheKey);
139
+ return result;
140
+ }
141
+ setToCache(url, value) {
142
+ const cacheKey = `inu-code_${url}`;
143
+ if (value) {
144
+ this.cache.set(cacheKey, value);
145
+ }
146
+ }
147
+ cleanContent(value) {
148
+ let result = [];
149
+ let buffer = [];
150
+ let line = value.split("\n");
151
+ let enableClean = false;
152
+ for (let i = 0; i < line.length; i++) {
153
+ if (enableClean || line[i].trim() != '') {
154
+ buffer.push(line[i]);
155
+ enableClean = true;
156
+ }
157
+ }
158
+ enableClean = false;
159
+ for (let i = buffer.length - 1; i >= 0; i--) {
160
+ if (enableClean || buffer[i].trim() != '') {
161
+ result.push(buffer[i]);
162
+ enableClean = true;
163
+ }
164
+ }
165
+ result.reverse();
166
+ return result.join('\n');
167
+ }
168
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuCode, deps: [], target: i0.ɵɵFactoryTarget.Component });
169
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: InuCode, isStandalone: true, selector: "inu-code", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: false, transformFunction: null }, tag: { classPropertyName: "tag", publicName: "tag", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"inu-code\">\n <fieldset>\n @if(_title()){\n <legend>{{_title()}}</legend>\n }\n\n @if(sourceCode()){\n <div class=\"source-code\">\n<pre [inuHighlight]=\"sourceCode()\" lang=\"java\" >\n</pre>\n </div>\n }\n\n </fieldset>\n\n\n</div>\n", styles: [".inu-code fieldset{margin:.5rem 1rem;border:.1rem solid #dddddd;border-left:.2rem solid #dddddd}.inu-code fieldset:hover{border-left:.2rem solid var(--neutral)}.inu-code fieldset legend{font-size:120%;background-color:#f1f3f5;padding-left:1rem}.inu-code fieldset .source-code{margin-left:1rem}\n"], dependencies: [{ kind: "directive", type: InuHighlightDirective, selector: "code[inuHighlight], pre[inuHighlight]", inputs: ["inuHighlight", "lang"] }] });
170
+ }
171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuCode, decorators: [{
172
+ type: Component,
173
+ args: [{ selector: 'inu-code', standalone: true, imports: [InuHighlightDirective], template: "<div class=\"inu-code\">\n <fieldset>\n @if(_title()){\n <legend>{{_title()}}</legend>\n }\n\n @if(sourceCode()){\n <div class=\"source-code\">\n<pre [inuHighlight]=\"sourceCode()\" lang=\"java\" >\n</pre>\n </div>\n }\n\n </fieldset>\n\n\n</div>\n", styles: [".inu-code fieldset{margin:.5rem 1rem;border:.1rem solid #dddddd;border-left:.2rem solid #dddddd}.inu-code fieldset:hover{border-left:.2rem solid var(--neutral)}.inu-code fieldset legend{font-size:120%;background-color:#f1f3f5;padding-left:1rem}.inu-code fieldset .source-code{margin-left:1rem}\n"] }]
174
+ }], ctorParameters: () => [], propDecorators: { source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], url: [{ type: i0.Input, args: [{ isSignal: true, alias: "url", required: false }] }], tag: [{ type: i0.Input, args: [{ isSignal: true, alias: "tag", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }] } });
175
+
176
+ /**
177
+ * Generated bundle index. Do not edit.
178
+ */
179
+
180
+ export { InuCode };
181
+ //# sourceMappingURL=inugami-ng-components-inu-code.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inugami-ng-components-inu-code.mjs","sources":["../../../projects/inugami-ng/components/inu-code/inu-code.directive.ts","../../../projects/inugami-ng/components/inu-code/inu-code.ts","../../../projects/inugami-ng/components/inu-code/inu-code.html","../../../projects/inugami-ng/components/inu-code/inugami-ng-components-inu-code.ts"],"sourcesContent":["import { Directive, ElementRef, inject, input, effect } from '@angular/core';\nimport hljs from 'highlight.js';\n\n@Directive({\n selector: 'code[inuHighlight], pre[inuHighlight]',\n standalone: true\n})\nexport class InuHighlightDirective {\n private el = inject(ElementRef);\n\n // On utilise des signaux pour la réactivité\n code = input<string>('', { alias: 'inuHighlight' });\n lang = input<string | undefined | null>(undefined);\n\n constructor() {\n effect(() => {\n const codeValue = this.code() || '';\n const language = this.lang() || '';\n const nativeElement = this.el.nativeElement;\n\n // Reset du contenu et application de la coloration\n nativeElement.textContent = codeValue;\n if (language) {\n nativeElement.className = `language-${language}`;\n }\n\n hljs.highlightElement(nativeElement);\n });\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n signal\n} from '@angular/core';\nimport {CacheServices} from \"inugami-ng/services\";\nimport {map, shareReplay, tap} from \"rxjs\";\nimport {HttpClient} from \"@angular/common/http\";\nimport {SourceCode} from './code.model';\nimport {InuHighlightDirective} from './inu-code.directive';\n\n\n@Component({\n selector: 'inu-code',\n standalone: true,\n imports: [InuHighlightDirective],\n templateUrl: './inu-code.html',\n styleUrl: './inu-code.scss',\n})\nexport class InuCode {\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n source = input<string | undefined | null>(undefined);\n url = input<string | undefined | null>(undefined);\n tag = input<string | undefined | null>(undefined);\n type = input<string | undefined | null>(undefined);\n title = input<string | undefined | null>(undefined);\n\n\n private readonly http = inject(HttpClient);\n private readonly cache = inject(CacheServices);\n\n sourceCode = signal<string>('');\n _title = signal<string>('');\n _type = signal<string>('');\n\n //==================================================================================================================\n // INITIALIZE\n //==================================================================================================================\n constructor() {\n effect(() => this.init());\n }\n\n init(): void {\n const url = this.url();\n if(this.title()){\n this._title.set(this.title()!);\n }\n\n if (url) {\n this.loadFormUrl(url);\n } else {\n const source = this.source();\n if (source) {\n this.sourceCode.set(source);\n }\n }\n }\n\n loadFormUrl(url: string) {\n\n const data = this.loadFormCache(url);\n if (data) {\n this.initSourceCode(data);\n return;\n }\n const cacheKey = `inu-code_${url}`;\n const pending = this.cache.getPending(cacheKey);\n if (pending) {\n pending.subscribe(res => this.initSourceCode(res));\n return;\n }\n\n const request = this.http.get(url, {responseType: 'text'})\n .pipe(map(res => this.parseData(res, url)),\n tap(data => this.cache.set(cacheKey, data)),\n shareReplay(1)\n );\n this.cache.setPending(cacheKey, request);\n request.subscribe();\n\n }\n\n\n initSourceCode(data: SourceCode[]) {\n\n const values = data.filter(i => this.tag() === i.name);\n if (values.length > 0) {\n const sourceCodeValue = values[0];\n this.sourceCode.set(sourceCodeValue.content!);\n\n const currentTitle = this.title();\n\n if(this.title()){\n this._title.set(this.title()!);\n }else if (sourceCodeValue.title) {\n this._title.set(sourceCodeValue.title);\n }\n\n if(this.type()){\n this._type.set(this.type()!);\n }else if (sourceCodeValue.type) {\n this._type.set(sourceCodeValue.type);\n }\n }\n }\n\n\n //==================================================================================================================\n // PARSE\n //==================================================================================================================\n parseData(response: string, url: string): SourceCode[] {\n const parser = new DOMParser();\n const node = parser.parseFromString(response, \"text/xml\");\n const sources = node.getElementsByTagName(\"src\");\n\n const result: SourceCode[] = [];\n for (let i = 0; i < sources.length; i++) {\n let sourceNode = sources[i];\n let sourceName: string = sourceNode.getAttribute('name') ?? '';\n let sourceContent: string = this.cleanContent(sourceNode.textContent ?? '');\n let type: string | undefined = sourceNode.getAttribute('type') ?? undefined;\n let title: string | undefined = sourceNode.getAttribute('title') ?? undefined;\n\n result.push({\n name: sourceName,\n content: sourceContent,\n type: type,\n title: title\n })\n }\n\n this.initSourceCode(result);\n return result;\n }\n\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n loadFormCache(url: string): SourceCode[] | undefined {\n const cacheKey = `inu-code_${url}`;\n const result: SourceCode[] | undefined = this.cache.get(cacheKey);\n return result;\n }\n\n setToCache(url: string, value: any): void {\n const cacheKey = `inu-code_${url}`;\n if (value) {\n this.cache.set(cacheKey, value);\n }\n }\n\n\n private cleanContent(value: string): string {\n let result: string[] = [];\n let buffer: string[] = [];\n\n let line = value.split(\"\\n\");\n\n let enableClean = false;\n for (let i = 0; i < line.length; i++) {\n if (enableClean || line[i].trim() != '') {\n buffer.push(line[i]);\n enableClean = true;\n }\n }\n enableClean = false;\n for (let i = buffer.length - 1; i >= 0; i--) {\n if (enableClean || buffer[i].trim() != '') {\n result.push(buffer[i]);\n enableClean = true;\n }\n }\n\n result.reverse();\n\n return result.join('\\n');\n }\n}\n","<div class=\"inu-code\">\n <fieldset>\n @if(_title()){\n <legend>{{_title()}}</legend>\n }\n\n @if(sourceCode()){\n <div class=\"source-code\">\n<pre [inuHighlight]=\"sourceCode()\" lang=\"java\" >\n</pre>\n </div>\n }\n\n </fieldset>\n\n\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}