@shival99/z-ui 2.0.29 → 2.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/fesm2022/shival99-z-ui-components-z-calendar.mjs +294 -7
  2. package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
  3. package/fesm2022/shival99-z-ui-components-z-chat.mjs +1 -1
  4. package/fesm2022/shival99-z-ui-components-z-chat.mjs.map +1 -1
  5. package/fesm2022/shival99-z-ui-components-z-drawer.mjs +16 -4
  6. package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -1
  7. package/fesm2022/shival99-z-ui-components-z-editor.mjs +43 -25
  8. package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -1
  9. package/fesm2022/shival99-z-ui-components-z-gallery.mjs +457 -532
  10. package/fesm2022/shival99-z-ui-components-z-gallery.mjs.map +1 -1
  11. package/fesm2022/shival99-z-ui-components-z-kanban.mjs +1 -1
  12. package/fesm2022/shival99-z-ui-components-z-kanban.mjs.map +1 -1
  13. package/fesm2022/shival99-z-ui-components-z-media-player.mjs +658 -0
  14. package/fesm2022/shival99-z-ui-components-z-media-player.mjs.map +1 -0
  15. package/fesm2022/shival99-z-ui-components-z-modal.mjs +16 -4
  16. package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -1
  17. package/fesm2022/shival99-z-ui-components-z-qrcode.mjs +383 -0
  18. package/fesm2022/shival99-z-ui-components-z-qrcode.mjs.map +1 -0
  19. package/fesm2022/shival99-z-ui-components-z-scrollarea.mjs +131 -0
  20. package/fesm2022/shival99-z-ui-components-z-scrollarea.mjs.map +1 -0
  21. package/fesm2022/shival99-z-ui-components-z-show-more.mjs +121 -0
  22. package/fesm2022/shival99-z-ui-components-z-show-more.mjs.map +1 -0
  23. package/fesm2022/shival99-z-ui-components-z-table.mjs +988 -137
  24. package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -1
  25. package/fesm2022/shival99-z-ui-components-z-tabs.mjs +135 -61
  26. package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -1
  27. package/fesm2022/shival99-z-ui-components-z-tags.mjs +24 -14
  28. package/fesm2022/shival99-z-ui-components-z-tags.mjs.map +1 -1
  29. package/fesm2022/shival99-z-ui-components-z-toast.mjs +124 -31
  30. package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -1
  31. package/fesm2022/shival99-z-ui-i18n.mjs +70 -0
  32. package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -1
  33. package/package.json +17 -1
  34. package/types/shival99-z-ui-components-z-calendar.d.ts +10 -5
  35. package/types/shival99-z-ui-components-z-drawer.d.ts +14 -2
  36. package/types/shival99-z-ui-components-z-editor.d.ts +13 -8
  37. package/types/shival99-z-ui-components-z-gallery.d.ts +97 -6
  38. package/types/shival99-z-ui-components-z-media-player.d.ts +123 -0
  39. package/types/shival99-z-ui-components-z-modal.d.ts +14 -2
  40. package/types/shival99-z-ui-components-z-qrcode.d.ts +76 -0
  41. package/types/shival99-z-ui-components-z-scrollarea.d.ts +46 -0
  42. package/types/shival99-z-ui-components-z-show-more.d.ts +36 -0
  43. package/types/shival99-z-ui-components-z-table.d.ts +59 -14
  44. package/types/shival99-z-ui-components-z-tabs.d.ts +10 -6
  45. package/types/shival99-z-ui-components-z-tags.d.ts +3 -0
  46. package/types/shival99-z-ui-components-z-toast.d.ts +35 -2
@@ -1,9 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, makeEnvironmentProviders, Injector, PLATFORM_ID, NgZone, Injectable } from '@angular/core';
2
+ import { InjectionToken, inject, input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, Injector, PLATFORM_ID, NgZone, Injectable, makeEnvironmentProviders } from '@angular/core';
3
3
  import { NgxSonnerToaster, toast } from '@shival99/ngx-sonner';
4
4
  import { ZThemeService, ZTranslateService } from '@shival99/z-ui/services';
5
5
  import { zMergeClasses } from '@shival99/z-ui/utils';
6
6
  import { cva } from 'class-variance-authority';
7
+ import { ZIconComponent } from '@shival99/z-ui/components/z-icon';
7
8
  import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
8
9
  import { ComponentPortal } from '@angular/cdk/portal';
9
10
  import { DOCUMENT, isPlatformBrowser } from '@angular/common';
@@ -76,35 +77,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
76
77
  args: [{ selector: 'z-toast, z-toaster', imports: [NgxSonnerToaster], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, exportAs: 'zToast', template: "<ngx-sonner-toaster\n [theme]=\"detectTheme()\"\n [class]=\"zClasses()\"\n [position]=\"effectivePosition()\"\n [richColors]=\"effectiveRichColors()\"\n [expand]=\"effectiveExpand()\"\n [duration]=\"effectiveDuration()\"\n [visibleToasts]=\"effectiveVisibleToasts()\"\n [closeButton]=\"effectiveCloseButton()\"\n [toastOptions]=\"zToastOptions()\"\n [dir]=\"effectiveDir()\" />\n" }]
77
78
  }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], zVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "zVariant", required: false }] }], zTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "zTheme", required: false }] }], zPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "zPosition", required: false }] }], zRichColors: [{ type: i0.Input, args: [{ isSignal: true, alias: "zRichColors", required: false }] }], zExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "zExpand", required: false }] }], zDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "zDuration", required: false }] }], zVisibleToasts: [{ type: i0.Input, args: [{ isSignal: true, alias: "zVisibleToasts", required: false }] }], zCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "zCloseButton", required: false }] }], zToastOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "zToastOptions", required: false }] }], zDir: [{ type: i0.Input, args: [{ isSignal: true, alias: "zDir", required: false }] }] } });
78
79
 
79
- /**
80
- * Provides global toast configuration options
81
- * Use this in app.config.ts: providers: [provideZToast({ zPosition: 'top-right' })]
82
- *
83
- * @param config - Partial configuration to override default options
84
- * @returns EnvironmentProviders for the toast service
85
- *
86
- * @example
87
- * ```typescript
88
- * // In app.config.ts
89
- * export const appConfig: ApplicationConfig = {
90
- * providers: [
91
- * provideZToast({
92
- * zPosition: 'top-right',
93
- * zDuration: 5000,
94
- * zCloseButton: true,
95
- * }),
96
- * ],
97
- * };
98
- * ```
99
- */
100
- function provideZToast(config) {
101
- const mergedConfig = {
102
- ...Z_TOASTER_DEFAULT_CONFIG,
103
- ...config,
104
- };
105
- return makeEnvironmentProviders([{ provide: Z_TOASTER_CONFIG, useValue: mergedConfig }]);
106
- }
107
-
108
80
  class ZToastService {
109
81
  _overlay = inject(Overlay);
110
82
  _injector = inject(Injector);
@@ -157,6 +129,25 @@ class ZToastService {
157
129
  this._moveToTop();
158
130
  return toast.promise(promise, messages);
159
131
  }
132
+ custom(config, options) {
133
+ this._ensureToasterAttached();
134
+ this._moveToTop();
135
+ // Sinh ID duy nhất nếu chưa được cấu hình
136
+ const toastId = options?.id ?? Math.random().toString(36).substring(2, 9);
137
+ const updatedConfig = {
138
+ ...config,
139
+ toastId,
140
+ };
141
+ // Gọi phương thức custom của ngx-sonner với unstyled: true để tùy biến hoàn toàn UI
142
+ return toast.custom(ZToastCustomComponent, {
143
+ ...options,
144
+ unstyled: true,
145
+ id: toastId,
146
+ componentProps: {
147
+ config: updatedConfig,
148
+ },
149
+ });
150
+ }
160
151
  dismiss(toastId) {
161
152
  toast.dismiss(toastId);
162
153
  }
@@ -275,9 +266,111 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
275
266
  args: [{ providedIn: 'root' }]
276
267
  }] });
277
268
 
