quang 19.0.19 → 19.0.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"quang-overlay-tooltip.mjs","sources":["../../../projects/quang/overlay/tooltip/tooltip.component.ts","../../../projects/quang/overlay/tooltip/tooltip.component.html","../../../projects/quang/overlay/tooltip/tooltip.directive.ts","../../../projects/quang/overlay/tooltip/quang-overlay-tooltip.ts"],"sourcesContent":["import { animate, state, style, transition, trigger } from '@angular/animations'\nimport { ConnectionPositionPair, OverlayModule } from '@angular/cdk/overlay'\nimport { ChangeDetectionStrategy, Component, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayComponent } from 'quang/overlay/shared'\n\n@Component({\n selector: 'quang-tooltip',\n imports: [OverlayModule],\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n animations: [\n trigger('tooltip', [\n state('*', style({ opacity: 1 })),\n transition(':enter', [style({ opacity: 0 }), animate(200, style({ opacity: 1 }))]),\n transition(':leave', [style({ opacity: 1 }), animate(300, style({ opacity: 0 }))]),\n ]),\n ],\n})\nexport class QuangTooltipComponent implements QuangBaseOverlayComponent {\n content = input<string>('')\n\n quangTooltipPosition = input<'top' | 'bottom' | 'left' | 'right'>('top')\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n\n payload = input<unknown>()\n}\n","<div\n @tooltip\n class=\"quang-tooltip\"\n>\n {{ content() }}\n</div>\n","import { ComponentType } from '@angular/cdk/portal'\nimport { Directive, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayDirective } from 'quang/overlay/shared'\n\nimport { QuangTooltipComponent } from './tooltip.component'\n\n@Directive({\n selector: '[quangTooltip]',\n})\nexport class QuangTooltipDirective extends QuangBaseOverlayDirective<QuangTooltipComponent> {\n override targetComponentType = signal<ComponentType<QuangTooltipComponent> | undefined>(QuangTooltipComponent)\n\n override content = input.required<string>({ alias: 'quangTooltip' })\n\n override showMethod = input<'click' | 'hover'>('hover')\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quang-overlay-tooltip.mjs","sources":["../../../projects/quang/overlay/tooltip/tooltip.component.ts","../../../projects/quang/overlay/tooltip/tooltip.component.html","../../../projects/quang/overlay/tooltip/tooltip.directive.ts","../../../projects/quang/overlay/tooltip/quang-overlay-tooltip.ts"],"sourcesContent":["import { animate, state, style, transition, trigger } from '@angular/animations'\nimport { ConnectionPositionPair, OverlayModule } from '@angular/cdk/overlay'\nimport { ChangeDetectionStrategy, Component, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayComponent } from 'quang/overlay/shared'\n\n@Component({\n selector: 'quang-tooltip',\n imports: [OverlayModule],\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n animations: [\n trigger('tooltip', [\n state('*', style({ opacity: 1 })),\n transition(':enter', [style({ opacity: 0 }), animate(200, style({ opacity: 1 }))]),\n transition(':leave', [style({ opacity: 1 }), animate(300, style({ opacity: 0 }))]),\n ]),\n ],\n})\nexport class QuangTooltipComponent implements QuangBaseOverlayComponent {\n overlayContent = input.required<string>()\n\n quangTooltipPosition = input<'top' | 'bottom' | 'left' | 'right'>('top')\n\n positionPair = signal<ConnectionPositionPair | null>(null)\n\n payload = input<unknown>()\n}\n","<div\n @tooltip\n class=\"quang-tooltip\"\n>\n {{ overlayContent() }}\n</div>\n","import { ComponentType } from '@angular/cdk/portal'\nimport { Directive, input, signal } from '@angular/core'\n\nimport { QuangBaseOverlayDirective } from 'quang/overlay/shared'\n\nimport { QuangTooltipComponent } from './tooltip.component'\n\n@Directive({\n selector: '[quangTooltip]',\n})\nexport class QuangTooltipDirective extends QuangBaseOverlayDirective<QuangTooltipComponent> {\n override targetComponentType = signal<ComponentType<QuangTooltipComponent> | undefined>(QuangTooltipComponent)\n\n override content = input.required<string>({ alias: 'quangTooltip' })\n\n override showMethod = input<'click' | 'hover'>('hover')\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/loader/README.md CHANGED
@@ -1,14 +1,81 @@
1
1
  # Quang Loader
2
2
 
3
- Quang Loader is a fast way to implements an overlay loader to a project.
3
+ Quang Loader provides a simple and efficient way to implement an overlay loader in your project. It includes a default spinner but also supports custom content.
4
4
 
5
- ### QuangLoaderComponent
5
+ ## QuangLoaderComponent
6
6
 
7
- The `QuangLoaderComponent` is a component that shows a loader in page. It Has a default spinner but it could be replaced with custom content.
7
+ The `QuangLoaderComponent` displays a loader overlay on the page. It is highly customizable and can be used to indicate loading states in your application.
8
8
 
9
- To use it:
9
+ ### Inputs
10
10
 
11
- - Import [QuangLoaderComponent](./loader.component.ts) to your component (suggested app.component.ts).
12
- - Import [quangLoaderInterceptor](./loader-interceptor.ts) and [provideLoader](./loader-providers.ts) to Providers (app.config.ts)
11
+ - `showAtLeastFor`: `number` — Minimum time (in milliseconds) to show the loader for. Default: `500`.
12
+ - You can use `ng-content` to project custom content (e.g., a custom spinner or message).
13
13
 
14
- Read [`Component @example`](./loader.component.ts) [`Interceptor @example`](./loader-interceptor.ts) [`Providers @example`](./loader-providers.ts) for usage.
14
+ > **Note:** Loader visibility is managed internally by the loader service and HTTP interceptor, not by an input property.
15
+
16
+ ### Usage
17
+
18
+ 1. **Import the Component**:
19
+ ```typescript
20
+ import { QuangLoaderComponent } from 'quang/loader'
21
+ ```
22
+ 2. **Add to Template**:
23
+ ```html
24
+ <quang-loader></quang-loader>
25
+ ```
26
+ 3. **Custom Content**:
27
+ ```html
28
+ <quang-loader>
29
+ <div class="custom-spinner">Loading...</div>
30
+ </quang-loader>
31
+ ```
32
+
33
+ ## Loader Interceptor
34
+
35
+ The `quangLoaderInterceptor` automatically shows and hides the loader during HTTP requests.
36
+
37
+ ### Usage
38
+
39
+ 1. **Import the Interceptor**:
40
+ ```typescript
41
+ import { quangLoaderInterceptor } from 'quang/loader'
42
+
43
+ providers: [
44
+ { provide: HTTP_INTERCEPTORS, useClass: quangLoaderInterceptor, multi: true }
45
+ ]
46
+ ```
47
+ 2. **Configuration**:
48
+ Configure the interceptor as needed for your application.
49
+
50
+ ## Loader Providers
51
+
52
+ The `provideQuangLoaderExcludedUrls` function configures the loader globally. It allows you to customize the loader's behavior, including setting delays, custom templates, and excluding specific URLs from triggering the loader.
53
+
54
+ ### Usage
55
+
56
+ 1. **Import the Provider**:
57
+ ```typescript
58
+ import { provideQuangLoaderExcludedUrls } from 'quang/loader';
59
+
60
+ providers: [
61
+ provideQuangLoaderExcludedUrls([
62
+ { url: 'assets', method: 'GET' },
63
+ { url: '/api/health', method: 'GET' },
64
+ ]),
65
+ ];
66
+ ```
67
+
68
+ ### Excluding URLs from the Loader
69
+
70
+ To exclude specific URLs from triggering the loader, use the `provideQuangLoaderExcludedUrls` function. This function accepts an array of URL objects. Any HTTP request matching these URLs will not activate the loader.
71
+
72
+ Example:
73
+
74
+ ```typescript
75
+ provideQuangLoaderExcludedUrls([
76
+ { url: 'assets', method: 'GET' },
77
+ { url: '/api/health', method: 'GET' },
78
+ ]);
79
+ ```
80
+
81
+ In this example, requests to `assets` and `/api/health` with the `GET` method will not show the loader, ensuring that static assets or health check endpoints do not interfere with the user experience.
@@ -0,0 +1,97 @@
1
+ # QuangModalComponent
2
+
3
+ The `QuangModalComponent` is an overlay component used directly in its parent component.
4
+
5
+ ## Features
6
+
7
+ - Modal overlay for displaying content
8
+ - Configurable size and position
9
+ - Supports animations for opening and closing
10
+
11
+ ## Inputs
12
+
13
+ - `position`: `'right' | 'left' | 'center'` (required) — Position of the modal.
14
+ - `height`: `string` — Height of the modal. Default: `'80vh'`.
15
+ - `width`: `string` — Width of the modal. Default: `'80vw'`.
16
+ - `padding`: `string` — Padding inside the modal. Default: `'0 1rem'`.
17
+ - `containerClass`: `string` — Custom CSS class for the modal container.
18
+ - `animationMode`: `'SLIDE_FROM_LEFT_TO_RIGHT' | 'SLIDE_FROM_RIGHT_TO_LEFT' | 'SLIDE_TOP_TO_BOTTOM' | 'SLIDE_BOTTOM_TO_TOP' | 'FADE'` — Animation mode for the modal.
19
+ - `backgroundColor`: `string` — Background color for the modal.
20
+ - `showBackdrop`: `boolean` — Whether to show the backdrop. Default: `true`.
21
+ - Use `ng-container` with `header`, `body`, and `footer` slots for custom content.
22
+
23
+ ## Outputs
24
+
25
+ - `backdropClick`: Emits when the user clicks on the backdrop (outside the modal).
26
+
27
+ ## Usage
28
+
29
+ ### HTML
30
+
31
+ ```html
32
+ <quang-modal
33
+ (backdropClick)="closeModal()"
34
+ animationMode="SLIDE_BOTTOM_TO_TOP"
35
+ height="80vh"
36
+ padding="0"
37
+ position="center"
38
+ [showBackdrop]="true"
39
+ >
40
+ <ng-container header>
41
+ <div class="d-flex justify-content-between mt-2">
42
+ <h3>{{ 'title.header' | transloco }}</h3>
43
+ <button
44
+ (click)="closeModal()"
45
+ class="btn btn-outline-secondary"
46
+ type="button"
47
+ >
48
+ X
49
+ </button>
50
+ </div>
51
+ </ng-container>
52
+ <ng-container body>
53
+ <h3>{{ content() }}</h3>
54
+ <p>
55
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
56
+ magna aliqua.
57
+ </p>
58
+ <img
59
+ alt="test"
60
+ src="https://picsum.photos/200/300"
61
+ />
62
+ </ng-container>
63
+ <ng-container footer>
64
+ <div class="d-flex mb-3 gap-3 w-100">
65
+ <h3 class="d-flex flex-column flex-grow-1">{{ 'title.footer' | transloco }}</h3>
66
+ <button
67
+ (click)="closeModal()"
68
+ class="btn btn-outline-secondary"
69
+ type="button"
70
+ >
71
+ {{ 'buttons.close' | transloco }}
72
+ </button>
73
+ </div>
74
+ </ng-container>
75
+ </quang-modal>
76
+ ```
77
+
78
+ ### TypeScript
79
+
80
+ ```typescript
81
+ import { signal } from '@angular/core';
82
+
83
+ showModal = signal(false);
84
+ content = signal('Modal Content');
85
+
86
+ openModal() {
87
+ showModal.set(true);
88
+ }
89
+
90
+ closeModal() {
91
+ showModal.set(false);
92
+ }
93
+ ```
94
+
95
+ ## Notes
96
+
97
+ This component uses Angular CDK's `Overlay` and `Portal` modules for rendering modals dynamically. Refer to the component's API for all available configuration options.
@@ -0,0 +1,40 @@
1
+ # QuangPopoverComponent
2
+
3
+ The `QuangPopoverComponent` is a base overlay popover with its own style, used via the `[quangPopover]` directive.
4
+
5
+ ## Features
6
+
7
+ - Popover overlay for displaying additional information
8
+ - Configurable trigger and position (via directive)
9
+ - Supports custom content via `TemplateRef`
10
+
11
+ ## Inputs (via Directive)
12
+
13
+ - `quangPopover`: `TemplateRef<any> | null` (required) — The template to display in the popover.
14
+ - `overlayPosition`: `string` — Position of the popover. Accepts values like `'top'`, `'top-left'`, `'top-right'`, `'bottom'`, `'bottom-left'`, `'bottom-right'`, `'left'`, `'right'`
15
+ - `showMethod`: `string` — Trigger for the popover. Accepts values like `'click'`, `'hover'`, `'focus'`.
16
+ - `payload`: `any` — Optional data to pass to the popover template.
17
+
18
+ ## Outputs
19
+
20
+ - _(none)_ — The popover closes automatically when the user clicks outside or triggers the close logic.
21
+
22
+ ## Usage
23
+
24
+ ```html
25
+ <button
26
+ [overlayPosition]="'top'"
27
+ [quangPopover]="popoverTemplate"
28
+ [showMethod]="'click'"
29
+ >
30
+ Open Popover
31
+ </button>
32
+
33
+ <ng-template #popoverTemplate>
34
+ <div>Popover Content</div>
35
+ </ng-template>
36
+ ```
37
+
38
+ ## Notes
39
+
40
+ This component is used via the `[quangPopover]` directive and extends the `QuangBaseOverlayComponent`, inheriting features such as dynamic positioning and styling. The popover content is always provided as a `TemplateRef`.
@@ -3,11 +3,11 @@ import { TemplateRef } from '@angular/core';
3
3
  import { QuangBaseOverlayComponent } from 'quang/overlay/shared';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class QuangPopoverComponent implements QuangBaseOverlayComponent {
6
- content: import("@angular/core").InputSignal<TemplateRef<any> | null>;
6
+ overlayContent: import("@angular/core").InputSignal<TemplateRef<any> | null>;
7
7
  positionPair: import("@angular/core").WritableSignal<ConnectionPositionPair | null>;
8
8
  payload: import("@angular/core").InputSignal<any>;
9
9
  getPopoverPosition: import("@angular/core").WritableSignal<string>;
10
10
  onChangePositionPair$: import("rxjs").Subscription;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<QuangPopoverComponent, never>;
12
- static ɵcmp: i0.ɵɵComponentDeclaration<QuangPopoverComponent, "quang-popover", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<QuangPopoverComponent, "quang-popover", never, { "overlayContent": { "alias": "overlayContent"; "required": false; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13
13
  }
@@ -1,9 +1,9 @@
1
1
  import { ConnectionPositionPair } from '@angular/cdk/overlay';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare abstract class QuangBaseOverlayComponent {
4
- content: import("@angular/core").InputSignal<any>;
4
+ overlayContent: import("@angular/core").InputSignal<any>;
5
5
  payload: import("@angular/core").InputSignal<any>;
6
6
  positionPair: import("@angular/core").WritableSignal<ConnectionPositionPair | null>;
7
7
  static ɵfac: i0.ɵɵFactoryDeclaration<QuangBaseOverlayComponent, never>;
8
- static ɵcmp: i0.ɵɵComponentDeclaration<QuangBaseOverlayComponent, "quang-base-overlay-component", never, { "content": { "alias": "content"; "required": true; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8
+ static ɵcmp: i0.ɵɵComponentDeclaration<QuangBaseOverlayComponent, "quang-base-overlay-component", never, { "overlayContent": { "alias": "overlayContent"; "required": true; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9
9
  }
@@ -0,0 +1,64 @@
1
+ # QuangToastComponent
2
+
3
+ The `QuangToastComponent` is an overlay component used directly in its parent component and managed via the `QuangToastService`.
4
+
5
+ ## Features
6
+
7
+ - Toast notifications for displaying messages
8
+ - Configurable duration, type, and position (via service)
9
+ - Supports multiple toast instances and custom templates
10
+
11
+ ## Inputs
12
+
13
+ - `showAtLeastFor`: `number` — Minimum time (in milliseconds) to show the toast for. Default: `500`.
14
+
15
+ > **Note:** All toast configuration (message, type, position, timing, etc.) is provided via the `QuangToastService.openToast()` method, not as component inputs.
16
+
17
+ ## Outputs
18
+
19
+ - *(none)* — Toast dismissal is managed internally by the service.
20
+
21
+ ## Usage
22
+
23
+ ### HTML
24
+
25
+ ```html
26
+ <quang-toast />
27
+ ```
28
+
29
+ ### TypeScript
30
+
31
+ ```typescript
32
+ import { inject } from '@angular/core'
33
+ import { QuangToastService } from 'quang/overlay/toast'
34
+
35
+ quangToast = inject(QuangToastService)
36
+
37
+ openToast(type: 'success' | 'error') {
38
+ quangToast.openToast({
39
+ type,
40
+ title: type === 'success' ? 'Success' : 'Error',
41
+ position: 'top-right',
42
+ text: 'This is a toast message',
43
+ timing: 5000,
44
+ showCloseButton: true,
45
+ })
46
+ }
47
+ ```
48
+
49
+ #### ToastData Options
50
+
51
+ - `type`: `'success' | 'warning' | 'error'` (required)
52
+ - `title?`: `string`
53
+ - `position`: `'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'center' | 'top-center' | 'bottom-center'`
54
+ - `timing`: `number` (required)
55
+ - `text?`: `string`
56
+ - `showCloseButton?`: `boolean`
57
+ - `customTemplate?`: `TemplateRef<any>`
58
+ - `customIcon?`: `string`
59
+ - `hideHeader?`: `boolean`
60
+ - ...and more (see service for full list)
61
+
62
+ ## Notes
63
+
64
+ This component uses the `QuangToastService` for managing toast instances dynamically. All toast display logic and configuration is handled via the service.
@@ -0,0 +1,36 @@
1
+ # QuangTooltipComponent
2
+
3
+ The `QuangTooltipComponent` is a base overlay tooltip with its own style, used via the `[quangTooltip]` directive.
4
+
5
+ ## Features
6
+
7
+ - Tooltip overlay for displaying additional information
8
+ - Configurable trigger and position (via directive)
9
+ - Supports animations for showing and hiding
10
+
11
+ ## Inputs (via Directive)
12
+
13
+ - `quangTooltip`: `string` (required) — The content to display in the tooltip.
14
+ - `showMethod`: `'click' | 'hover'` — Specifies the trigger for the tooltip. Default: `'hover'`.
15
+ - `quangTooltipPosition`: `'top' | 'bottom' | 'left' | 'right'` — Position of the tooltip. Default: `'top'`.
16
+ - `payload`: `unknown` — Optional data to pass to the tooltip.
17
+
18
+ ## Outputs
19
+
20
+ - *(none)* — The tooltip closes automatically when the user clicks outside or triggers the close logic.
21
+
22
+ ## Usage
23
+
24
+ ```html
25
+ <button
26
+ [quangTooltip]="'This is a tooltip'"
27
+ [showMethod]="'hover'"
28
+ [quangTooltipPosition]="'top'"
29
+ >
30
+ Hover me
31
+ </button>
32
+ ```
33
+
34
+ ## Notes
35
+
36
+ This component uses Angular animations for smooth transitions and extends the `QuangBaseOverlayComponent` for dynamic positioning. The tooltip is always used via the `[quangTooltip]` directive.
@@ -2,10 +2,10 @@ import { ConnectionPositionPair } from '@angular/cdk/overlay';
2
2
  import { QuangBaseOverlayComponent } from 'quang/overlay/shared';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class QuangTooltipComponent implements QuangBaseOverlayComponent {
5
- content: import("@angular/core").InputSignal<string>;
5
+ overlayContent: import("@angular/core").InputSignal<string>;
6
6
  quangTooltipPosition: import("@angular/core").InputSignal<"top" | "bottom" | "left" | "right">;
7
7
  positionPair: import("@angular/core").WritableSignal<ConnectionPositionPair | null>;
8
8
  payload: import("@angular/core").InputSignal<unknown>;
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<QuangTooltipComponent, never>;
10
- static ɵcmp: i0.ɵɵComponentDeclaration<QuangTooltipComponent, "quang-tooltip", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "quangTooltipPosition": { "alias": "quangTooltipPosition"; "required": false; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<QuangTooltipComponent, "quang-tooltip", never, { "overlayContent": { "alias": "overlayContent"; "required": true; "isSignal": true; }; "quangTooltipPosition": { "alias": "quangTooltipPosition"; "required": false; "isSignal": true; }; "payload": { "alias": "payload"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11
11
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "quang",
3
3
  "sideEffects": false,
4
- "version": "19.0.19",
4
+ "version": "19.0.21",
5
5
  "dependencies": {
6
6
  "tslib": "^2.3.0"
7
7
  },
@@ -86,14 +86,14 @@
86
86
  "types": "./auth/mobile/index.d.ts",
87
87
  "default": "./fesm2022/quang-auth-mobile.mjs"
88
88
  },
89
- "./components/checkbox": {
90
- "types": "./components/checkbox/index.d.ts",
91
- "default": "./fesm2022/quang-components-checkbox.mjs"
92
- },
93
89
  "./components/autocomplete": {
94
90
  "types": "./components/autocomplete/index.d.ts",
95
91
  "default": "./fesm2022/quang-components-autocomplete.mjs"
96
92
  },
93
+ "./components/checkbox": {
94
+ "types": "./components/checkbox/index.d.ts",
95
+ "default": "./fesm2022/quang-components-checkbox.mjs"
96
+ },
97
97
  "./components/date": {
98
98
  "types": "./components/date/index.d.ts",
99
99
  "default": "./fesm2022/quang-components-date.mjs"
@@ -1,21 +1,34 @@
1
1
  # Quang Translation
2
2
 
3
- `Quang Translation` is a wrapper of `Transloco` to implements commons features
3
+ Quang Translation is a wrapper around `@jsverse/transloco` that implements common features for internationalization (i18n) in Angular projects.
4
4
 
5
- ### QuangTranslationLoaderService
5
+ ## Overview
6
6
 
7
- [QuangTranslationLoaderService](./translation-loader.service.ts) loads translations' files.
7
+ This package provides:
8
+ - A translation loader service for loading translation files
9
+ - Providers for configuring translation behavior
10
+ - A translation service for runtime translation management
11
+ - Translation tokens for use throughout your project
8
12
 
9
- ### Translation Providers
13
+ ## QuangTranslationLoaderService
10
14
 
11
- `Translation Providers` provides a configurable setup for internationalization (i18n) using the @jsverse/transloco library.
15
+ [`QuangTranslationLoaderService`](./translation-loader.service.ts) loads translation files dynamically and integrates with Transloco.
12
16
 
13
- Read [@example](./translation-providers.ts) for usage.
17
+ ## Translation Providers
14
18
 
15
- ### QuangTranslationService
19
+ Translation providers offer a configurable setup for i18n using the `@jsverse/transloco` library. See [`translation-providers.ts`](./translation-providers.ts) for usage examples and configuration options.
16
20
 
17
- [QuangTranslationService](./translation.service.ts) is responsible for managing translations within the application. It leverages the @jsverse/transloco library for core translation functionalities.
21
+ ## QuangTranslationService
18
22
 
19
- ### Translation Tokens
23
+ [`QuangTranslationService`](./translation.service.ts) manages translations at runtime, leveraging `@jsverse/transloco` for core translation features. It provides methods for switching languages, retrieving translations, and more.
20
24
 
21
- [`Translation Tokens`](./translations.tokens.ts) includes a set of tokens that you can use inside your project.
25
+ ## Translation Tokens
26
+
27
+ [`translations.tokens.ts`](./translations.tokens.ts) includes a set of injectable tokens for customizing and extending translation behavior in your project.
28
+
29
+ ## Usage
30
+
31
+ Refer to the linked files above for implementation details and usage examples. For most applications, you will:
32
+ - Register the translation providers in your app module
33
+ - Use `QuangTranslationService` for runtime translation management
34
+ - Use the provided tokens and loader service as needed for advanced scenarios