@shival99/z-ui 2.1.33 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/shival99-z-ui-components-z-accordion.mjs +41 -25
- package/fesm2022/shival99-z-ui-components-z-accordion.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-autocomplete.mjs +176 -97
- package/fesm2022/shival99-z-ui-components-z-autocomplete.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-avatar.mjs +71 -40
- package/fesm2022/shival99-z-ui-components-z-avatar.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs +26 -15
- package/fesm2022/shival99-z-ui-components-z-breadcrumb.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-button-group.mjs +33 -21
- package/fesm2022/shival99-z-ui-components-z-button-group.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-button.mjs +32 -19
- package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs +289 -172
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-card.mjs +34 -24
- package/fesm2022/shival99-z-ui-components-z-card.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-chat.mjs +85 -47
- package/fesm2022/shival99-z-ui-components-z-chat.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-checkbox.mjs +56 -31
- package/fesm2022/shival99-z-ui-components-z-checkbox.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-code.mjs +29 -16
- package/fesm2022/shival99-z-ui-components-z-code.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-command.mjs +34 -19
- package/fesm2022/shival99-z-ui-components-z-command.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs +190 -92
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs +32 -18
- package/fesm2022/shival99-z-ui-components-z-dropdown-menu.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-editor.mjs +118 -62
- package/fesm2022/shival99-z-ui-components-z-editor.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-empty.mjs +31 -17
- package/fesm2022/shival99-z-ui-components-z-empty.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-filter.mjs +81 -54
- package/fesm2022/shival99-z-ui-components-z-filter.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-gallery.mjs +240 -132
- package/fesm2022/shival99-z-ui-components-z-gallery.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-icon.mjs +39 -21
- package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-input.mjs +173 -95
- package/fesm2022/shival99-z-ui-components-z-input.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-kanban.mjs +88 -47
- package/fesm2022/shival99-z-ui-components-z-kanban.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-loading.mjs +31 -19
- package/fesm2022/shival99-z-ui-components-z-loading.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-marquee.mjs +42 -23
- package/fesm2022/shival99-z-ui-components-z-marquee.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-media-player.mjs +87 -45
- package/fesm2022/shival99-z-ui-components-z-media-player.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-menu.mjs +126 -67
- package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-metric-card.mjs +42 -23
- package/fesm2022/shival99-z-ui-components-z-metric-card.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-modal.mjs +144 -80
- package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-pagination.mjs +45 -24
- package/fesm2022/shival99-z-ui-components-z-pagination.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-popover.mjs +90 -57
- package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-qrcode.mjs +51 -29
- package/fesm2022/shival99-z-ui-components-z-qrcode.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-radio.mjs +36 -20
- package/fesm2022/shival99-z-ui-components-z-radio.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-scrollarea.mjs +27 -15
- package/fesm2022/shival99-z-ui-components-z-scrollarea.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-select.mjs +239 -138
- package/fesm2022/shival99-z-ui-components-z-select.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-show-more.mjs +38 -21
- package/fesm2022/shival99-z-ui-components-z-show-more.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-skeleton-auto.mjs +42 -23
- package/fesm2022/shival99-z-ui-components-z-skeleton-auto.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +35 -19
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-steps.mjs +55 -31
- package/fesm2022/shival99-z-ui-components-z-steps.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-switch.mjs +60 -33
- package/fesm2022/shival99-z-ui-components-z-switch.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-table.mjs +896 -536
- package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs +60 -33
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-tags.mjs +72 -46
- package/fesm2022/shival99-z-ui-components-z-tags.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-timeline.mjs +38 -21
- package/fesm2022/shival99-z-ui-components-z-timeline.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-toast.mjs +53 -31
- package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +133 -56
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-upload.mjs +63 -36
- package/fesm2022/shival99-z-ui-components-z-upload.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-pipes.mjs +18 -18
- package/fesm2022/shival99-z-ui-services.mjs +35 -31
- package/fesm2022/shival99-z-ui-services.mjs.map +1 -1
- package/package.json +16 -16
- package/types/shival99-z-ui-components-z-autocomplete.d.ts +2 -2
- package/types/shival99-z-ui-components-z-card.d.ts +1 -2
- package/types/shival99-z-ui-components-z-drawer.d.ts +3 -1
- package/types/shival99-z-ui-components-z-gallery.d.ts +1 -2
- package/types/shival99-z-ui-components-z-select.d.ts +2 -2
- package/types/shival99-z-ui-components-z-table.d.ts +405 -38
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shival99-z-ui-components-z-timeline.mjs","sources":["../../../../libs/core-ui/components/z-timeline/z-timeline.variants.ts","../../../../libs/core-ui/components/z-timeline/z-timeline.component.ts","../../../../libs/core-ui/components/z-timeline/z-timeline.component.html","../../../../libs/core-ui/components/z-timeline/shival99-z-ui-components-z-timeline.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n// Host container\nexport const zTimelineVariants = cva(['z-timeline relative block min-w-0'], {\n variants: {\n zSize: {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\n// Outer dot ring\nexport const zTimelineDotVariants = cva(\n ['flex shrink-0 items-center justify-center rounded-full bg-primary/10 transition-colors duration-300'],\n {\n variants: {\n zSize: {\n sm: 'size-4.5',\n default: 'size-6',\n lg: 'size-7',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n }\n);\n\n// Inner dot\nexport const zTimelineInnerDotVariants = cva(['rounded-full bg-primary transition-colors duration-300'], {\n variants: {\n zSize: {\n sm: 'size-2',\n default: 'size-3',\n lg: 'size-3.5',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\n// Time badge\nexport const zTimelineTimeBadgeVariants = cva(\n [\n 'inline-flex w-fit max-w-full shrink-0 items-center justify-center rounded-md bg-primary px-2 py-0.5 text-sm font-semibold leading-tight text-primary-foreground transition-colors duration-300',\n ],\n {\n variants: {\n zSize: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-sm',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n }\n);\n\n// Title\nexport const zTimelineTitleVariants = cva(['font-medium leading-snug text-foreground'], {\n variants: {\n zSize: {\n sm: 'text-sm',\n default: 'text-base md:text-lg',\n lg: 'text-lg md:text-xl',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\n// Description\nexport const zTimelineDescriptionVariants = cva(['text-muted-foreground leading-relaxed'], {\n variants: {\n zSize: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\nexport type ZTimelineVariants = VariantProps<typeof zTimelineVariants>;\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ZIconComponent } from '@shival99/z-ui/components/z-icon';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport type { ZTimelineItem, ZTimelineLayout, ZTimelineSize } from './z-timeline.types';\nimport {\n zTimelineDescriptionVariants,\n zTimelineDotVariants,\n zTimelineInnerDotVariants,\n zTimelineTimeBadgeVariants,\n zTimelineTitleVariants,\n zTimelineVariants,\n} from './z-timeline.variants';\n\n@Component({\n selector: 'z-timeline',\n imports: [NgTemplateOutlet, ZIconComponent],\n standalone: true,\n templateUrl: './z-timeline.component.html',\n styles: `\n .z-timeline {\n container-type: inline-size;\n }\n\n .z-timeline-default-mobile-meta {\n display: none;\n }\n\n .z-timeline-progress-dot {\n background: var(--primary);\n transition:\n background-color 180ms ease,\n border-color 180ms ease,\n box-shadow 180ms ease;\n }\n\n .z-timeline-progress-dot-ring {\n background: color-mix(in oklab, var(--primary) 14%, transparent);\n transition: background-color 180ms ease;\n }\n\n .z-timeline-progress-line {\n background: var(--primary);\n transition: height 120ms linear;\n }\n\n .z-timeline-progress-inactive .z-timeline-progress-dot-ring {\n background: var(--border);\n }\n\n .z-timeline-progress-inactive .z-timeline-progress-dot {\n background: var(--muted-foreground);\n border-color: var(--border);\n }\n\n @container (max-width: 34rem) {\n .z-timeline-default-item {\n grid-template-columns: 1.5rem minmax(0, 1fr);\n }\n\n .z-timeline-default-meta {\n display: none;\n }\n\n .z-timeline-default-mobile-meta {\n display: flex;\n }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class ZTimelineComponent {\n public readonly class = input<ClassValue>('');\n public readonly zItems = input<ZTimelineItem[]>([]);\n public readonly zSize = input<ZTimelineSize>('default');\n public readonly zLayout = input<ZTimelineLayout>('default');\n public readonly zScrollProgress = input(false, { transform: booleanAttribute });\n\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _timelineItems = viewChildren<ElementRef<HTMLElement>>('timelineItem');\n private readonly _progressRatio = signal(0);\n\n protected readonly hostClasses = computed(() =>\n zMergeClasses(zTimelineVariants({ zSize: this.zSize() }), this.class())\n );\n\n protected readonly dotClasses = computed(() => zTimelineDotVariants({ zSize: this.zSize() }));\n\n protected readonly innerDotClasses = computed(() => zTimelineInnerDotVariants({ zSize: this.zSize() }));\n\n protected readonly badgeClasses = computed(() => zTimelineTimeBadgeVariants({ zSize: this.zSize() }));\n\n protected readonly titleClasses = computed(() => zTimelineTitleVariants({ zSize: this.zSize() }));\n\n protected readonly descriptionClasses = computed(() => zTimelineDescriptionVariants({ zSize: this.zSize() }));\n\n protected readonly isCareer = computed(() => this.zLayout() === 'career');\n\n protected readonly isAlternate = computed(() => this.zLayout() === 'alternate');\n\n protected readonly progressStates = computed(() => {\n const items = this.zItems();\n\n if (!this.zScrollProgress()) {\n return items.map(() => true);\n }\n\n const lastIndex = items.length - 1;\n const progressRatio = this._progressRatio();\n if (lastIndex <= 0) {\n return items.map(() => progressRatio > 0);\n }\n\n return items.map((_item, index) => {\n if (index === 0) {\n return progressRatio > 0;\n }\n\n return progressRatio >= index / lastIndex;\n });\n });\n\n protected readonly progressLineHeight = computed(() => {\n if (!this.zScrollProgress()) {\n return '100%';\n }\n\n return `${this._progressRatio() * 100}%`;\n });\n\n protected readonly progressSegments = computed(() => {\n const items = this.zItems();\n const lastIndex = items.length - 1;\n\n if (!this.zScrollProgress()) {\n return items.map(() => '100%');\n }\n\n if (lastIndex <= 0) {\n return items.map(() => `${this._progressRatio() * 100}%`);\n }\n\n const progressRatio = this._progressRatio();\n return items.map((_item, index) => {\n const segmentStart = index / lastIndex;\n const segmentEnd = (index + 1) / lastIndex;\n const segmentProgress = (progressRatio - segmentStart) / (segmentEnd - segmentStart);\n const boundedProgress = Math.min(Math.max(segmentProgress, 0), 1);\n\n return `${boundedProgress * 100}%`;\n });\n });\n\n constructor() {\n effect(onCleanup => {\n if (!this.zScrollProgress()) {\n this._progressRatio.set(0);\n return;\n }\n\n if (typeof window === 'undefined') {\n this._progressRatio.set(1);\n return;\n }\n\n const elements = this._timelineItems().map(item => item.nativeElement);\n if (!elements.length) {\n this._progressRatio.set(0);\n return;\n }\n\n let animationFrame: number | null = null;\n\n const updateProgress = (): void => {\n this._progressRatio.set(this._calculateProgressRatio(elements));\n };\n\n const scheduleUpdate = (): void => {\n if (animationFrame !== null) {\n return;\n }\n\n animationFrame = window.requestAnimationFrame(() => {\n animationFrame = null;\n updateProgress();\n });\n };\n\n scheduleUpdate();\n window.addEventListener('scroll', scheduleUpdate, { passive: true });\n window.addEventListener('resize', scheduleUpdate);\n\n onCleanup(() => {\n window.removeEventListener('scroll', scheduleUpdate);\n window.removeEventListener('resize', scheduleUpdate);\n\n if (animationFrame === null) {\n return;\n }\n\n window.cancelAnimationFrame(animationFrame);\n });\n });\n\n this._destroyRef.onDestroy(() => this._progressRatio.set(0));\n }\n\n private _calculateProgressRatio(elements: HTMLElement[]): number {\n if (!elements.length) {\n return 0;\n }\n\n const triggerY = window.innerHeight * 0.55;\n const itemTops = elements.map(element => element.getBoundingClientRect().top);\n const firstTop = itemTops[0];\n const lastTop = itemTops[itemTops.length - 1];\n\n if (triggerY <= firstTop) {\n return 0;\n }\n\n if (triggerY >= lastTop) {\n return 1;\n }\n\n const activeSegmentIndex = itemTops.findIndex((top, index) => {\n const nextTop = itemTops[index + 1];\n if (nextTop === undefined) {\n return false;\n }\n\n return triggerY >= top && triggerY < nextTop;\n });\n\n if (activeSegmentIndex < 0) {\n return 0;\n }\n\n const segmentStart = itemTops[activeSegmentIndex];\n const segmentEnd = itemTops[activeSegmentIndex + 1];\n const segmentDistance = segmentEnd - segmentStart;\n if (segmentDistance <= 0) {\n return 0;\n }\n\n const localProgress = (triggerY - segmentStart) / segmentDistance;\n return (activeSegmentIndex + localProgress) / (itemTops.length - 1);\n }\n}\n","@if (isCareer()) {\n <!-- ══════════════════════════════════════════════════════════ -->\n <!-- CAREER / EXPERIENCE LAYOUT -->\n <!-- ══════════════════════════════════════════════════════════ -->\n @let progress = progressStates();\n <div class=\"mx-auto w-full max-w-3xl px-2 sm:px-4\">\n <div class=\"relative ml-3\">\n <div class=\"bg-border absolute top-3 bottom-3 left-0 w-0.5 overflow-hidden\">\n <div\n class=\"z-timeline-progress-line absolute inset-x-0 top-0 w-0.5\"\n [style.height]=\"zScrollProgress() ? progressLineHeight() : '0%'\"></div>\n </div>\n\n @for (item of zItems(); track item.id ?? $index; let isLast = $last) {\n @let isActive = progress[$index];\n <article\n #timelineItem\n class=\"relative pb-10 pl-8\"\n [class.pb-0]=\"isLast\"\n [class.z-timeline-progress-inactive]=\"zScrollProgress() && !isActive\">\n <span\n class=\"bg-background border-primary absolute top-2 left-0 z-[1] size-3 -translate-x-1/2 rounded-full border-2\"\n [class.z-timeline-progress-dot]=\"zScrollProgress()\"></span>\n\n <div class=\"space-y-3\">\n <div class=\"flex items-center gap-2.5\">\n <div class=\"bg-accent flex size-9 shrink-0 items-center justify-center rounded-full\">\n <z-icon [zType]=\"item.icon ?? 'lucideBuilding2'\" zSize=\"18\" class=\"text-muted-foreground\" />\n </div>\n <span class=\"text-base font-medium\">{{ item.company ?? item.subtitle ?? 'Experience' }}</span>\n </div>\n\n <div class=\"space-y-2\">\n <h3 class=\"text-foreground text-xl leading-tight font-semibold tracking-[-0.01em]\">{{ item.title }}</h3>\n @if (item.period || item.time) {\n <div class=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <z-icon zType=\"lucideCalendar\" zSize=\"15\" class=\"shrink-0\" />\n <span>{{ item.period ?? item.time }}</span>\n </div>\n }\n </div>\n\n @if (item.description) {\n <p class=\"text-muted-foreground text-sm leading-relaxed sm:text-base\">{{ item.description }}</p>\n }\n\n @if (item.technologies?.length) {\n <div class=\"flex flex-wrap gap-2\">\n @for (tech of item.technologies; track tech) {\n <span\n class=\"bg-secondary text-secondary-foreground inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\">\n {{ tech }}\n </span>\n }\n </div>\n }\n\n @if (item.contentTemplate) {\n <ng-container [ngTemplateOutlet]=\"item.contentTemplate\" />\n }\n </div>\n </article>\n }\n </div>\n </div>\n} @else if (isAlternate()) {\n <!-- ══════════════════════════════════════════════════════════ -->\n <!-- ALTERNATE / ZIGZAG LAYOUT -->\n <!-- ══════════════════════════════════════════════════════════ -->\n @let progress = progressStates();\n <div class=\"relative mx-auto max-w-7xl space-y-4\">\n @for (item of zItems(); track item.id ?? $index; let isEven = $even) {\n @let isActive = progress[$index];\n <div\n #timelineItem\n class=\"flex items-start md:flex-row\"\n [class.md:flex-row-reverse]=\"!isEven\"\n [class.z-timeline-progress-inactive]=\"zScrollProgress() && !isActive\">\n <!-- Opposite-side badge (desktop only) -->\n <div\n class=\"hidden w-full md:flex md:flex-1 md:items-start\"\n [class.md:justify-end]=\"isEven\"\n [class.md:justify-start]=\"!isEven\">\n @if (item.time) {\n <span [class]=\"badgeClasses()\">{{ item.time }}</span>\n }\n </div>\n\n <!-- Center marker column -->\n <div class=\"relative flex flex-col items-center pr-4 md:px-4\">\n <div class=\"z-40 flex items-center justify-center\">\n <span [class]=\"dotClasses()\" [class.z-timeline-progress-dot-ring]=\"true\">\n <span [class]=\"innerDotClasses()\" [class.z-timeline-progress-dot]=\"true\"></span>\n </span>\n </div>\n </div>\n\n <!-- Content side -->\n <div class=\"w-full md:flex md:flex-1\" [class.md:justify-start]=\"isEven\" [class.md:justify-end]=\"!isEven\">\n <!-- Mobile badge -->\n @if (item.time) {\n <span [class]=\"badgeClasses()\" class=\"mb-4 block text-left md:hidden\">{{ item.time }}</span>\n }\n\n <div>\n <!-- Card -->\n <div\n class=\"bg-card text-card-foreground mb-8 flex flex-col gap-6 overflow-hidden rounded-xl border py-6 shadow-sm md:max-w-136\">\n <div class=\"space-y-4 px-6\">\n <div [class]=\"titleClasses()\">{{ item.title }}</div>\n @if (item.description) {\n <p [class]=\"descriptionClasses()\">{{ item.description }}</p>\n }\n @if (item.contentTemplate) {\n <ng-container [ngTemplateOutlet]=\"item.contentTemplate\" />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Vertical line (absolute, behind everything) -->\n <div class=\"bg-border absolute top-3 bottom-3 left-3 w-0.5 overflow-hidden md:left-1/2 md:-translate-x-1/2\">\n <div\n class=\"z-timeline-progress-line absolute inset-x-0 top-0 w-0.5 rounded-full\"\n [style.height]=\"progressLineHeight()\"></div>\n </div>\n </div>\n} @else {\n <!-- ══════════════════════════════════════════════════════════ -->\n <!-- DEFAULT / CHANGELOG LAYOUT -->\n <!-- ══════════════════════════════════════════════════════════ -->\n @let progress = progressStates();\n @let segments = progressSegments();\n @for (item of zItems(); track item.id ?? $index; let isLast = $last) {\n @let isActive = progress[$index];\n <article\n #timelineItem\n class=\"z-timeline-default-item relative grid grid-cols-[7rem_1.5rem_minmax(0,1fr)] gap-x-3\"\n [class.z-timeline-progress-inactive]=\"zScrollProgress() && !isActive\">\n <!-- Left: badge + subtitle (desktop only) -->\n <div class=\"z-timeline-default-meta flex min-w-0 flex-col items-end gap-2 self-start pb-4\">\n @if (item.time) {\n <span [class]=\"badgeClasses()\">{{ item.time }}</span>\n }\n @if (item.subtitle) {\n <div class=\"text-muted-foreground max-w-full text-right text-sm leading-snug font-medium\">\n {{ item.subtitle }}\n </div>\n }\n </div>\n\n <!-- Center: dot + line -->\n <div class=\"relative flex flex-col items-center\">\n <div class=\"bg-background relative z-[1] flex size-6 items-center justify-center rounded-full\">\n <span [class]=\"dotClasses()\" [class.z-timeline-progress-dot-ring]=\"true\">\n <span [class]=\"innerDotClasses()\" [class.z-timeline-progress-dot]=\"true\"></span>\n </span>\n </div>\n @if (!isLast) {\n <span class=\"bg-border absolute top-6 bottom-0 left-1/2 w-px -translate-x-1/2 overflow-hidden rounded-full\">\n @if (zScrollProgress()) {\n <span\n class=\"z-timeline-progress-line absolute inset-x-0 top-0 w-px rounded-full\"\n [style.height]=\"segments[$index]\"></span>\n }\n </span>\n <span class=\"w-px flex-1\"></span>\n }\n </div>\n\n <!-- Right: content -->\n <div class=\"z-timeline-default-content flex min-w-0 flex-col gap-4 pb-10 pl-1\">\n <!-- Mobile badge + subtitle -->\n <div class=\"z-timeline-default-mobile-meta flex-col gap-2\">\n @if (item.time) {\n <span [class]=\"badgeClasses()\" class=\"w-fit\">{{ item.time }}</span>\n }\n @if (item.subtitle) {\n <div class=\"text-muted-foreground text-sm font-medium\">{{ item.subtitle }}</div>\n }\n </div>\n\n <!-- Content -->\n <div class=\"min-w-0 space-y-4\">\n <div class=\"space-y-3\">\n <h3 [class]=\"titleClasses()\">{{ item.title }}</h3>\n @if (item.description) {\n <p [class]=\"descriptionClasses()\">{{ item.description }}</p>\n }\n </div>\n @if (item.contentTemplate) {\n <ng-container [ngTemplateOutlet]=\"item.contentTemplate\" />\n }\n </div>\n </div>\n </article>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAEA;MACa,iBAAiB,GAAG,GAAG,CAAC,CAAC,mCAAmC,CAAC,EAAE;AAC1E,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,OAAO,EAAE,WAAW;AACpB,YAAA,EAAE,EAAE,SAAS;AACd,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;AAED;MACa,oBAAoB,GAAG,GAAG,CACrC,CAAC,qGAAqG,CAAC,EACvG;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,UAAU;AACd,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,EAAE,EAAE,QAAQ;AACb,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;AAGH;MACa,yBAAyB,GAAG,GAAG,CAAC,CAAC,wDAAwD,CAAC,EAAE;AACvG,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,QAAQ;AACZ,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,EAAE,EAAE,UAAU;AACf,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;AAED;AACO,MAAM,0BAA0B,GAAG,GAAG,CAC3C;IACE,gMAAgM;CACjM,EACD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,EAAE,EAAE,SAAS;AACd,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;AAGH;MACa,sBAAsB,GAAG,GAAG,CAAC,CAAC,0CAA0C,CAAC,EAAE;AACtF,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,OAAO,EAAE,sBAAsB;AAC/B,YAAA,EAAE,EAAE,oBAAoB;AACzB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;AAED;MACa,4BAA4B,GAAG,GAAG,CAAC,CAAC,uCAAuC,CAAC,EAAE;AACzF,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;;MCHY,kBAAkB,CAAA;AACb,IAAA,KAAK,GAAG,KAAK,CAAa,EAAE,iDAAC;AAC7B,IAAA,MAAM,GAAG,KAAK,CAAkB,EAAE,kDAAC;AACnC,IAAA,KAAK,GAAG,KAAK,CAAgB,SAAS,iDAAC;AACvC,IAAA,OAAO,GAAG,KAAK,CAAkB,SAAS,mDAAC;IAC3C,eAAe,GAAG,KAAK,CAAC,KAAK,4DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE9D,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,cAAc,GAAG,YAAY,CAA0B,cAAc,0DAAC;AACtE,IAAA,cAAc,GAAG,MAAM,CAAC,CAAC,0DAAC;IAExB,WAAW,GAAG,QAAQ,CAAC,MACxC,aAAa,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACxE;AAEkB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,sDAAC;AAE1E,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,yBAAyB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,2DAAC;AAEpF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,wDAAC;AAElF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,wDAAC;AAE9E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,4BAA4B,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,8DAAC;AAE1F,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,oDAAC;AAEtD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,WAAW,uDAAC;AAE5D,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAE3B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC3B,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC;QAC9B;AAEA,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;AAClC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;AAC3C,QAAA,IAAI,SAAS,IAAI,CAAC,EAAE;YAClB,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;QAC3C;QAEA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAChC,YAAA,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,aAAa,GAAG,CAAC;YAC1B;AAEA,YAAA,OAAO,aAAa,IAAI,KAAK,GAAG,SAAS;AAC3C,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,0DAAC;AAEiB,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,YAAA,OAAO,MAAM;QACf;QAEA,OAAO,CAAA,EAAG,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,GAAG;AAC1C,IAAA,CAAC,8DAAC;AAEiB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAClD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;AAElC,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC3B,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC;QAChC;AAEA,QAAA,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,CAAA,CAAA,CAAG,CAAC;QAC3D;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE;QAC3C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAChC,YAAA,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS;YACtC,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS;AAC1C,YAAA,MAAM,eAAe,GAAG,CAAC,aAAa,GAAG,YAAY,KAAK,UAAU,GAAG,YAAY,CAAC;AACpF,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAEjE,YAAA,OAAO,CAAA,EAAG,eAAe,GAAG,GAAG,GAAG;AACpC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,4DAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,SAAS,IAAG;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B;YACF;AAEA,YAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC;AACtE,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACpB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1B;YACF;YAEA,IAAI,cAAc,GAAkB,IAAI;YAExC,MAAM,cAAc,GAAG,MAAW;AAChC,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AACjE,YAAA,CAAC;YAED,MAAM,cAAc,GAAG,MAAW;AAChC,gBAAA,IAAI,cAAc,KAAK,IAAI,EAAE;oBAC3B;gBACF;AAEA,gBAAA,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAK;oBACjD,cAAc,GAAG,IAAI;AACrB,oBAAA,cAAc,EAAE;AAClB,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC;AAED,YAAA,cAAc,EAAE;AAChB,YAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACpE,YAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC;YAEjD,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC;AACpD,gBAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,CAAC;AAEpD,gBAAA,IAAI,cAAc,KAAK,IAAI,EAAE;oBAC3B;gBACF;AAEA,gBAAA,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC;AAC7C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D;AAEQ,IAAA,uBAAuB,CAAC,QAAuB,EAAA;AACrD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACpB,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI;AAC1C,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;AAC7E,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AAE7C,QAAA,IAAI,QAAQ,IAAI,QAAQ,EAAE;AACxB,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,IAAI,QAAQ,IAAI,OAAO,EAAE;AACvB,YAAA,OAAO,CAAC;QACV;QAEA,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;YAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;AACnC,YAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,OAAO,QAAQ,IAAI,GAAG,IAAI,QAAQ,GAAG,OAAO;AAC9C,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,kBAAkB,GAAG,CAAC,EAAE;AAC1B,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,GAAG,CAAC,CAAC;AACnD,QAAA,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY;AACjD,QAAA,IAAI,eAAe,IAAI,CAAC,EAAE;AACxB,YAAA,OAAO,CAAC;QACV;QAEA,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAG,YAAY,IAAI,eAAe;AACjE,QAAA,OAAO,CAAC,kBAAkB,GAAG,aAAa,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE;uGAhLW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzF/B,g2UAyMA,EAAA,MAAA,EAAA,CAAA,izBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3KY,gBAAgB,oJAAE,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;;2FA2D/B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBA7D9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,WACb,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAA,UAAA,EAC/B,IAAI,EAAA,eAAA,EAoDC,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA,EAAA,QAAA,EAAA,g2UAAA,EAAA,MAAA,EAAA,CAAA,izBAAA,CAAA,EAAA;qkBAUuE,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjGxF;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"shival99-z-ui-components-z-timeline.mjs","sources":["../../../../libs/core-ui/components/z-timeline/z-timeline.variants.ts","../../../../libs/core-ui/components/z-timeline/z-timeline.component.ts","../../../../libs/core-ui/components/z-timeline/z-timeline.component.html","../../../../libs/core-ui/components/z-timeline/shival99-z-ui-components-z-timeline.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n// Host container\nexport const zTimelineVariants = cva(['z-timeline relative block min-w-0'], {\n variants: {\n zSize: {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\n// Outer dot ring\nexport const zTimelineDotVariants = cva(\n ['flex shrink-0 items-center justify-center rounded-full bg-primary/10 transition-colors duration-300'],\n {\n variants: {\n zSize: {\n sm: 'size-4.5',\n default: 'size-6',\n lg: 'size-7',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n }\n);\n\n// Inner dot\nexport const zTimelineInnerDotVariants = cva(['rounded-full bg-primary transition-colors duration-300'], {\n variants: {\n zSize: {\n sm: 'size-2',\n default: 'size-3',\n lg: 'size-3.5',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\n// Time badge\nexport const zTimelineTimeBadgeVariants = cva(\n [\n 'inline-flex w-fit max-w-full shrink-0 items-center justify-center rounded-md bg-primary px-2 py-0.5 text-sm font-semibold leading-tight text-primary-foreground transition-colors duration-300',\n ],\n {\n variants: {\n zSize: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-sm',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n }\n);\n\n// Title\nexport const zTimelineTitleVariants = cva(['font-medium leading-snug text-foreground'], {\n variants: {\n zSize: {\n sm: 'text-sm',\n default: 'text-base md:text-lg',\n lg: 'text-lg md:text-xl',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\n// Description\nexport const zTimelineDescriptionVariants = cva(['text-muted-foreground leading-relaxed'], {\n variants: {\n zSize: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n zSize: 'default',\n },\n});\n\nexport type ZTimelineVariants = VariantProps<typeof zTimelineVariants>;\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChildren,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ZIconComponent } from '@shival99/z-ui/components/z-icon';\nimport { zMergeClasses } from '@shival99/z-ui/utils';\nimport type { ClassValue } from 'clsx';\nimport type { ZTimelineItem, ZTimelineLayout, ZTimelineSize } from './z-timeline.types';\nimport {\n zTimelineDescriptionVariants,\n zTimelineDotVariants,\n zTimelineInnerDotVariants,\n zTimelineTimeBadgeVariants,\n zTimelineTitleVariants,\n zTimelineVariants,\n} from './z-timeline.variants';\n\n@Component({\n selector: 'z-timeline',\n imports: [NgTemplateOutlet, ZIconComponent],\n standalone: true,\n templateUrl: './z-timeline.component.html',\n styles: `\n .z-timeline {\n container-type: inline-size;\n }\n\n .z-timeline-default-mobile-meta {\n display: none;\n }\n\n .z-timeline-progress-dot {\n background: var(--primary);\n transition:\n background-color 180ms ease,\n border-color 180ms ease,\n box-shadow 180ms ease;\n }\n\n .z-timeline-progress-dot-ring {\n background: color-mix(in oklab, var(--primary) 14%, transparent);\n transition: background-color 180ms ease;\n }\n\n .z-timeline-progress-line {\n background: var(--primary);\n transition: height 120ms linear;\n }\n\n .z-timeline-progress-inactive .z-timeline-progress-dot-ring {\n background: var(--border);\n }\n\n .z-timeline-progress-inactive .z-timeline-progress-dot {\n background: var(--muted-foreground);\n border-color: var(--border);\n }\n\n @container (max-width: 34rem) {\n .z-timeline-default-item {\n grid-template-columns: 1.5rem minmax(0, 1fr);\n }\n\n .z-timeline-default-meta {\n display: none;\n }\n\n .z-timeline-default-mobile-meta {\n display: flex;\n }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class ZTimelineComponent {\n public readonly class = input<ClassValue>('');\n public readonly zItems = input<ZTimelineItem[]>([]);\n public readonly zSize = input<ZTimelineSize>('default');\n public readonly zLayout = input<ZTimelineLayout>('default');\n public readonly zScrollProgress = input(false, { transform: booleanAttribute });\n\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _timelineItems = viewChildren<ElementRef<HTMLElement>>('timelineItem');\n private readonly _progressRatio = signal(0);\n\n protected readonly hostClasses = computed(() =>\n zMergeClasses(zTimelineVariants({ zSize: this.zSize() }), this.class())\n );\n\n protected readonly dotClasses = computed(() => zTimelineDotVariants({ zSize: this.zSize() }));\n\n protected readonly innerDotClasses = computed(() => zTimelineInnerDotVariants({ zSize: this.zSize() }));\n\n protected readonly badgeClasses = computed(() => zTimelineTimeBadgeVariants({ zSize: this.zSize() }));\n\n protected readonly titleClasses = computed(() => zTimelineTitleVariants({ zSize: this.zSize() }));\n\n protected readonly descriptionClasses = computed(() => zTimelineDescriptionVariants({ zSize: this.zSize() }));\n\n protected readonly isCareer = computed(() => this.zLayout() === 'career');\n\n protected readonly isAlternate = computed(() => this.zLayout() === 'alternate');\n\n protected readonly progressStates = computed(() => {\n const items = this.zItems();\n\n if (!this.zScrollProgress()) {\n return items.map(() => true);\n }\n\n const lastIndex = items.length - 1;\n const progressRatio = this._progressRatio();\n if (lastIndex <= 0) {\n return items.map(() => progressRatio > 0);\n }\n\n return items.map((_item, index) => {\n if (index === 0) {\n return progressRatio > 0;\n }\n\n return progressRatio >= index / lastIndex;\n });\n });\n\n protected readonly progressLineHeight = computed(() => {\n if (!this.zScrollProgress()) {\n return '100%';\n }\n\n return `${this._progressRatio() * 100}%`;\n });\n\n protected readonly progressSegments = computed(() => {\n const items = this.zItems();\n const lastIndex = items.length - 1;\n\n if (!this.zScrollProgress()) {\n return items.map(() => '100%');\n }\n\n if (lastIndex <= 0) {\n return items.map(() => `${this._progressRatio() * 100}%`);\n }\n\n const progressRatio = this._progressRatio();\n return items.map((_item, index) => {\n const segmentStart = index / lastIndex;\n const segmentEnd = (index + 1) / lastIndex;\n const segmentProgress = (progressRatio - segmentStart) / (segmentEnd - segmentStart);\n const boundedProgress = Math.min(Math.max(segmentProgress, 0), 1);\n\n return `${boundedProgress * 100}%`;\n });\n });\n\n constructor() {\n effect(onCleanup => {\n if (!this.zScrollProgress()) {\n this._progressRatio.set(0);\n return;\n }\n\n if (typeof window === 'undefined') {\n this._progressRatio.set(1);\n return;\n }\n\n const elements = this._timelineItems().map(item => item.nativeElement);\n if (!elements.length) {\n this._progressRatio.set(0);\n return;\n }\n\n let animationFrame: number | null = null;\n\n const updateProgress = (): void => {\n this._progressRatio.set(this._calculateProgressRatio(elements));\n };\n\n const scheduleUpdate = (): void => {\n if (animationFrame !== null) {\n return;\n }\n\n animationFrame = window.requestAnimationFrame(() => {\n animationFrame = null;\n updateProgress();\n });\n };\n\n scheduleUpdate();\n window.addEventListener('scroll', scheduleUpdate, { passive: true });\n window.addEventListener('resize', scheduleUpdate);\n\n onCleanup(() => {\n window.removeEventListener('scroll', scheduleUpdate);\n window.removeEventListener('resize', scheduleUpdate);\n\n if (animationFrame === null) {\n return;\n }\n\n window.cancelAnimationFrame(animationFrame);\n });\n });\n\n this._destroyRef.onDestroy(() => this._progressRatio.set(0));\n }\n\n private _calculateProgressRatio(elements: HTMLElement[]): number {\n if (!elements.length) {\n return 0;\n }\n\n const triggerY = window.innerHeight * 0.55;\n const itemTops = elements.map(element => element.getBoundingClientRect().top);\n const firstTop = itemTops[0];\n const lastTop = itemTops[itemTops.length - 1];\n\n if (triggerY <= firstTop) {\n return 0;\n }\n\n if (triggerY >= lastTop) {\n return 1;\n }\n\n const activeSegmentIndex = itemTops.findIndex((top, index) => {\n const nextTop = itemTops[index + 1];\n if (nextTop === undefined) {\n return false;\n }\n\n return triggerY >= top && triggerY < nextTop;\n });\n\n if (activeSegmentIndex < 0) {\n return 0;\n }\n\n const segmentStart = itemTops[activeSegmentIndex];\n const segmentEnd = itemTops[activeSegmentIndex + 1];\n const segmentDistance = segmentEnd - segmentStart;\n if (segmentDistance <= 0) {\n return 0;\n }\n\n const localProgress = (triggerY - segmentStart) / segmentDistance;\n return (activeSegmentIndex + localProgress) / (itemTops.length - 1);\n }\n}\n","@if (isCareer()) {\n <!-- ══════════════════════════════════════════════════════════ -->\n <!-- CAREER / EXPERIENCE LAYOUT -->\n <!-- ══════════════════════════════════════════════════════════ -->\n @let progress = progressStates();\n <div class=\"mx-auto w-full max-w-3xl px-2 sm:px-4\">\n <div class=\"relative ml-3\">\n <div class=\"bg-border absolute top-3 bottom-3 left-0 w-0.5 overflow-hidden\">\n <div\n class=\"z-timeline-progress-line absolute inset-x-0 top-0 w-0.5\"\n [style.height]=\"zScrollProgress() ? progressLineHeight() : '0%'\"></div>\n </div>\n\n @for (item of zItems(); track item.id ?? $index; let isLast = $last) {\n @let isActive = progress[$index];\n <article\n #timelineItem\n class=\"relative pb-10 pl-8\"\n [class.pb-0]=\"isLast\"\n [class.z-timeline-progress-inactive]=\"zScrollProgress() && !isActive\">\n <span\n class=\"bg-background border-primary absolute top-2 left-0 z-[1] size-3 -translate-x-1/2 rounded-full border-2\"\n [class.z-timeline-progress-dot]=\"zScrollProgress()\"></span>\n\n <div class=\"space-y-3\">\n <div class=\"flex items-center gap-2.5\">\n <div class=\"bg-accent flex size-9 shrink-0 items-center justify-center rounded-full\">\n <z-icon [zType]=\"item.icon ?? 'lucideBuilding2'\" zSize=\"18\" class=\"text-muted-foreground\" />\n </div>\n <span class=\"text-base font-medium\">{{ item.company ?? item.subtitle ?? 'Experience' }}</span>\n </div>\n\n <div class=\"space-y-2\">\n <h3 class=\"text-foreground text-xl leading-tight font-semibold tracking-[-0.01em]\">{{ item.title }}</h3>\n @if (item.period || item.time) {\n <div class=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <z-icon zType=\"lucideCalendar\" zSize=\"15\" class=\"shrink-0\" />\n <span>{{ item.period ?? item.time }}</span>\n </div>\n }\n </div>\n\n @if (item.description) {\n <p class=\"text-muted-foreground text-sm leading-relaxed sm:text-base\">{{ item.description }}</p>\n }\n\n @if (item.technologies?.length) {\n <div class=\"flex flex-wrap gap-2\">\n @for (tech of item.technologies; track tech) {\n <span\n class=\"bg-secondary text-secondary-foreground inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\">\n {{ tech }}\n </span>\n }\n </div>\n }\n\n @if (item.contentTemplate) {\n <ng-container [ngTemplateOutlet]=\"item.contentTemplate\" />\n }\n </div>\n </article>\n }\n </div>\n </div>\n} @else if (isAlternate()) {\n <!-- ══════════════════════════════════════════════════════════ -->\n <!-- ALTERNATE / ZIGZAG LAYOUT -->\n <!-- ══════════════════════════════════════════════════════════ -->\n @let progress = progressStates();\n <div class=\"relative mx-auto max-w-7xl space-y-4\">\n @for (item of zItems(); track item.id ?? $index; let isEven = $even) {\n @let isActive = progress[$index];\n <div\n #timelineItem\n class=\"flex items-start md:flex-row\"\n [class.md:flex-row-reverse]=\"!isEven\"\n [class.z-timeline-progress-inactive]=\"zScrollProgress() && !isActive\">\n <!-- Opposite-side badge (desktop only) -->\n <div\n class=\"hidden w-full md:flex md:flex-1 md:items-start\"\n [class.md:justify-end]=\"isEven\"\n [class.md:justify-start]=\"!isEven\">\n @if (item.time) {\n <span [class]=\"badgeClasses()\">{{ item.time }}</span>\n }\n </div>\n\n <!-- Center marker column -->\n <div class=\"relative flex flex-col items-center pr-4 md:px-4\">\n <div class=\"z-40 flex items-center justify-center\">\n <span [class]=\"dotClasses()\" [class.z-timeline-progress-dot-ring]=\"true\">\n <span [class]=\"innerDotClasses()\" [class.z-timeline-progress-dot]=\"true\"></span>\n </span>\n </div>\n </div>\n\n <!-- Content side -->\n <div class=\"w-full md:flex md:flex-1\" [class.md:justify-start]=\"isEven\" [class.md:justify-end]=\"!isEven\">\n <!-- Mobile badge -->\n @if (item.time) {\n <span [class]=\"badgeClasses()\" class=\"mb-4 block text-left md:hidden\">{{ item.time }}</span>\n }\n\n <div>\n <!-- Card -->\n <div\n class=\"bg-card text-card-foreground mb-8 flex flex-col gap-6 overflow-hidden rounded-xl border py-6 shadow-sm md:max-w-136\">\n <div class=\"space-y-4 px-6\">\n <div [class]=\"titleClasses()\">{{ item.title }}</div>\n @if (item.description) {\n <p [class]=\"descriptionClasses()\">{{ item.description }}</p>\n }\n @if (item.contentTemplate) {\n <ng-container [ngTemplateOutlet]=\"item.contentTemplate\" />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Vertical line (absolute, behind everything) -->\n <div class=\"bg-border absolute top-3 bottom-3 left-3 w-0.5 overflow-hidden md:left-1/2 md:-translate-x-1/2\">\n <div\n class=\"z-timeline-progress-line absolute inset-x-0 top-0 w-0.5 rounded-full\"\n [style.height]=\"progressLineHeight()\"></div>\n </div>\n </div>\n} @else {\n <!-- ══════════════════════════════════════════════════════════ -->\n <!-- DEFAULT / CHANGELOG LAYOUT -->\n <!-- ══════════════════════════════════════════════════════════ -->\n @let progress = progressStates();\n @let segments = progressSegments();\n @for (item of zItems(); track item.id ?? $index; let isLast = $last) {\n @let isActive = progress[$index];\n <article\n #timelineItem\n class=\"z-timeline-default-item relative grid grid-cols-[7rem_1.5rem_minmax(0,1fr)] gap-x-3\"\n [class.z-timeline-progress-inactive]=\"zScrollProgress() && !isActive\">\n <!-- Left: badge + subtitle (desktop only) -->\n <div class=\"z-timeline-default-meta flex min-w-0 flex-col items-end gap-2 self-start pb-4\">\n @if (item.time) {\n <span [class]=\"badgeClasses()\">{{ item.time }}</span>\n }\n @if (item.subtitle) {\n <div class=\"text-muted-foreground max-w-full text-right text-sm leading-snug font-medium\">\n {{ item.subtitle }}\n </div>\n }\n </div>\n\n <!-- Center: dot + line -->\n <div class=\"relative flex flex-col items-center\">\n <div class=\"bg-background relative z-[1] flex size-6 items-center justify-center rounded-full\">\n <span [class]=\"dotClasses()\" [class.z-timeline-progress-dot-ring]=\"true\">\n <span [class]=\"innerDotClasses()\" [class.z-timeline-progress-dot]=\"true\"></span>\n </span>\n </div>\n @if (!isLast) {\n <span class=\"bg-border absolute top-6 bottom-0 left-1/2 w-px -translate-x-1/2 overflow-hidden rounded-full\">\n @if (zScrollProgress()) {\n <span\n class=\"z-timeline-progress-line absolute inset-x-0 top-0 w-px rounded-full\"\n [style.height]=\"segments[$index]\"></span>\n }\n </span>\n <span class=\"w-px flex-1\"></span>\n }\n </div>\n\n <!-- Right: content -->\n <div class=\"z-timeline-default-content flex min-w-0 flex-col gap-4 pb-10 pl-1\">\n <!-- Mobile badge + subtitle -->\n <div class=\"z-timeline-default-mobile-meta flex-col gap-2\">\n @if (item.time) {\n <span [class]=\"badgeClasses()\" class=\"w-fit\">{{ item.time }}</span>\n }\n @if (item.subtitle) {\n <div class=\"text-muted-foreground text-sm font-medium\">{{ item.subtitle }}</div>\n }\n </div>\n\n <!-- Content -->\n <div class=\"min-w-0 space-y-4\">\n <div class=\"space-y-3\">\n <h3 [class]=\"titleClasses()\">{{ item.title }}</h3>\n @if (item.description) {\n <p [class]=\"descriptionClasses()\">{{ item.description }}</p>\n }\n </div>\n @if (item.contentTemplate) {\n <ng-container [ngTemplateOutlet]=\"item.contentTemplate\" />\n }\n </div>\n </div>\n </article>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -69,26 +69,46 @@ const zToastVariants = cva('group toast group-[.toaster]:bg-background group-[.t
|
|
|
69
69
|
class ZToastComponent {
|
|
70
70
|
_themeService = inject(ZThemeService);
|
|
71
71
|
_config = inject(Z_TOASTER_CONFIG, { optional: true }) ?? Z_TOASTER_DEFAULT_CONFIG;
|
|
72
|
-
class = input('',
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
72
|
+
class = input('', /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
74
|
+
zVariant = input('default', /* @ts-ignore */
|
|
75
|
+
...(ngDevMode ? [{ debugName: "zVariant" }] : /* istanbul ignore next */ []));
|
|
76
|
+
zTheme = input(/* @ts-ignore */
|
|
77
|
+
...(ngDevMode ? [undefined, { debugName: "zTheme" }] : /* istanbul ignore next */ []));
|
|
78
|
+
zPosition = input(/* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [undefined, { debugName: "zPosition" }] : /* istanbul ignore next */ []));
|
|
80
|
+
zRichColors = input(/* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [undefined, { debugName: "zRichColors" }] : /* istanbul ignore next */ []));
|
|
82
|
+
zExpand = input(/* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [undefined, { debugName: "zExpand" }] : /* istanbul ignore next */ []));
|
|
84
|
+
zDuration = input(/* @ts-ignore */
|
|
85
|
+
...(ngDevMode ? [undefined, { debugName: "zDuration" }] : /* istanbul ignore next */ []));
|
|
86
|
+
zVisibleToasts = input(/* @ts-ignore */
|
|
87
|
+
...(ngDevMode ? [undefined, { debugName: "zVisibleToasts" }] : /* istanbul ignore next */ []));
|
|
88
|
+
zCloseButton = input(/* @ts-ignore */
|
|
89
|
+
...(ngDevMode ? [undefined, { debugName: "zCloseButton" }] : /* istanbul ignore next */ []));
|
|
90
|
+
zToastOptions = input({}, /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "zToastOptions" }] : /* istanbul ignore next */ []));
|
|
92
|
+
zDir = input(/* @ts-ignore */
|
|
93
|
+
...(ngDevMode ? [undefined, { debugName: "zDir" }] : /* istanbul ignore next */ []));
|
|
94
|
+
effectiveTheme = computed(() => this.zTheme() ?? this._config.zTheme ?? 'system', /* @ts-ignore */
|
|
95
|
+
...(ngDevMode ? [{ debugName: "effectiveTheme" }] : /* istanbul ignore next */ []));
|
|
96
|
+
effectivePosition = computed(() => this.zPosition() ?? this._config.zPosition ?? 'bottom-right', /* @ts-ignore */
|
|
97
|
+
...(ngDevMode ? [{ debugName: "effectivePosition" }] : /* istanbul ignore next */ []));
|
|
98
|
+
effectiveRichColors = computed(() => this.zRichColors() ?? this._config.zRichColors ?? true, /* @ts-ignore */
|
|
99
|
+
...(ngDevMode ? [{ debugName: "effectiveRichColors" }] : /* istanbul ignore next */ []));
|
|
100
|
+
effectiveExpand = computed(() => this.zExpand() ?? this._config.zExpand ?? false, /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "effectiveExpand" }] : /* istanbul ignore next */ []));
|
|
102
|
+
effectiveDuration = computed(() => this.zDuration() ?? this._config.zDuration ?? 4000, /* @ts-ignore */
|
|
103
|
+
...(ngDevMode ? [{ debugName: "effectiveDuration" }] : /* istanbul ignore next */ []));
|
|
104
|
+
effectiveVisibleToasts = computed(() => this.zVisibleToasts() ?? this._config.zVisibleToasts ?? 3, /* @ts-ignore */
|
|
105
|
+
...(ngDevMode ? [{ debugName: "effectiveVisibleToasts" }] : /* istanbul ignore next */ []));
|
|
106
|
+
effectiveCloseButton = computed(() => this.zCloseButton() ?? this._config.zCloseButton ?? false, /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "effectiveCloseButton" }] : /* istanbul ignore next */ []));
|
|
108
|
+
effectiveDir = computed(() => this.zDir() ?? this._config.zDir ?? 'auto', /* @ts-ignore */
|
|
109
|
+
...(ngDevMode ? [{ debugName: "effectiveDir" }] : /* istanbul ignore next */ []));
|
|
110
|
+
zClasses = computed(() => zMergeClasses('toaster group', zToastVariants({ zVariant: this.zVariant() }), this.class()), /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "zClasses" }] : /* istanbul ignore next */ []));
|
|
92
112
|
offsetCompatStyles = Z_TOAST_OFFSET_COMPAT_STYLES;
|
|
93
113
|
detectTheme = computed(() => {
|
|
94
114
|
const theme = this.effectiveTheme();
|
|
@@ -96,11 +116,12 @@ class ZToastComponent {
|
|
|
96
116
|
return theme;
|
|
97
117
|
}
|
|
98
118
|
return this._themeService.isDark() ? 'dark' : 'light';
|
|
99
|
-
},
|
|
100
|
-
|
|
101
|
-
static
|
|
119
|
+
}, /* @ts-ignore */
|
|
120
|
+
...(ngDevMode ? [{ debugName: "detectTheme" }] : /* istanbul ignore next */ []));
|
|
121
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.2", type: ZToastComponent, isStandalone: true, selector: "z-toast, z-toaster", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, zVariant: { classPropertyName: "zVariant", publicName: "zVariant", isSignal: true, isRequired: false, transformFunction: null }, zTheme: { classPropertyName: "zTheme", publicName: "zTheme", isSignal: true, isRequired: false, transformFunction: null }, zPosition: { classPropertyName: "zPosition", publicName: "zPosition", isSignal: true, isRequired: false, transformFunction: null }, zRichColors: { classPropertyName: "zRichColors", publicName: "zRichColors", isSignal: true, isRequired: false, transformFunction: null }, zExpand: { classPropertyName: "zExpand", publicName: "zExpand", isSignal: true, isRequired: false, transformFunction: null }, zDuration: { classPropertyName: "zDuration", publicName: "zDuration", isSignal: true, isRequired: false, transformFunction: null }, zVisibleToasts: { classPropertyName: "zVisibleToasts", publicName: "zVisibleToasts", isSignal: true, isRequired: false, transformFunction: null }, zCloseButton: { classPropertyName: "zCloseButton", publicName: "zCloseButton", isSignal: true, isRequired: false, transformFunction: null }, zToastOptions: { classPropertyName: "zToastOptions", publicName: "zToastOptions", isSignal: true, isRequired: false, transformFunction: null }, zDir: { classPropertyName: "zDir", publicName: "zDir", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["zToast"], ngImport: i0, 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 [style]=\"offsetCompatStyles\" />\n", dependencies: [{ kind: "component", type: NgxSonnerToaster, selector: "ngx-sonner-toaster", inputs: ["invert", "theme", "position", "hotKey", "richColors", "expand", "duration", "visibleToasts", "closeButton", "toastOptions", "offset", "dir", "class", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
102
123
|
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastComponent, decorators: [{
|
|
104
125
|
type: Component,
|
|
105
126
|
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 [style]=\"offsetCompatStyles\" />\n" }]
|
|
106
127
|
}], 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 }] }] } });
|
|
@@ -286,17 +307,18 @@ class ZToastService {
|
|
|
286
307
|
}
|
|
287
308
|
return this._zTranslate.instant(message) || message;
|
|
288
309
|
}
|
|
289
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
290
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
310
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
311
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastService, providedIn: 'root' });
|
|
291
312
|
}
|
|
292
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
313
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastService, decorators: [{
|
|
293
314
|
type: Injectable,
|
|
294
315
|
args: [{ providedIn: 'root' }]
|
|
295
316
|
}] });
|
|
296
317
|
|
|
297
318
|
class ZToastCustomComponent {
|
|
298
319
|
_toastService = inject(ZToastService);
|
|
299
|
-
config = input.required(
|
|
320
|
+
config = input.required(/* @ts-ignore */
|
|
321
|
+
...(ngDevMode ? [{ debugName: "config" }] : /* istanbul ignore next */ []));
|
|
300
322
|
dismiss() {
|
|
301
323
|
const id = this.config().toastId;
|
|
302
324
|
if (id !== undefined) {
|
|
@@ -359,10 +381,10 @@ class ZToastCustomComponent {
|
|
|
359
381
|
return 'text-zinc-500 hover:text-zinc-600 dark:text-zinc-400 dark:hover:text-zinc-300';
|
|
360
382
|
}
|
|
361
383
|
}
|
|
362
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
363
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
384
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastCustomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
385
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", 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 });
|
|
364
386
|
}
|
|
365
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
387
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZToastCustomComponent, decorators: [{
|
|
366
388
|
type: Component,
|
|
367
389
|
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" }]
|
|
368
390
|
}], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shival99-z-ui-components-z-toast.mjs","sources":["../../../../libs/core-ui/components/z-toast/z-toast-offset.define.ts","../../../../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":["/** Khớp `VIEWPORT_OFFSET` và `--mobile-offset` của `@shival99/ngx-sonner`. */\nconst Z_TOAST_VIEWPORT_OFFSET = '32px';\nconst Z_TOAST_MOBILE_VIEWPORT_OFFSET = '16px';\n\n/**\n * `ngx-sonner` neo toaster bằng biến `--offset` (sonner v1). Sonner v2 đổi sang bộ\n * `--offset-top/-right/-bottom/-left` và `--mobile-offset-*`.\n *\n * Vấn đề: một số thư viện bên thứ ba đóng gói sẵn sonner v2 và tự inject CSS của nó vào\n * `document.head` lúc khởi tạo (ví dụ Univer trong luồng xem trước file bảng tính). Style đó chèn\n * sau stylesheet của app nên thắng cascade ở cùng specificity `(0,2,0)`, biến rule neo vị trí thành\n * `right: var(--offset-right)` — biến mà ngx-sonner không hề set. `var()` không resolve được khiến\n * `top`/`right` rơi về `auto`, toast dính góc trên bên trái và giữ nguyên tới khi reload trang.\n *\n * Khai báo sẵn bộ biến v2 ngay trên phần tử toaster: inline style thắng mọi stylesheet bất kể thư\n * viện nào inject sau, nên toast neo đúng vị trí trong cả hai phiên bản CSS.\n */\nexport const Z_TOAST_OFFSET_COMPAT_STYLES: Record<string, string> = {\n '--offset-top': Z_TOAST_VIEWPORT_OFFSET,\n '--offset-right': Z_TOAST_VIEWPORT_OFFSET,\n '--offset-bottom': Z_TOAST_VIEWPORT_OFFSET,\n '--offset-left': Z_TOAST_VIEWPORT_OFFSET,\n '--mobile-offset-top': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n '--mobile-offset-right': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n '--mobile-offset-bottom': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n '--mobile-offset-left': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n};\n","/* 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 { Z_TOAST_OFFSET_COMPAT_STYLES } from './z-toast-offset.define';\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 offsetCompatStyles = Z_TOAST_OFFSET_COMPAT_STYLES;\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 [style]=\"offsetCompatStyles\" />\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":"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"}
|
|
1
|
+
{"version":3,"file":"shival99-z-ui-components-z-toast.mjs","sources":["../../../../libs/core-ui/components/z-toast/z-toast-offset.define.ts","../../../../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":["/** Khớp `VIEWPORT_OFFSET` và `--mobile-offset` của `@shival99/ngx-sonner`. */\nconst Z_TOAST_VIEWPORT_OFFSET = '32px';\nconst Z_TOAST_MOBILE_VIEWPORT_OFFSET = '16px';\n\n/**\n * `ngx-sonner` neo toaster bằng biến `--offset` (sonner v1). Sonner v2 đổi sang bộ\n * `--offset-top/-right/-bottom/-left` và `--mobile-offset-*`.\n *\n * Vấn đề: một số thư viện bên thứ ba đóng gói sẵn sonner v2 và tự inject CSS của nó vào\n * `document.head` lúc khởi tạo (ví dụ Univer trong luồng xem trước file bảng tính). Style đó chèn\n * sau stylesheet của app nên thắng cascade ở cùng specificity `(0,2,0)`, biến rule neo vị trí thành\n * `right: var(--offset-right)` — biến mà ngx-sonner không hề set. `var()` không resolve được khiến\n * `top`/`right` rơi về `auto`, toast dính góc trên bên trái và giữ nguyên tới khi reload trang.\n *\n * Khai báo sẵn bộ biến v2 ngay trên phần tử toaster: inline style thắng mọi stylesheet bất kể thư\n * viện nào inject sau, nên toast neo đúng vị trí trong cả hai phiên bản CSS.\n */\nexport const Z_TOAST_OFFSET_COMPAT_STYLES: Record<string, string> = {\n '--offset-top': Z_TOAST_VIEWPORT_OFFSET,\n '--offset-right': Z_TOAST_VIEWPORT_OFFSET,\n '--offset-bottom': Z_TOAST_VIEWPORT_OFFSET,\n '--offset-left': Z_TOAST_VIEWPORT_OFFSET,\n '--mobile-offset-top': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n '--mobile-offset-right': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n '--mobile-offset-bottom': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n '--mobile-offset-left': Z_TOAST_MOBILE_VIEWPORT_OFFSET,\n};\n","/* 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 { Z_TOAST_OFFSET_COMPAT_STYLES } from './z-toast-offset.define';\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 offsetCompatStyles = Z_TOAST_OFFSET_COMPAT_STYLES;\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 [style]=\"offsetCompatStyles\" />\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":"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"}
|