269
+ class ZToastCustomComponent {
270
+ _toastService = inject(ZToastService);
271
+ config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
272
+ dismiss() {
273
+ const id = this.config().toastId;
274
+ if (id !== undefined) {
275
+ this._toastService.dismiss(id);
276
+ }
277
+ }
278
+ handleAction(action) {
279
+ const id = this.config().toastId;
280
+ if (id !== undefined) {
281
+ // Thực thi callback của nút hành động và tự động đóng toast tương ứng
282
+ action.onClick(id);
283
+ this._toastService.dismiss(id);
284
+ }
285
+ }
286
+ getFeaturedIconName() {
287
+ const { type } = this.config();
288
+ const configIcon = this.config().icon;
289
+ if (configIcon) {
290
+ return configIcon;
291
+ }
292
+ switch (type) {
293
+ case 'success':
294
+ return 'lucideCircleCheck';
295
+ case 'error':
296
+ return 'lucideCircleX';
297
+ case 'warning':
298
+ return 'lucideTriangleAlert';
299
+ case 'info':
300
+ return 'lucideInfo';
301
+ default:
302
+ return 'lucideBell';
303
+ }
304
+ }
305
+ getFeaturedIconContainerClasses() {
306
+ const { type } = this.config();
307
+ // Trả về class styling cho vòng tròn đồng tâm bao quanh icon (Featured Icon)
308
+ switch (type) {
309
+ case 'success':
310
+ return 'bg-emerald-50 text-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-400 border border-emerald-100 dark:border-emerald-900/50 ring-4 ring-emerald-500/5';
311
+ case 'error':
312
+ return 'bg-rose-50 text-rose-600 dark:bg-rose-950/30 dark:text-rose-400 border border-rose-100 dark:border-rose-900/50 ring-4 ring-rose-500/5';
313
+ case 'warning':
314
+ return 'bg-amber-50 text-amber-600 dark:bg-amber-950/30 dark:text-amber-400 border border-amber-100 dark:border-amber-900/50 ring-4 ring-amber-500/5';
315
+ case 'info':
316
+ return 'bg-sky-50 text-sky-600 dark:bg-sky-950/30 dark:text-sky-400 border border-sky-100 dark:border-sky-900/50 ring-4 ring-sky-500/5';
317
+ default:
318
+ return 'bg-zinc-50 text-zinc-600 dark:bg-zinc-900 dark:text-zinc-400 border border-zinc-100 dark:border-zinc-800 ring-4 ring-zinc-500/5';
319
+ }
320
+ }
321
+ getActionClasses(action) {
322
+ const type = action.zType || 'primary';
323
+ switch (type) {
324
+ case 'primary':
325
+ return 'text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300';
326
+ case 'secondary':
327
+ return 'text-zinc-500 hover:text-zinc-600 dark:text-zinc-400 dark:hover:text-zinc-300';
328
+ case 'danger':
329
+ return 'text-rose-600 dark:text-rose-400 hover:text-rose-700 dark:hover:text-rose-300';
330
+ default:
331
+ return 'text-zinc-500 hover:text-zinc-600 dark:text-zinc-400 dark:hover:text-zinc-300';
332
+ }
333
+ }
334
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZToastCustomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
335
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ZToastCustomComponent, isStandalone: true, selector: "z-toast-custom", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"border-border bg-card relative flex w-full max-w-[480px] flex-col gap-4 rounded-xl border p-4 font-sans shadow-lg md:flex-row md:items-start\"\n [class.min-w-[340px]]=\"config().type !== 'image'\"\n [class.md:p-0]=\"config().type === 'image'\"\n [class.overflow-hidden]=\"config().type === 'image'\">\n <!-- Content for layout types -->\n @if (config().type === 'image') {\n <!-- Style 1: D\u1EA1ng th\u00F4ng b\u00E1o ch\u1EE9a \u1EA3nh phong c\u1EA3nh n\u1EB1m b\u00EAn tr\u00E1i (desktop) ho\u1EB7c b\u00EAn tr\u00EAn (mobile) -->\n <div class=\"flex w-full flex-col md:flex-row\">\n <!-- \u1EA2nh tr\u00EAn Desktop -->\n @if (config().imageUrl) {\n <div class=\"border-border hidden w-32 shrink-0 overflow-hidden rounded-l-xl border-r md:block\">\n <img [src]=\"config().imageUrl\" alt=\"Notification image\" class=\"h-full w-full object-cover\" />\n </div>\n <!-- \u1EA2nh tr\u00EAn Mobile -->\n <div class=\"block h-32 w-full overflow-hidden rounded-t-xl md:hidden\">\n <img [src]=\"config().imageUrl\" alt=\"Notification image\" class=\"h-full w-full object-cover\" />\n </div>\n }\n\n <!-- N\u1ED9i dung ch\u1EEF v\u00E0 c\u00E1c n\u00FAt h\u00E0nh \u0111\u1ED9ng -->\n <div class=\"flex flex-1 flex-col gap-3 p-4\">\n <div class=\"flex flex-col gap-1 pr-6\">\n <p class=\"text-foreground text-sm font-semibold\">{{ config().title }}</p>\n @if (config().description) {\n <p class=\"text-muted-foreground text-sm\">{{ config().description }}</p>\n }\n </div>\n\n <!-- N\u00FAt h\u00E0nh \u0111\u1ED9ng -->\n @if (config().actions && config().actions!.length > 0) {\n <div class=\"flex gap-3\">\n @for (action of config().actions; track $index) {\n <button\n (click)=\"handleAction(action)\"\n class=\"cursor-pointer text-sm font-semibold hover:underline\"\n [class]=\"getActionClasses(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- Style 2: C\u00E1c d\u1EA1ng th\u00F4ng b\u00E1o ti\u00EAu chu\u1EA9n (Alert, Avatar, Progress, Default) -->\n\n <!-- Icon ho\u1EB7c Avatar \u1EDF g\u00F3c tr\u00E1i -->\n @if (config().type === 'avatar' && config().avatarUrl) {\n <div class=\"relative flex size-10 shrink-0 rounded-full\">\n <img\n [src]=\"config().avatarUrl\"\n [alt]=\"config().title\"\n class=\"border-border size-full rounded-full border object-cover\" />\n @if (config().avatarOnline) {\n <span\n class=\"ring-card absolute right-0 bottom-0 flex size-2.5 justify-center rounded-full bg-emerald-500 ring-[1.5px]\"></span>\n }\n </div>\n } @else if (config().type && config().type !== 'default') {\n <!-- Featured Icon wrapper v\u1EDBi hi\u1EC7u \u1EE9ng vi\u1EC1n \u0111\u1ED3ng t\u00E2m -->\n <div\n class=\"relative flex size-10 shrink-0 items-center justify-center rounded-full\"\n [class]=\"getFeaturedIconContainerClasses()\">\n <i z-icon [zType]=\"getFeaturedIconName()\" zSize=\"20\" class=\"z-10\"></i>\n </div>\n }\n\n <!-- Ti\u00EAu \u0111\u1EC1, m\u00F4 t\u1EA3 v\u00E0 thanh ti\u1EBFn tr\u00ECnh -->\n <div class=\"flex flex-1 flex-col gap-3\">\n <div class=\"flex flex-col gap-1 pr-6\">\n <p class=\"text-foreground text-sm font-semibold\">{{ config().title }}</p>\n @if (config().description) {\n <p class=\"text-muted-foreground text-sm\">{{ config().description }}</p>\n }\n </div>\n\n <!-- D\u1EA1ng Progress bar d\u00E0nh cho ti\u1EBFn tr\u00ECnh upload/t\u1EA3i xu\u1ED1ng -->\n @if (config().type === 'progress' && config().progress !== undefined) {\n <div class=\"flex w-full flex-col gap-1.5\">\n <div class=\"h-2 w-full overflow-hidden rounded-md bg-zinc-100 dark:bg-zinc-800\">\n <div\n class=\"bg-primary h-full rounded-md transition-all duration-300\"\n [style.width.%]=\"config().progress\"></div>\n </div>\n <span class=\"text-muted-foreground text-xs font-medium tabular-nums\">\n {{ config().progress }}% uploaded...\n </span>\n </div>\n }\n\n <!-- C\u00E1c n\u00FAt h\u00E0nh \u0111\u1ED9ng b\u00EAn d\u01B0\u1EDBi th\u00F4ng b\u00E1o -->\n @if (config().actions && config().actions!.length > 0) {\n <div class=\"flex gap-3\">\n @for (action of config().actions; track $index) {\n <button\n (click)=\"handleAction(action)\"\n class=\"cursor-pointer text-sm font-semibold hover:underline\"\n [class]=\"getActionClasses(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- N\u00FAt \u0111\u00F3ng/t\u1EAFt th\u00F4ng b\u00E1o g\u00F3c tr\u00EAn b\u00EAn ph\u1EA3i -->\n @if (config().closeable !== false) {\n <button\n (click)=\"dismiss()\"\n aria-label=\"Close\"\n class=\"text-muted-foreground hover:text-foreground absolute top-3 right-3 flex cursor-pointer items-center justify-center rounded-lg p-1.5 transition duration-150 hover:bg-zinc-100 dark:hover:bg-zinc-800\">\n <i z-icon zType=\"lucideX\" zSize=\"16\"></i>\n </button>\n }\n</div>\n", dependencies: [{ kind: "component", type: ZIconComponent, selector: "z-icon, [z-icon]", inputs: ["class", "zType", "zAnimatedType", "zAnimate", "zAnimationTrigger", "zSize", "zStrokeWidth", "zSvg"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
336
+ }
337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ZToastCustomComponent, decorators: [{
338
+ type: Component,
339
+ args: [{ selector: 'z-toast-custom', imports: [ZIconComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"border-border bg-card relative flex w-full max-w-[480px] flex-col gap-4 rounded-xl border p-4 font-sans shadow-lg md:flex-row md:items-start\"\n [class.min-w-[340px]]=\"config().type !== 'image'\"\n [class.md:p-0]=\"config().type === 'image'\"\n [class.overflow-hidden]=\"config().type === 'image'\">\n <!-- Content for layout types -->\n @if (config().type === 'image') {\n <!-- Style 1: D\u1EA1ng th\u00F4ng b\u00E1o ch\u1EE9a \u1EA3nh phong c\u1EA3nh n\u1EB1m b\u00EAn tr\u00E1i (desktop) ho\u1EB7c b\u00EAn tr\u00EAn (mobile) -->\n <div class=\"flex w-full flex-col md:flex-row\">\n <!-- \u1EA2nh tr\u00EAn Desktop -->\n @if (config().imageUrl) {\n <div class=\"border-border hidden w-32 shrink-0 overflow-hidden rounded-l-xl border-r md:block\">\n <img [src]=\"config().imageUrl\" alt=\"Notification image\" class=\"h-full w-full object-cover\" />\n </div>\n <!-- \u1EA2nh tr\u00EAn Mobile -->\n <div class=\"block h-32 w-full overflow-hidden rounded-t-xl md:hidden\">\n <img [src]=\"config().imageUrl\" alt=\"Notification image\" class=\"h-full w-full object-cover\" />\n </div>\n }\n\n <!-- N\u1ED9i dung ch\u1EEF v\u00E0 c\u00E1c n\u00FAt h\u00E0nh \u0111\u1ED9ng -->\n <div class=\"flex flex-1 flex-col gap-3 p-4\">\n <div class=\"flex flex-col gap-1 pr-6\">\n <p class=\"text-foreground text-sm font-semibold\">{{ config().title }}</p>\n @if (config().description) {\n <p class=\"text-muted-foreground text-sm\">{{ config().description }}</p>\n }\n </div>\n\n <!-- N\u00FAt h\u00E0nh \u0111\u1ED9ng -->\n @if (config().actions && config().actions!.length > 0) {\n <div class=\"flex gap-3\">\n @for (action of config().actions; track $index) {\n <button\n (click)=\"handleAction(action)\"\n class=\"cursor-pointer text-sm font-semibold hover:underline\"\n [class]=\"getActionClasses(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- Style 2: C\u00E1c d\u1EA1ng th\u00F4ng b\u00E1o ti\u00EAu chu\u1EA9n (Alert, Avatar, Progress, Default) -->\n\n <!-- Icon ho\u1EB7c Avatar \u1EDF g\u00F3c tr\u00E1i -->\n @if (config().type === 'avatar' && config().avatarUrl) {\n <div class=\"relative flex size-10 shrink-0 rounded-full\">\n <img\n [src]=\"config().avatarUrl\"\n [alt]=\"config().title\"\n class=\"border-border size-full rounded-full border object-cover\" />\n @if (config().avatarOnline) {\n <span\n class=\"ring-card absolute right-0 bottom-0 flex size-2.5 justify-center rounded-full bg-emerald-500 ring-[1.5px]\"></span>\n }\n </div>\n } @else if (config().type && config().type !== 'default') {\n <!-- Featured Icon wrapper v\u1EDBi hi\u1EC7u \u1EE9ng vi\u1EC1n \u0111\u1ED3ng t\u00E2m -->\n <div\n class=\"relative flex size-10 shrink-0 items-center justify-center rounded-full\"\n [class]=\"getFeaturedIconContainerClasses()\">\n <i z-icon [zType]=\"getFeaturedIconName()\" zSize=\"20\" class=\"z-10\"></i>\n </div>\n }\n\n <!-- Ti\u00EAu \u0111\u1EC1, m\u00F4 t\u1EA3 v\u00E0 thanh ti\u1EBFn tr\u00ECnh -->\n <div class=\"flex flex-1 flex-col gap-3\">\n <div class=\"flex flex-col gap-1 pr-6\">\n <p class=\"text-foreground text-sm font-semibold\">{{ config().title }}</p>\n @if (config().description) {\n <p class=\"text-muted-foreground text-sm\">{{ config().description }}</p>\n }\n </div>\n\n <!-- D\u1EA1ng Progress bar d\u00E0nh cho ti\u1EBFn tr\u00ECnh upload/t\u1EA3i xu\u1ED1ng -->\n @if (config().type === 'progress' && config().progress !== undefined) {\n <div class=\"flex w-full flex-col gap-1.5\">\n <div class=\"h-2 w-full overflow-hidden rounded-md bg-zinc-100 dark:bg-zinc-800\">\n <div\n class=\"bg-primary h-full rounded-md transition-all duration-300\"\n [style.width.%]=\"config().progress\"></div>\n </div>\n <span class=\"text-muted-foreground text-xs font-medium tabular-nums\">\n {{ config().progress }}% uploaded...\n </span>\n </div>\n }\n\n <!-- C\u00E1c n\u00FAt h\u00E0nh \u0111\u1ED9ng b\u00EAn d\u01B0\u1EDBi th\u00F4ng b\u00E1o -->\n @if (config().actions && config().actions!.length > 0) {\n <div class=\"flex gap-3\">\n @for (action of config().actions; track $index) {\n <button\n (click)=\"handleAction(action)\"\n class=\"cursor-pointer text-sm font-semibold hover:underline\"\n [class]=\"getActionClasses(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- N\u00FAt \u0111\u00F3ng/t\u1EAFt th\u00F4ng b\u00E1o g\u00F3c tr\u00EAn b\u00EAn ph\u1EA3i -->\n @if (config().closeable !== false) {\n <button\n (click)=\"dismiss()\"\n aria-label=\"Close\"\n class=\"text-muted-foreground hover:text-foreground absolute top-3 right-3 flex cursor-pointer items-center justify-center rounded-lg p-1.5 transition duration-150 hover:bg-zinc-100 dark:hover:bg-zinc-800\">\n <i z-icon zType=\"lucideX\" zSize=\"16\"></i>\n </button>\n }\n</div>\n" }]
340
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }] } });
341
+
342
+ /**
343
+ * Provides global toast configuration options
344
+ * Use this in app.config.ts: providers: [provideZToast({ zPosition: 'top-right' })]
345
+ *
346
+ * @param config - Partial configuration to override default options
347
+ * @returns EnvironmentProviders for the toast service
348
+ *
349
+ * @example
350
+ * ```typescript
351
+ * // In app.config.ts
352
+ * export const appConfig: ApplicationConfig = {
353
+ * providers: [
354
+ * provideZToast({
355
+ * zPosition: 'top-right',
356
+ * zDuration: 5000,
357
+ * zCloseButton: true,
358
+ * }),
359
+ * ],
360
+ * };
361
+ * ```
362
+ */
363
+ function provideZToast(config) {
364
+ const mergedConfig = {
365
+ ...Z_TOASTER_DEFAULT_CONFIG,
366
+ ...config,
367
+ };
368
+ return makeEnvironmentProviders([{ provide: Z_TOASTER_CONFIG, useValue: mergedConfig }]);
369
+ }
370
+
278
371
  /**
279
372
  * Generated bundle index. Do not edit.
280
373
  */
281
374
 
282
- export { ZToastComponent, ZToastService, Z_TOASTER_CONFIG, Z_TOASTER_DEFAULT_CONFIG, Z_TOAST_DATA, provideZToast, zToastVariants };
375
+ export { ZToastComponent, ZToastCustomComponent, ZToastService, Z_TOASTER_CONFIG, Z_TOASTER_DEFAULT_CONFIG, Z_TOAST_DATA, provideZToast, zToastVariants };
283
376
  //# sourceMappingURL=shival99-z-ui-components-z-toast.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"shival99-z-ui-components-z-toast.mjs","sources":["../../../../libs/core-ui/components/z-toast/z-toast.types.ts","../../../../libs/core-ui/components/z-toast/z-toast.variants.ts","../../../../libs/core-ui/components/z-toast/z-toast.component.ts","../../../../libs/core-ui/components/z-toast/z-toast.component.html","../../../../libs/core-ui/components/z-toast/z-toast.provider.ts","../../../../libs/core-ui/components/z-toast/z-toast.service.ts","../../../../libs/core-ui/components/z-toast/shival99-z-ui-components-z-toast.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { InjectionToken } from '@angular/core';\nimport type { ExternalToast } from '@shival99/ngx-sonner';\n\nexport type ZToastTheme = 'light' | 'dark' | 'system';\nexport type ZToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\nexport type ZToastDir = 'ltr' | 'rtl' | 'auto';\nexport type ZToastType = 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading';\n\nexport const Z_TOAST_DATA = new InjectionToken<any>('Z_TOAST_DATA');\nexport const Z_TOAST_ANIMATION_DURATION = 200;\nexport const Z_TOASTER_CONFIG = new InjectionToken<ZToasterConfig>('Z_TOASTER_CONFIG');\n\nexport interface ZToastOptions extends ExternalToast {\n description?: string;\n duration?: number;\n id?: string | number;\n}\n\nexport interface ZToastPromiseMessages<T> {\n loading: string;\n success: string | ((data: T) => string);\n error: string | ((error: unknown) => string);\n}\n\nexport interface ZToasterConfig {\n zTheme?: ZToastTheme;\n zPosition?: ZToastPosition;\n zRichColors?: boolean;\n zExpand?: boolean;\n zDuration?: number;\n zVisibleToasts?: number;\n zCloseButton?: boolean;\n zDir?: ZToastDir;\n}\n\nexport const Z_TOASTER_DEFAULT_CONFIG: ZToasterConfig = {\n zTheme: 'system',\n zPosition: 'top-right',\n zRichColors: true,\n zExpand: true,\n zDuration: 2500,\n zVisibleToasts: 3,\n zCloseButton: true,\n zDir: 'auto',\n};\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zToastVariants = cva(\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n {\n variants: {\n zVariant: {\n default: 'group-[.toaster]:bg-background group-[.toaster]:text-foreground',\n success:\n 'group-[.toaster]:bg-green-50 group-[.toaster]:text-green-800 group-[.toaster]:border-green-200 dark:group-[.toaster]:bg-green-950 dark:group-[.toaster]:text-green-200 dark:group-[.toaster]:border-green-800',\n error:\n 'group-[.toaster]:bg-red-50 group-[.toaster]:text-red-800 group-[.toaster]:border-red-200 dark:group-[.toaster]:bg-red-950 dark:group-[.toaster]:text-red-200 dark:group-[.toaster]:border-red-800',\n warning:\n 'group-[.toaster]:bg-amber-50 group-[.toaster]:text-amber-800 group-[.toaster]:border-amber-200 dark:group-[.toaster]:bg-amber-950 dark:group-[.toaster]:text-amber-200 dark:group-[.toaster]:border-amber-800',\n info: 'group-[.toaster]:bg-blue-50 group-[.toaster]:text-blue-800 group-[.toaster]:border-blue-200 dark:group-[.toaster]:bg-blue-950 dark:group-[.toaster]:text-blue-200 dark:group-[.toaster]:border-blue-800',\n },\n },\n defaultVariants: {\n zVariant: 'default',\n },\n }\n);\n\nexport type ZToastVariants = VariantProps<typeof zToastVariants>;\n","import { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport { NgxSonnerToaster } from '@shival99/ngx-sonner';\nimport { ZThemeService } from '@shival99/z-ui/services';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport {\n Z_TOASTER_CONFIG,\n Z_TOASTER_DEFAULT_CONFIG,\n type ZToasterConfig,\n type ZToastDir,\n type ZToastOptions,\n type ZToastPosition,\n type ZToastTheme,\n} from './z-toast.types';\nimport { zToastVariants, type ZToastVariants } from './z-toast.variants';\n\n@Component({\n selector: 'z-toast, z-toaster',\n imports: [NgxSonnerToaster],\n standalone: true,\n templateUrl: './z-toast.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'zToast',\n})\nexport class ZToastComponent {\n private readonly _themeService = inject(ZThemeService);\n private readonly _config: ZToasterConfig = inject(Z_TOASTER_CONFIG, { optional: true }) ?? Z_TOASTER_DEFAULT_CONFIG;\n\n public readonly class = input<ClassValue>('');\n public readonly zVariant = input<ZToastVariants['zVariant']>('default');\n public readonly zTheme = input<ZToastTheme>();\n public readonly zPosition = input<ZToastPosition>();\n public readonly zRichColors = input<boolean>();\n public readonly zExpand = input<boolean>();\n public readonly zDuration = input<number>();\n public readonly zVisibleToasts = input<number>();\n public readonly zCloseButton = input<boolean>();\n public readonly zToastOptions = input<ZToastOptions>({});\n public readonly zDir = input<ZToastDir>();\n\n protected readonly effectiveTheme = computed(() => this.zTheme() ?? this._config.zTheme ?? 'system');\n protected readonly effectivePosition = computed(() => this.zPosition() ?? this._config.zPosition ?? 'bottom-right');\n protected readonly effectiveRichColors = computed(() => this.zRichColors() ?? this._config.zRichColors ?? true);\n protected readonly effectiveExpand = computed(() => this.zExpand() ?? this._config.zExpand ?? false);\n protected readonly effectiveDuration = computed(() => this.zDuration() ?? this._config.zDuration ?? 4000);\n protected readonly effectiveVisibleToasts = computed(() => this.zVisibleToasts() ?? this._config.zVisibleToasts ?? 3);\n\n protected readonly effectiveCloseButton = computed(() => this.zCloseButton() ?? this._config.zCloseButton ?? false);\n protected readonly effectiveDir = computed(() => this.zDir() ?? this._config.zDir ?? 'auto');\n\n protected readonly zClasses = computed(() =>\n zMergeClasses('toaster group', zToastVariants({ zVariant: this.zVariant() }), this.class())\n );\n\n protected readonly detectTheme = computed(() => {\n const theme = this.effectiveTheme();\n if (theme !== 'system') {\n return theme;\n }\n\n return this._themeService.isDark() ? 'dark' : 'light';\n });\n}\n","<ngx-sonner-toaster\n [theme]=\"detectTheme()\"\n [class]=\"zClasses()\"\n [position]=\"effectivePosition()\"\n [richColors]=\"effectiveRichColors()\"\n [expand]=\"effectiveExpand()\"\n [duration]=\"effectiveDuration()\"\n [visibleToasts]=\"effectiveVisibleToasts()\"\n [closeButton]=\"effectiveCloseButton()\"\n [toastOptions]=\"zToastOptions()\"\n [dir]=\"effectiveDir()\" />\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { Z_TOASTER_CONFIG, Z_TOASTER_DEFAULT_CONFIG, type ZToasterConfig } from './z-toast.types';\n\n/**\n * Provides global toast configuration options\n * Use this in app.config.ts: providers: [provideZToast({ zPosition: 'top-right' })]\n *\n * @param config - Partial configuration to override default options\n * @returns EnvironmentProviders for the toast service\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZToast({\n * zPosition: 'top-right',\n * zDuration: 5000,\n * zCloseButton: true,\n * }),\n * ],\n * };\n * ```\n */\nexport function provideZToast(config?: Partial<ZToasterConfig>): EnvironmentProviders {\n const mergedConfig: ZToasterConfig = {\n ...Z_TOASTER_DEFAULT_CONFIG,\n ...config,\n };\n\n return makeEnvironmentProviders([{ provide: Z_TOASTER_CONFIG, useValue: mergedConfig }]);\n}\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, Injector, NgZone, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { toast } from '@shival99/ngx-sonner';\nimport { ZTranslateService } from '@shival99/z-ui/services';\nimport { ZToastComponent } from './z-toast.component';\nimport {\n Z_TOASTER_CONFIG,\n Z_TOASTER_DEFAULT_CONFIG,\n type ZToasterConfig,\n type ZToastOptions,\n type ZToastPromiseMessages,\n} from './z-toast.types';\n\n@Injectable({ providedIn: 'root' })\nexport class ZToastService implements OnDestroy {\n private readonly _overlay = inject(Overlay);\n private readonly _injector = inject(Injector);\n private readonly _platformId = inject(PLATFORM_ID);\n private readonly _document = inject(DOCUMENT);\n private readonly _ngZone = inject(NgZone);\n private readonly _providedConfig = inject(Z_TOASTER_CONFIG, { optional: true });\n private readonly _zTranslate = inject(ZTranslateService);\n\n private _overlayRef: OverlayRef | null = null;\n private _toasterAttached = false;\n private _mutationObserver: MutationObserver | null = null;\n\n public create(config?: ZToasterConfig): void {\n if (this._toasterAttached) {\n return;\n }\n\n this._attachToaster(config);\n }\n\n public show(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast(this._translate(message), options);\n }\n\n public success(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.success(this._translate(message), options);\n }\n\n public error(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.error(this._translate(message), options);\n }\n\n public warning(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.warning(this._translate(message), options);\n }\n\n public info(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.info(this._translate(message), options);\n }\n\n public loading(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.loading(this._translate(message), options);\n }\n\n public promise<T>(promise: Promise<T>, messages: ZToastPromiseMessages<T>): string | number | undefined {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.promise(promise, messages);\n }\n\n public dismiss(toastId?: string | number): void {\n toast.dismiss(toastId);\n }\n\n public dismissAll(): void {\n toast.dismiss();\n }\n\n public destroy(): void {\n this._disconnectObserver();\n\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n this._toasterAttached = false;\n }\n }\n\n public ngOnDestroy(): void {\n this.destroy();\n }\n\n private _ensureToasterAttached(): void {\n if (!this._toasterAttached) {\n this._attachToaster();\n }\n }\n\n private _moveToTop(): void {\n const wrapperElement = this._overlayRef?.overlayElement?.parentElement as HTMLElement | null;\n if (!wrapperElement?.hasAttribute('popover')) {\n return;\n }\n\n try {\n wrapperElement.hidePopover();\n wrapperElement.showPopover();\n } catch {\n console.warn('Popover API not supported on this browser.');\n }\n }\n\n private _setupOverlayObserver(): void {\n if (!isPlatformBrowser(this._platformId)) {\n return;\n }\n\n if (this._mutationObserver) {\n return;\n }\n\n const overlayContainer = this._document.querySelector('.cdk-overlay-container');\n if (!overlayContainer) {\n return;\n }\n\n this._ngZone.runOutsideAngular(() => {\n this._mutationObserver = new MutationObserver(mutations => {\n const hasNewPopover = mutations.some(\n mutation =>\n mutation.type === 'childList' &&\n Array.from(mutation.addedNodes).some(\n node => node instanceof HTMLElement && node.classList.contains('cdk-overlay-popover')\n )\n );\n\n if (hasNewPopover) {\n this._moveToTop();\n }\n });\n\n this._mutationObserver.observe(overlayContainer, {\n childList: true,\n subtree: false,\n });\n });\n }\n\n private _disconnectObserver(): void {\n if (this._mutationObserver) {\n this._mutationObserver.disconnect();\n this._mutationObserver = null;\n }\n }\n\n private _attachToaster(config?: ZToasterConfig): void {\n if (!isPlatformBrowser(this._platformId)) {\n return;\n }\n\n if (this._toasterAttached) {\n return;\n }\n\n this._overlayRef = this._createOverlay();\n if (!this._overlayRef) {\n return;\n }\n\n const effectiveConfig: ZToasterConfig = {\n ...Z_TOASTER_DEFAULT_CONFIG,\n ...this._providedConfig,\n ...config,\n };\n\n const injector = Injector.create({\n parent: this._injector,\n providers: [{ provide: Z_TOASTER_CONFIG, useValue: effectiveConfig }],\n });\n\n const portal = new ComponentPortal(ZToastComponent, null, injector);\n this._overlayRef.attach(portal);\n this._toasterAttached = true;\n\n this._setupOverlayObserver();\n }\n\n private _createOverlay(): OverlayRef | null {\n if (!isPlatformBrowser(this._platformId)) {\n return null;\n }\n\n const overlayConfig = new OverlayConfig({\n hasBackdrop: false,\n positionStrategy: this._overlay.position().global(),\n scrollStrategy: this._overlay.scrollStrategies.noop(),\n });\n\n const overlayRef = this._overlay.create(overlayConfig);\n overlayRef.overlayElement.style.zIndex = '99999';\n\n return overlayRef;\n }\n\n private _translate(message: string): string {\n if (!message) {\n return message;\n }\n\n return this._zTranslate.instant(message) || message;\n }\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":"shival99-z-ui-components-z-toast.mjs","sources":["../../../../libs/core-ui/components/z-toast/z-toast.types.ts","../../../../libs/core-ui/components/z-toast/z-toast.variants.ts","../../../../libs/core-ui/components/z-toast/z-toast.component.ts","../../../../libs/core-ui/components/z-toast/z-toast.component.html","../../../../libs/core-ui/components/z-toast/z-toast.service.ts","../../../../libs/core-ui/components/z-toast/z-toast-custom.component.ts","../../../../libs/core-ui/components/z-toast/z-toast-custom.component.html","../../../../libs/core-ui/components/z-toast/z-toast.provider.ts","../../../../libs/core-ui/components/z-toast/shival99-z-ui-components-z-toast.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { InjectionToken } from '@angular/core';\nimport type { ExternalToast } from '@shival99/ngx-sonner';\n\nexport type ZToastTheme = 'light' | 'dark' | 'system';\nexport type ZToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\nexport type ZToastDir = 'ltr' | 'rtl' | 'auto';\nexport type ZToastType = 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading';\n\nexport const Z_TOAST_DATA = new InjectionToken<any>('Z_TOAST_DATA');\nexport const Z_TOAST_ANIMATION_DURATION = 200;\nexport const Z_TOASTER_CONFIG = new InjectionToken<ZToasterConfig>('Z_TOASTER_CONFIG');\n\nexport interface ZToastOptions extends ExternalToast {\n description?: string;\n duration?: number;\n id?: string | number;\n}\n\nexport interface ZToastPromiseMessages<T> {\n loading: string;\n success: string | ((data: T) => string);\n error: string | ((error: unknown) => string);\n}\n\nexport interface ZToasterConfig {\n zTheme?: ZToastTheme;\n zPosition?: ZToastPosition;\n zRichColors?: boolean;\n zExpand?: boolean;\n zDuration?: number;\n zVisibleToasts?: number;\n zCloseButton?: boolean;\n zDir?: ZToastDir;\n}\n\nexport const Z_TOASTER_DEFAULT_CONFIG: ZToasterConfig = {\n zTheme: 'system',\n zPosition: 'top-right',\n zRichColors: true,\n zExpand: true,\n zDuration: 2500,\n zVisibleToasts: 3,\n zCloseButton: true,\n zDir: 'auto',\n};\n\nexport interface ZCustomToastAction {\n label: string;\n onClick: (toastId: string | number) => void;\n zType?: 'primary' | 'secondary' | 'outline' | 'text' | 'danger';\n}\n\nexport interface ZCustomToastConfig {\n title: string;\n description?: string;\n type?: 'success' | 'error' | 'warning' | 'info' | 'avatar' | 'image' | 'progress' | 'default';\n icon?: string;\n avatarUrl?: string;\n avatarOnline?: boolean;\n avatarBadgeIcon?: string;\n imageUrl?: string;\n progress?: number;\n actions?: ZCustomToastAction[];\n closeable?: boolean;\n toastId?: string | number;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const zToastVariants = cva(\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n {\n variants: {\n zVariant: {\n default: 'group-[.toaster]:bg-background group-[.toaster]:text-foreground',\n success:\n 'group-[.toaster]:bg-green-50 group-[.toaster]:text-green-800 group-[.toaster]:border-green-200 dark:group-[.toaster]:bg-green-950 dark:group-[.toaster]:text-green-200 dark:group-[.toaster]:border-green-800',\n error:\n 'group-[.toaster]:bg-red-50 group-[.toaster]:text-red-800 group-[.toaster]:border-red-200 dark:group-[.toaster]:bg-red-950 dark:group-[.toaster]:text-red-200 dark:group-[.toaster]:border-red-800',\n warning:\n 'group-[.toaster]:bg-amber-50 group-[.toaster]:text-amber-800 group-[.toaster]:border-amber-200 dark:group-[.toaster]:bg-amber-950 dark:group-[.toaster]:text-amber-200 dark:group-[.toaster]:border-amber-800',\n info: 'group-[.toaster]:bg-blue-50 group-[.toaster]:text-blue-800 group-[.toaster]:border-blue-200 dark:group-[.toaster]:bg-blue-950 dark:group-[.toaster]:text-blue-200 dark:group-[.toaster]:border-blue-800',\n },\n },\n defaultVariants: {\n zVariant: 'default',\n },\n }\n);\n\nexport type ZToastVariants = VariantProps<typeof zToastVariants>;\n","import { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport { NgxSonnerToaster } from '@shival99/ngx-sonner';\nimport { ZThemeService } from '@shival99/z-ui/services';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport {\n Z_TOASTER_CONFIG,\n Z_TOASTER_DEFAULT_CONFIG,\n type ZToasterConfig,\n type ZToastDir,\n type ZToastOptions,\n type ZToastPosition,\n type ZToastTheme,\n} from './z-toast.types';\nimport { zToastVariants, type ZToastVariants } from './z-toast.variants';\n\n@Component({\n selector: 'z-toast, z-toaster',\n imports: [NgxSonnerToaster],\n standalone: true,\n templateUrl: './z-toast.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'zToast',\n})\nexport class ZToastComponent {\n private readonly _themeService = inject(ZThemeService);\n private readonly _config: ZToasterConfig = inject(Z_TOASTER_CONFIG, { optional: true }) ?? Z_TOASTER_DEFAULT_CONFIG;\n\n public readonly class = input<ClassValue>('');\n public readonly zVariant = input<ZToastVariants['zVariant']>('default');\n public readonly zTheme = input<ZToastTheme>();\n public readonly zPosition = input<ZToastPosition>();\n public readonly zRichColors = input<boolean>();\n public readonly zExpand = input<boolean>();\n public readonly zDuration = input<number>();\n public readonly zVisibleToasts = input<number>();\n public readonly zCloseButton = input<boolean>();\n public readonly zToastOptions = input<ZToastOptions>({});\n public readonly zDir = input<ZToastDir>();\n\n protected readonly effectiveTheme = computed(() => this.zTheme() ?? this._config.zTheme ?? 'system');\n protected readonly effectivePosition = computed(() => this.zPosition() ?? this._config.zPosition ?? 'bottom-right');\n protected readonly effectiveRichColors = computed(() => this.zRichColors() ?? this._config.zRichColors ?? true);\n protected readonly effectiveExpand = computed(() => this.zExpand() ?? this._config.zExpand ?? false);\n protected readonly effectiveDuration = computed(() => this.zDuration() ?? this._config.zDuration ?? 4000);\n protected readonly effectiveVisibleToasts = computed(() => this.zVisibleToasts() ?? this._config.zVisibleToasts ?? 3);\n\n protected readonly effectiveCloseButton = computed(() => this.zCloseButton() ?? this._config.zCloseButton ?? false);\n protected readonly effectiveDir = computed(() => this.zDir() ?? this._config.zDir ?? 'auto');\n\n protected readonly zClasses = computed(() =>\n zMergeClasses('toaster group', zToastVariants({ zVariant: this.zVariant() }), this.class())\n );\n\n protected readonly detectTheme = computed(() => {\n const theme = this.effectiveTheme();\n if (theme !== 'system') {\n return theme;\n }\n\n return this._themeService.isDark() ? 'dark' : 'light';\n });\n}\n","<ngx-sonner-toaster\n [theme]=\"detectTheme()\"\n [class]=\"zClasses()\"\n [position]=\"effectivePosition()\"\n [richColors]=\"effectiveRichColors()\"\n [expand]=\"effectiveExpand()\"\n [duration]=\"effectiveDuration()\"\n [visibleToasts]=\"effectiveVisibleToasts()\"\n [closeButton]=\"effectiveCloseButton()\"\n [toastOptions]=\"zToastOptions()\"\n [dir]=\"effectiveDir()\" />\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, Injector, NgZone, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { toast } from '@shival99/ngx-sonner';\nimport { ZTranslateService } from '@shival99/z-ui/services';\nimport { ZToastCustomComponent } from './z-toast-custom.component';\nimport { ZToastComponent } from './z-toast.component';\nimport {\n Z_TOASTER_CONFIG,\n Z_TOASTER_DEFAULT_CONFIG,\n type ZToasterConfig,\n type ZToastOptions,\n type ZToastPromiseMessages,\n type ZCustomToastConfig,\n} from './z-toast.types';\n\n@Injectable({ providedIn: 'root' })\nexport class ZToastService implements OnDestroy {\n private readonly _overlay = inject(Overlay);\n private readonly _injector = inject(Injector);\n private readonly _platformId = inject(PLATFORM_ID);\n private readonly _document = inject(DOCUMENT);\n private readonly _ngZone = inject(NgZone);\n private readonly _providedConfig = inject(Z_TOASTER_CONFIG, { optional: true });\n private readonly _zTranslate = inject(ZTranslateService);\n\n private _overlayRef: OverlayRef | null = null;\n private _toasterAttached = false;\n private _mutationObserver: MutationObserver | null = null;\n\n public create(config?: ZToasterConfig): void {\n if (this._toasterAttached) {\n return;\n }\n\n this._attachToaster(config);\n }\n\n public show(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast(this._translate(message), options);\n }\n\n public success(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.success(this._translate(message), options);\n }\n\n public error(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.error(this._translate(message), options);\n }\n\n public warning(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.warning(this._translate(message), options);\n }\n\n public info(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.info(this._translate(message), options);\n }\n\n public loading(message: string, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.loading(this._translate(message), options);\n }\n\n public promise<T>(promise: Promise<T>, messages: ZToastPromiseMessages<T>): string | number | undefined {\n this._ensureToasterAttached();\n this._moveToTop();\n return toast.promise(promise, messages);\n }\n\n public custom(config: ZCustomToastConfig, options?: ZToastOptions): string | number {\n this._ensureToasterAttached();\n this._moveToTop();\n\n // Sinh ID duy nhất nếu chưa được cấu hình\n const toastId = options?.id ?? Math.random().toString(36).substring(2, 9);\n const updatedConfig: ZCustomToastConfig = {\n ...config,\n toastId,\n };\n\n // Gọi phương thức custom của ngx-sonner với unstyled: true để tùy biến hoàn toàn UI\n return toast.custom(ZToastCustomComponent, {\n ...options,\n unstyled: true,\n id: toastId,\n componentProps: {\n config: updatedConfig,\n },\n });\n }\n\n public dismiss(toastId?: string | number): void {\n toast.dismiss(toastId);\n }\n\n public dismissAll(): void {\n toast.dismiss();\n }\n\n public destroy(): void {\n this._disconnectObserver();\n\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n this._toasterAttached = false;\n }\n }\n\n public ngOnDestroy(): void {\n this.destroy();\n }\n\n private _ensureToasterAttached(): void {\n if (!this._toasterAttached) {\n this._attachToaster();\n }\n }\n\n private _moveToTop(): void {\n const wrapperElement = this._overlayRef?.overlayElement?.parentElement as HTMLElement | null;\n if (!wrapperElement?.hasAttribute('popover')) {\n return;\n }\n\n try {\n wrapperElement.hidePopover();\n wrapperElement.showPopover();\n } catch {\n console.warn('Popover API not supported on this browser.');\n }\n }\n\n private _setupOverlayObserver(): void {\n if (!isPlatformBrowser(this._platformId)) {\n return;\n }\n\n if (this._mutationObserver) {\n return;\n }\n\n const overlayContainer = this._document.querySelector('.cdk-overlay-container');\n if (!overlayContainer) {\n return;\n }\n\n this._ngZone.runOutsideAngular(() => {\n this._mutationObserver = new MutationObserver(mutations => {\n const hasNewPopover = mutations.some(\n mutation =>\n mutation.type === 'childList' &&\n Array.from(mutation.addedNodes).some(\n node => node instanceof HTMLElement && node.classList.contains('cdk-overlay-popover')\n )\n );\n\n if (hasNewPopover) {\n this._moveToTop();\n }\n });\n\n this._mutationObserver.observe(overlayContainer, {\n childList: true,\n subtree: false,\n });\n });\n }\n\n private _disconnectObserver(): void {\n if (this._mutationObserver) {\n this._mutationObserver.disconnect();\n this._mutationObserver = null;\n }\n }\n\n private _attachToaster(config?: ZToasterConfig): void {\n if (!isPlatformBrowser(this._platformId)) {\n return;\n }\n\n if (this._toasterAttached) {\n return;\n }\n\n this._overlayRef = this._createOverlay();\n if (!this._overlayRef) {\n return;\n }\n\n const effectiveConfig: ZToasterConfig = {\n ...Z_TOASTER_DEFAULT_CONFIG,\n ...this._providedConfig,\n ...config,\n };\n\n const injector = Injector.create({\n parent: this._injector,\n providers: [{ provide: Z_TOASTER_CONFIG, useValue: effectiveConfig }],\n });\n\n const portal = new ComponentPortal(ZToastComponent, null, injector);\n this._overlayRef.attach(portal);\n this._toasterAttached = true;\n\n this._setupOverlayObserver();\n }\n\n private _createOverlay(): OverlayRef | null {\n if (!isPlatformBrowser(this._platformId)) {\n return null;\n }\n\n const overlayConfig = new OverlayConfig({\n hasBackdrop: false,\n positionStrategy: this._overlay.position().global(),\n scrollStrategy: this._overlay.scrollStrategies.noop(),\n });\n\n const overlayRef = this._overlay.create(overlayConfig);\n overlayRef.overlayElement.style.zIndex = '99999';\n\n return overlayRef;\n }\n\n private _translate(message: string): string {\n if (!message) {\n return message;\n }\n\n return this._zTranslate.instant(message) || message;\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, input, ViewEncapsulation } from '@angular/core';\nimport { ZIconComponent, type ZIcon } from '@shival99/z-ui/components/z-icon';\nimport { ZToastService } from './z-toast.service';\nimport { ZCustomToastAction, ZCustomToastConfig } from './z-toast.types';\n\n@Component({\n selector: 'z-toast-custom',\n imports: [ZIconComponent],\n standalone: true,\n templateUrl: './z-toast-custom.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class ZToastCustomComponent {\n private readonly _toastService = inject(ZToastService);\n\n public readonly config = input.required<ZCustomToastConfig>();\n\n protected dismiss(): void {\n const id = this.config().toastId;\n if (id !== undefined) {\n this._toastService.dismiss(id);\n }\n }\n\n protected handleAction(action: ZCustomToastAction): void {\n const id = this.config().toastId;\n if (id !== undefined) {\n // Thực thi callback của nút hành động và tự động đóng toast tương ứng\n action.onClick(id);\n this._toastService.dismiss(id);\n }\n }\n\n protected getFeaturedIconName(): ZIcon {\n const { type } = this.config();\n const configIcon = this.config().icon;\n\n if (configIcon) {\n return configIcon as ZIcon;\n }\n\n switch (type) {\n case 'success':\n return 'lucideCircleCheck';\n case 'error':\n return 'lucideCircleX';\n case 'warning':\n return 'lucideTriangleAlert';\n case 'info':\n return 'lucideInfo';\n default:\n return 'lucideBell';\n }\n }\n\n protected getFeaturedIconContainerClasses(): string {\n const { type } = this.config();\n // Trả về class styling cho vòng tròn đồng tâm bao quanh icon (Featured Icon)\n switch (type) {\n case 'success':\n return 'bg-emerald-50 text-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-400 border border-emerald-100 dark:border-emerald-900/50 ring-4 ring-emerald-500/5';\n case 'error':\n return 'bg-rose-50 text-rose-600 dark:bg-rose-950/30 dark:text-rose-400 border border-rose-100 dark:border-rose-900/50 ring-4 ring-rose-500/5';\n case 'warning':\n return 'bg-amber-50 text-amber-600 dark:bg-amber-950/30 dark:text-amber-400 border border-amber-100 dark:border-amber-900/50 ring-4 ring-amber-500/5';\n case 'info':\n return 'bg-sky-50 text-sky-600 dark:bg-sky-950/30 dark:text-sky-400 border border-sky-100 dark:border-sky-900/50 ring-4 ring-sky-500/5';\n default:\n return 'bg-zinc-50 text-zinc-600 dark:bg-zinc-900 dark:text-zinc-400 border border-zinc-100 dark:border-zinc-800 ring-4 ring-zinc-500/5';\n }\n }\n\n protected getActionClasses(action: ZCustomToastAction): string {\n const type = action.zType || 'primary';\n switch (type) {\n case 'primary':\n return 'text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300';\n case 'secondary':\n return 'text-zinc-500 hover:text-zinc-600 dark:text-zinc-400 dark:hover:text-zinc-300';\n case 'danger':\n return 'text-rose-600 dark:text-rose-400 hover:text-rose-700 dark:hover:text-rose-300';\n default:\n return 'text-zinc-500 hover:text-zinc-600 dark:text-zinc-400 dark:hover:text-zinc-300';\n }\n }\n}\n","<div\n class=\"border-border bg-card relative flex w-full max-w-[480px] flex-col gap-4 rounded-xl border p-4 font-sans shadow-lg md:flex-row md:items-start\"\n [class.min-w-[340px]]=\"config().type !== 'image'\"\n [class.md:p-0]=\"config().type === 'image'\"\n [class.overflow-hidden]=\"config().type === 'image'\">\n <!-- Content for layout types -->\n @if (config().type === 'image') {\n <!-- Style 1: Dạng thông báo chứa ảnh phong cảnh nằm bên trái (desktop) hoặc bên trên (mobile) -->\n <div class=\"flex w-full flex-col md:flex-row\">\n <!-- Ảnh trên Desktop -->\n @if (config().imageUrl) {\n <div class=\"border-border hidden w-32 shrink-0 overflow-hidden rounded-l-xl border-r md:block\">\n <img [src]=\"config().imageUrl\" alt=\"Notification image\" class=\"h-full w-full object-cover\" />\n </div>\n <!-- Ảnh trên Mobile -->\n <div class=\"block h-32 w-full overflow-hidden rounded-t-xl md:hidden\">\n <img [src]=\"config().imageUrl\" alt=\"Notification image\" class=\"h-full w-full object-cover\" />\n </div>\n }\n\n <!-- Nội dung chữ và các nút hành động -->\n <div class=\"flex flex-1 flex-col gap-3 p-4\">\n <div class=\"flex flex-col gap-1 pr-6\">\n <p class=\"text-foreground text-sm font-semibold\">{{ config().title }}</p>\n @if (config().description) {\n <p class=\"text-muted-foreground text-sm\">{{ config().description }}</p>\n }\n </div>\n\n <!-- Nút hành động -->\n @if (config().actions && config().actions!.length > 0) {\n <div class=\"flex gap-3\">\n @for (action of config().actions; track $index) {\n <button\n (click)=\"handleAction(action)\"\n class=\"cursor-pointer text-sm font-semibold hover:underline\"\n [class]=\"getActionClasses(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- Style 2: Các dạng thông báo tiêu chuẩn (Alert, Avatar, Progress, Default) -->\n\n <!-- Icon hoặc Avatar ở góc trái -->\n @if (config().type === 'avatar' && config().avatarUrl) {\n <div class=\"relative flex size-10 shrink-0 rounded-full\">\n <img\n [src]=\"config().avatarUrl\"\n [alt]=\"config().title\"\n class=\"border-border size-full rounded-full border object-cover\" />\n @if (config().avatarOnline) {\n <span\n class=\"ring-card absolute right-0 bottom-0 flex size-2.5 justify-center rounded-full bg-emerald-500 ring-[1.5px]\"></span>\n }\n </div>\n } @else if (config().type && config().type !== 'default') {\n <!-- Featured Icon wrapper với hiệu ứng viền đồng tâm -->\n <div\n class=\"relative flex size-10 shrink-0 items-center justify-center rounded-full\"\n [class]=\"getFeaturedIconContainerClasses()\">\n <i z-icon [zType]=\"getFeaturedIconName()\" zSize=\"20\" class=\"z-10\"></i>\n </div>\n }\n\n <!-- Tiêu đề, mô tả và thanh tiến trình -->\n <div class=\"flex flex-1 flex-col gap-3\">\n <div class=\"flex flex-col gap-1 pr-6\">\n <p class=\"text-foreground text-sm font-semibold\">{{ config().title }}</p>\n @if (config().description) {\n <p class=\"text-muted-foreground text-sm\">{{ config().description }}</p>\n }\n </div>\n\n <!-- Dạng Progress bar dành cho tiến trình upload/tải xuống -->\n @if (config().type === 'progress' && config().progress !== undefined) {\n <div class=\"flex w-full flex-col gap-1.5\">\n <div class=\"h-2 w-full overflow-hidden rounded-md bg-zinc-100 dark:bg-zinc-800\">\n <div\n class=\"bg-primary h-full rounded-md transition-all duration-300\"\n [style.width.%]=\"config().progress\"></div>\n </div>\n <span class=\"text-muted-foreground text-xs font-medium tabular-nums\">\n {{ config().progress }}% uploaded...\n </span>\n </div>\n }\n\n <!-- Các nút hành động bên dưới thông báo -->\n @if (config().actions && config().actions!.length > 0) {\n <div class=\"flex gap-3\">\n @for (action of config().actions; track $index) {\n <button\n (click)=\"handleAction(action)\"\n class=\"cursor-pointer text-sm font-semibold hover:underline\"\n [class]=\"getActionClasses(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Nút đóng/tắt thông báo góc trên bên phải -->\n @if (config().closeable !== false) {\n <button\n (click)=\"dismiss()\"\n aria-label=\"Close\"\n class=\"text-muted-foreground hover:text-foreground absolute top-3 right-3 flex cursor-pointer items-center justify-center rounded-lg p-1.5 transition duration-150 hover:bg-zinc-100 dark:hover:bg-zinc-800\">\n <i z-icon zType=\"lucideX\" zSize=\"16\"></i>\n </button>\n }\n</div>\n","import { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { Z_TOASTER_CONFIG, Z_TOASTER_DEFAULT_CONFIG, type ZToasterConfig } from './z-toast.types';\n\n/**\n * Provides global toast configuration options\n * Use this in app.config.ts: providers: [provideZToast({ zPosition: 'top-right' })]\n *\n * @param config - Partial configuration to override default options\n * @returns EnvironmentProviders for the toast service\n *\n * @example\n * ```typescript\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZToast({\n * zPosition: 'top-right',\n * zDuration: 5000,\n * zCloseButton: true,\n * }),\n * ],\n * };\n * ```\n */\nexport function provideZToast(config?: Partial<ZToasterConfig>): EnvironmentProviders {\n const mergedConfig: ZToasterConfig = {\n ...Z_TOASTER_DEFAULT_CONFIG,\n ...config,\n };\n\n return makeEnvironmentProviders([{ provide: Z_TOASTER_CONFIG, useValue: mergedConfig }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;AAAA;MASa,YAAY,GAAG,IAAI,cAAc,CAAM,cAAc;AAC3D,MAAM,0BAA0B,GAAG,GAAG;MAChC,gBAAgB,GAAG,IAAI,cAAc,CAAiB,kBAAkB;AAyB9E,MAAM,wBAAwB,GAAmB;AACtD,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,cAAc,EAAE,CAAC;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE,MAAM;;;AC1CP,MAAM,cAAc,GAAG,GAAG,CAC/B,uIAAuI,EACvI;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,QAAQ,EAAE;AACR,YAAA,OAAO,EAAE,iEAAiE;AAC1E,YAAA,OAAO,EACL,+MAA+M;AACjN,YAAA,KAAK,EACH,mMAAmM;AACrM,YAAA,OAAO,EACL,+MAA+M;AACjN,YAAA,IAAI,EAAE,yMAAyM;AAChN,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,QAAQ,EAAE,SAAS;AACpB,KAAA;AACF,CAAA;;MCKU,eAAe,CAAA;AACT,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,OAAO,GAAmB,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,wBAAwB;AAEnG,IAAA,KAAK,GAAG,KAAK,CAAa,EAAE,iDAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAA6B,SAAS,oDAAC;IACvD,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAe;IAC7B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkB;IACnC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;IAC9B,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;IAC1B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAC3B,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAChC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;AAC/B,IAAA,aAAa,GAAG,KAAK,CAAgB,EAAE,yDAAC;IACxC,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAa;AAEtB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,0DAAC;AACjF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,cAAc,6DAAC;AAChG,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,+DAAC;AAC5F,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,2DAAC;AACjF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,6DAAC;AACtF,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,kEAAC;AAElG,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,KAAK,gEAAC;AAChG,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,wDAAC;AAEzE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MACrC,aAAa,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC5F;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,QAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;AACtB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO;AACvD,IAAA,CAAC,uDAAC;uGArCS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzB5B,uYAWA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDOY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAOf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAT3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,OAAA,EACrB,CAAC,gBAAgB,CAAC,cACf,IAAI,EAAA,eAAA,EAEC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,YAC3B,QAAQ,EAAA,QAAA,EAAA,uYAAA,EAAA;;;MELP,aAAa,CAAA;AACP,IAAA,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,eAAe,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9D,IAAA,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEhD,WAAW,GAAsB,IAAI;IACrC,gBAAgB,GAAG,KAAK;IACxB,iBAAiB,GAA4B,IAAI;AAElD,IAAA,MAAM,CAAC,MAAuB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IAC7B;IAEO,IAAI,CAAC,OAAe,EAAE,OAAuB,EAAA;QAClD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACjD;IAEO,OAAO,CAAC,OAAe,EAAE,OAAuB,EAAA;QACrD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACzD;IAEO,KAAK,CAAC,OAAe,EAAE,OAAuB,EAAA;QACnD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACvD;IAEO,OAAO,CAAC,OAAe,EAAE,OAAuB,EAAA;QACrD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACzD;IAEO,IAAI,CAAC,OAAe,EAAE,OAAuB,EAAA;QAClD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACtD;IAEO,OAAO,CAAC,OAAe,EAAE,OAAuB,EAAA;QACrD,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACzD;IAEO,OAAO,CAAI,OAAmB,EAAE,QAAkC,EAAA;QACvE,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;QACjB,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;IACzC;IAEO,MAAM,CAAC,MAA0B,EAAE,OAAuB,EAAA;QAC/D,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,UAAU,EAAE;;QAGjB,MAAM,OAAO,GAAG,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACzE,QAAA,MAAM,aAAa,GAAuB;AACxC,YAAA,GAAG,MAAM;YACT,OAAO;SACR;;AAGD,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE;AACzC,YAAA,GAAG,OAAO;AACV,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,EAAE,EAAE,OAAO;AACX,YAAA,cAAc,EAAE;AACd,gBAAA,MAAM,EAAE,aAAa;AACtB,aAAA;AACF,SAAA,CAAC;IACJ;AAEO,IAAA,OAAO,CAAC,OAAyB,EAAA;AACtC,QAAA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB;IAEO,UAAU,GAAA;QACf,KAAK,CAAC,OAAO,EAAE;IACjB;IAEO,OAAO,GAAA;QACZ,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC/B;IACF;IAEO,WAAW,GAAA;QAChB,IAAI,CAAC,OAAO,EAAE;IAChB;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEQ,UAAU,GAAA;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,aAAmC;QAC5F,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE;YAC5C;QACF;AAEA,QAAA,IAAI;YACF,cAAc,CAAC,WAAW,EAAE;YAC5B,cAAc,CAAC,WAAW,EAAE;QAC9B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC;QAC5D;IACF;IAEQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACxC;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B;QACF;QAEA,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,wBAAwB,CAAC;QAC/E,IAAI,CAAC,gBAAgB,EAAE;YACrB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAK;YAClC,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,SAAS,IAAG;AACxD,gBAAA,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,QAAQ,IACN,QAAQ,CAAC,IAAI,KAAK,WAAW;AAC7B,oBAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAClC,IAAI,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CACtF,CACJ;gBAED,IAAI,aAAa,EAAE;oBACjB,IAAI,CAAC,UAAU,EAAE;gBACnB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,EAAE;AAC/C,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;AACnC,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;IACF;AAEQ,IAAA,cAAc,CAAC,MAAuB,EAAA;QAC5C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACxC;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB;QACF;AAEA,QAAA,MAAM,eAAe,GAAmB;AACtC,YAAA,GAAG,wBAAwB;YAC3B,GAAG,IAAI,CAAC,eAAe;AACvB,YAAA,GAAG,MAAM;SACV;AAED,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACtE,SAAA,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC;AACnE,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAE5B,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACxC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;AACtC,YAAA,WAAW,EAAE,KAAK;YAClB,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;YACnD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACtD,SAAA,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;QACtD,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO;AAEhD,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,UAAU,CAAC,OAAe,EAAA;QAChC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,OAAO;QAChB;QAEA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO;IACrD;uGAjOW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCJrB,qBAAqB,CAAA;AACf,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAAsB;IAEnD,OAAO,GAAA;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO;AAChC,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC;IACF;AAEU,IAAA,YAAY,CAAC,MAA0B,EAAA;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO;AAChC,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;;AAEpB,YAAA,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC;IACF;IAEU,mBAAmB,GAAA;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI;QAErC,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,UAAmB;QAC5B;QAEA,QAAQ,IAAI;AACV,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,mBAAmB;AAC5B,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,qBAAqB;AAC9B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,YAAY;AACrB,YAAA;AACE,gBAAA,OAAO,YAAY;;IAEzB;IAEU,+BAA+B,GAAA;QACvC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;;QAE9B,QAAQ,IAAI;AACV,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,4JAA4J;AACrK,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,uIAAuI;AAChJ,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,8IAA8I;AACvJ,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,gIAAgI;AACzI,YAAA;AACE,gBAAA,OAAO,iIAAiI;;IAE9I;AAEU,IAAA,gBAAgB,CAAC,MAA0B,EAAA;AACnD,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS;QACtC,QAAQ,IAAI;AACV,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,uFAAuF;AAChG,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,+EAA+E;AACxF,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,+EAA+E;AACxF,YAAA;AACE,gBAAA,OAAO,+EAA+E;;IAE5F;uGAxEW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECblC,o5KAqHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9GY,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAMb,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB,CAAC,cAAc,CAAC,EAAA,UAAA,EACb,IAAI,EAAA,eAAA,EAEC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,o5KAAA,EAAA;;;AERvC;;;;;;;;;;;;;;;;;;;;AAoBG;AACG,SAAU,aAAa,CAAC,MAAgC,EAAA;AAC5D,IAAA,MAAM,YAAY,GAAmB;AACnC,QAAA,GAAG,wBAAwB;AAC3B,QAAA,GAAG,MAAM;KACV;AAED,IAAA,OAAO,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;AAC1F;;AC/BA;;AAEG;;;;"}
@@ -308,10 +308,45 @@ const Z_UI_EN_TRANSLATIONS = {
308
308
  i18n_z_ui_gallery_delete: 'Delete',
309
309
  i18n_z_ui_gallery_rotate_left: 'Rotate left',
310
310
  i18n_z_ui_gallery_rotate_right: 'Rotate right',
311
+ i18n_z_ui_gallery_pdf_preview: 'PDF preview',
312
+ i18n_z_ui_gallery_loading_preview: 'Loading preview...',
313
+ i18n_z_ui_gallery_preview_load_error: 'Unable to load preview',
311
314
  i18n_z_ui_gallery_preview_not_supported: 'Preview not supported for this file type',
315
+ i18n_z_ui_gallery_video_not_supported: 'Your browser does not support the video tag.',
312
316
  i18n_z_ui_gallery_select_all: 'Select all',
313
317
  i18n_z_ui_gallery_selected: 'selected',
314
318
  i18n_z_ui_gallery_deselect_all: 'Deselect all',
319
+ // QR Code
320
+ i18n_z_ui_qrcode_download: 'Download QR Code',
321
+ i18n_z_ui_qrcode_text_label: 'QR Code Text',
322
+ i18n_z_ui_qrcode_text_placeholder: 'Enter text to encode...',
323
+ i18n_z_ui_qrcode_error_correction: 'Error Correction Level',
324
+ i18n_z_ui_qrcode_style: 'Style',
325
+ i18n_z_ui_qrcode_dot_style: 'Dot Shape',
326
+ i18n_z_ui_qrcode_eye_style: 'Eye Shape',
327
+ i18n_z_ui_qrcode_frame: 'Frame Style',
328
+ i18n_z_ui_qrcode_frame_text: 'Frame Text',
329
+ i18n_z_ui_qrcode_color_preset: 'Color Theme',
330
+ i18n_z_ui_qrcode_customization: 'QR Customization',
331
+ // Show More
332
+ i18n_z_ui_show_more_expand: 'Show more',
333
+ i18n_z_ui_show_more_collapse: 'Show less',
334
+ // Media Player
335
+ i18n_z_ui_media_player_play: 'Play',
336
+ i18n_z_ui_media_player_pause: 'Pause',
337
+ i18n_z_ui_media_player_mute: 'Mute',
338
+ i18n_z_ui_media_player_unmute: 'Unmute',
339
+ i18n_z_ui_media_player_settings: 'Settings',
340
+ i18n_z_ui_media_player_back: 'Back',
341
+ i18n_z_ui_media_player_quality: 'Quality',
342
+ i18n_z_ui_media_player_speed: 'Playback speed',
343
+ i18n_z_ui_media_player_normal: 'Normal',
344
+ i18n_z_ui_media_player_fullscreen: 'Fullscreen',
345
+ i18n_z_ui_media_player_exit_fullscreen: 'Exit fullscreen',
346
+ i18n_z_ui_media_player_theater_mode: 'Theater mode',
347
+ i18n_z_ui_media_player_default_mode: 'Default mode',
348
+ i18n_z_ui_media_player_miniplayer: 'Miniplayer',
349
+ i18n_z_ui_media_player_subtitles: 'Subtitles/closed captions',
315
350
  };
316
351
 
317
352
  const Z_UI_VI_TRANSLATIONS = {
@@ -620,10 +655,45 @@ const Z_UI_VI_TRANSLATIONS = {
620
655
  i18n_z_ui_gallery_delete: 'Xóa',
621
656
  i18n_z_ui_gallery_rotate_left: 'Xoay trái',
622
657
  i18n_z_ui_gallery_rotate_right: 'Xoay phải',
658
+ i18n_z_ui_gallery_pdf_preview: 'Xem trước PDF',
659
+ i18n_z_ui_gallery_loading_preview: 'Đang tải bản xem trước...',
660
+ i18n_z_ui_gallery_preview_load_error: 'Không thể tải bản xem trước',
623
661
  i18n_z_ui_gallery_preview_not_supported: 'Không hỗ trợ xem trước loại tệp này',
662
+ i18n_z_ui_gallery_video_not_supported: 'Trình duyệt của bạn không hỗ trợ thẻ video.',
624
663
  i18n_z_ui_gallery_select_all: 'Chọn tất cả',
625
664
  i18n_z_ui_gallery_selected: 'đã chọn',
626
665
  i18n_z_ui_gallery_deselect_all: 'Bỏ chọn tất cả',
666
+ // QR Code
667
+ i18n_z_ui_qrcode_download: 'Tải QR Code',
668
+ i18n_z_ui_qrcode_text_label: 'Nội dung QR Code',
669
+ i18n_z_ui_qrcode_text_placeholder: 'Nhập nội dung mã hóa...',
670
+ i18n_z_ui_qrcode_error_correction: 'Mức sửa lỗi',
671
+ i18n_z_ui_qrcode_style: 'Định dạng',
672
+ i18n_z_ui_qrcode_dot_style: 'Hình hoa văn',
673
+ i18n_z_ui_qrcode_eye_style: 'Hình mắt QR',
674
+ i18n_z_ui_qrcode_frame: 'Kiểu khung',
675
+ i18n_z_ui_qrcode_frame_text: 'Chữ trên khung',
676
+ i18n_z_ui_qrcode_color_preset: 'Chủ đề màu sắc',
677
+ i18n_z_ui_qrcode_customization: 'Tùy biến QR Code',
678
+ // Show More
679
+ i18n_z_ui_show_more_expand: 'Xem thêm',
680
+ i18n_z_ui_show_more_collapse: 'Thu gọn',
681
+ // Media Player
682
+ i18n_z_ui_media_player_play: 'Phát',
683
+ i18n_z_ui_media_player_pause: 'Tạm dừng',
684
+ i18n_z_ui_media_player_mute: 'Tắt tiếng',
685
+ i18n_z_ui_media_player_unmute: 'Bật tiếng',
686
+ i18n_z_ui_media_player_settings: 'Cài đặt',
687
+ i18n_z_ui_media_player_back: 'Quay lại',
688
+ i18n_z_ui_media_player_quality: 'Chất lượng',
689
+ i18n_z_ui_media_player_speed: 'Tốc độ phát',
690
+ i18n_z_ui_media_player_normal: 'Bình thường',
691
+ i18n_z_ui_media_player_fullscreen: 'Toàn màn hình',
692
+ i18n_z_ui_media_player_exit_fullscreen: 'Thoát toàn màn hình',
693
+ i18n_z_ui_media_player_theater_mode: 'Chế độ rạp chiếu phim',
694
+ i18n_z_ui_media_player_default_mode: 'Chế độ mặc định',
695
+ i18n_z_ui_media_player_miniplayer: 'Trình phát thu nhỏ',
696
+ i18n_z_ui_media_player_subtitles: 'Phụ đề/thuyết minh',
627
697
  };
628
698
 
629
699
  /**