@frame-kit/ui-ng 0.0.1
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/COMPONENTS.md +683 -0
- package/DEVELOPMENT_GUIDE.md +1102 -0
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/THEMING.md +130 -0
- package/core/headline/README.md +121 -0
- package/core/icon/README.md +173 -0
- package/core/image/README.md +210 -0
- package/core/link/README.md +297 -0
- package/core/separator/README.md +145 -0
- package/core/text/README.md +240 -0
- package/directives/infinite-scroll/README.md +102 -0
- package/directives/spotlight/README.md +154 -0
- package/directives/tooltip/README.md +147 -0
- package/docs/endpoint-link/README.md +142 -0
- package/docs/method-badge/README.md +154 -0
- package/fesm2022/frame-kit-ui-ng-core-headline.mjs +122 -0
- package/fesm2022/frame-kit-ui-ng-core-headline.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-icon.mjs +189 -0
- package/fesm2022/frame-kit-ui-ng-core-icon.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-image.mjs +123 -0
- package/fesm2022/frame-kit-ui-ng-core-image.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-link.mjs +369 -0
- package/fesm2022/frame-kit-ui-ng-core-link.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-separator.mjs +59 -0
- package/fesm2022/frame-kit-ui-ng-core-separator.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-text.mjs +204 -0
- package/fesm2022/frame-kit-ui-ng-core-text.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs +74 -0
- package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs +76 -0
- package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs +425 -0
- package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs +63 -0
- package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs +43 -0
- package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-forms.mjs +3632 -0
- package/fesm2022/frame-kit-ui-ng-forms.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs +239 -0
- package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs +132 -0
- package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs +133 -0
- package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs +60 -0
- package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-services-toast.mjs +166 -0
- package/fesm2022/frame-kit-ui-ng-services-toast.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs +214 -0
- package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-alert.mjs +82 -0
- package/fesm2022/frame-kit-ui-ng-ui-alert.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs +76 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-badge.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-badge.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs +68 -0
- package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-button.mjs +108 -0
- package/fesm2022/frame-kit-ui-ng-ui-button.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-callout.mjs +58 -0
- package/fesm2022/frame-kit-ui-ng-ui-callout.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-card.mjs +70 -0
- package/fesm2022/frame-kit-ui-ng-ui-card.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs +113 -0
- package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs +1288 -0
- package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs +456 -0
- package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs +398 -0
- package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs +398 -0
- package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs +125 -0
- package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs +113 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs +111 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs +103 -0
- package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs +135 -0
- package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-loader.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-loader.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs +79 -0
- package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs +40 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs +110 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs +91 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs +86 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs +443 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-note.mjs +56 -0
- package/fesm2022/frame-kit-ui-ng-ui-note.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs +105 -0
- package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs +110 -0
- package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs +129 -0
- package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs +42 -0
- package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs +894 -0
- package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-toast.mjs +179 -0
- package/fesm2022/frame-kit-ui-ng-ui-toast.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs +143 -0
- package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs +191 -0
- package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng.mjs +58 -0
- package/fesm2022/frame-kit-ui-ng.mjs.map +1 -0
- package/layouts/app-shell/README.md +357 -0
- package/layouts/content-split/README.md +180 -0
- package/package.json +253 -0
- package/services/overlay-orchestrator/README.md +184 -0
- package/services/spotlight/README.md +61 -0
- package/services/toast/README.md +118 -0
- package/types/frame-kit-ui-ng-core-headline.d.ts +38 -0
- package/types/frame-kit-ui-ng-core-icon.d.ts +74 -0
- package/types/frame-kit-ui-ng-core-image.d.ts +93 -0
- package/types/frame-kit-ui-ng-core-link.d.ts +251 -0
- package/types/frame-kit-ui-ng-core-separator.d.ts +28 -0
- package/types/frame-kit-ui-ng-core-text.d.ts +186 -0
- package/types/frame-kit-ui-ng-directives-infinite-scroll.d.ts +42 -0
- package/types/frame-kit-ui-ng-directives-spotlight.d.ts +51 -0
- package/types/frame-kit-ui-ng-directives-tooltip.d.ts +70 -0
- package/types/frame-kit-ui-ng-docs-endpoint-link.d.ts +43 -0
- package/types/frame-kit-ui-ng-docs-method-badge.d.ts +30 -0
- package/types/frame-kit-ui-ng-forms.d.ts +1674 -0
- package/types/frame-kit-ui-ng-layouts-app-shell.d.ts +75 -0
- package/types/frame-kit-ui-ng-layouts-content-split.d.ts +43 -0
- package/types/frame-kit-ui-ng-services-overlay-orchestrator.d.ts +96 -0
- package/types/frame-kit-ui-ng-services-spotlight.d.ts +32 -0
- package/types/frame-kit-ui-ng-services-toast.d.ts +100 -0
- package/types/frame-kit-ui-ng-ui-accordion.d.ts +86 -0
- package/types/frame-kit-ui-ng-ui-alert.d.ts +34 -0
- package/types/frame-kit-ui-ng-ui-avatar-stack.d.ts +38 -0
- package/types/frame-kit-ui-ng-ui-avatar.d.ts +36 -0
- package/types/frame-kit-ui-ng-ui-badge.d.ts +33 -0
- package/types/frame-kit-ui-ng-ui-breadcrumb.d.ts +45 -0
- package/types/frame-kit-ui-ng-ui-button.d.ts +48 -0
- package/types/frame-kit-ui-ng-ui-callout.d.ts +26 -0
- package/types/frame-kit-ui-ng-ui-card.d.ts +30 -0
- package/types/frame-kit-ui-ng-ui-copyable-field.d.ts +62 -0
- package/types/frame-kit-ui-ng-ui-data-table.d.ts +482 -0
- package/types/frame-kit-ui-ng-ui-dialog.d.ts +166 -0
- package/types/frame-kit-ui-ng-ui-drawer.d.ts +130 -0
- package/types/frame-kit-ui-ng-ui-dropdown-menu.d.ts +77 -0
- package/types/frame-kit-ui-ng-ui-editable-field.d.ts +65 -0
- package/types/frame-kit-ui-ng-ui-icon-badge.d.ts +45 -0
- package/types/frame-kit-ui-ng-ui-icon-list.d.ts +67 -0
- package/types/frame-kit-ui-ng-ui-inline-edit.d.ts +44 -0
- package/types/frame-kit-ui-ng-ui-list-editor.d.ts +56 -0
- package/types/frame-kit-ui-ng-ui-loader.d.ts +32 -0
- package/types/frame-kit-ui-ng-ui-menu-item.d.ts +27 -0
- package/types/frame-kit-ui-ng-ui-nav-brand.d.ts +25 -0
- package/types/frame-kit-ui-ng-ui-nav-group.d.ts +60 -0
- package/types/frame-kit-ui-ng-ui-nav-separator.d.ts +33 -0
- package/types/frame-kit-ui-ng-ui-node-tree-breadcrumb.d.ts +35 -0
- package/types/frame-kit-ui-ng-ui-node-tree.d.ts +135 -0
- package/types/frame-kit-ui-ng-ui-note.d.ts +22 -0
- package/types/frame-kit-ui-ng-ui-numbered-list.d.ts +52 -0
- package/types/frame-kit-ui-ng-ui-pagination.d.ts +49 -0
- package/types/frame-kit-ui-ng-ui-progress-bar.d.ts +50 -0
- package/types/frame-kit-ui-ng-ui-sidenav-link.d.ts +24 -0
- package/types/frame-kit-ui-ng-ui-tabs.d.ts +266 -0
- package/types/frame-kit-ui-ng-ui-timeline.d.ts +42 -0
- package/types/frame-kit-ui-ng-ui-toast.d.ts +56 -0
- package/types/frame-kit-ui-ng-ui-user-menu.d.ts +87 -0
- package/types/frame-kit-ui-ng-ui-wizard-dialog.d.ts +116 -0
- package/types/frame-kit-ui-ng.d.ts +53 -0
- package/ui/accordion/README.md +261 -0
- package/ui/alert/README.md +211 -0
- package/ui/avatar/README.md +167 -0
- package/ui/avatar-stack/README.md +164 -0
- package/ui/badge/README.md +162 -0
- package/ui/breadcrumb/README.md +240 -0
- package/ui/button/README.md +184 -0
- package/ui/callout/README.md +159 -0
- package/ui/card/README.md +174 -0
- package/ui/copyable-field/README.md +235 -0
- package/ui/data-table/README.md +408 -0
- package/ui/dialog/README.md +222 -0
- package/ui/drawer/README.md +274 -0
- package/ui/dropdown-menu/README.md +336 -0
- package/ui/editable-field/README.md +171 -0
- package/ui/icon-badge/README.md +131 -0
- package/ui/icon-list/README.md +205 -0
- package/ui/inline-edit/README.md +135 -0
- package/ui/list-editor/README.md +162 -0
- package/ui/loader/README.md +160 -0
- package/ui/menu-item/README.md +204 -0
- package/ui/nav-brand/README.md +111 -0
- package/ui/nav-group/README.md +145 -0
- package/ui/nav-separator/README.md +44 -0
- package/ui/node-tree/README.md +278 -0
- package/ui/node-tree-breadcrumb/README.md +164 -0
- package/ui/note/README.md +146 -0
- package/ui/numbered-list/README.md +187 -0
- package/ui/pagination/README.md +174 -0
- package/ui/progress-bar/README.md +223 -0
- package/ui/sidenav-link/README.md +214 -0
- package/ui/tabs/README.md +204 -0
- package/ui/timeline/README.md +285 -0
- package/ui/toast/README.md +243 -0
- package/ui/user-menu/README.md +260 -0
- package/ui/wizard-dialog/README.md +283 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-tabs.mjs","sources":["../../../../packages/ui-ng/ui/tabs/tab-icon.directive.ts","../../../../packages/ui-ng/ui/tabs/tabs.service.ts","../../../../packages/ui-ng/ui/tabs/tab.component.ts","../../../../packages/ui-ng/ui/tabs/tab.component.html","../../../../packages/ui-ng/ui/tabs/tab-list.component.ts","../../../../packages/ui-ng/ui/tabs/tab-list.component.html","../../../../packages/ui-ng/ui/tabs/tab-panel.component.ts","../../../../packages/ui-ng/ui/tabs/tabs.component.ts","../../../../packages/ui-ng/ui/tabs/frame-kit-ui-ng-ui-tabs.ts"],"sourcesContent":["import { Directive, InjectionToken } from '@angular/core';\n\nexport const FK_TAB_CLOSE_ICON = new InjectionToken<FkTabCloseIconDirective>(\n 'FK_TAB_CLOSE_ICON',\n);\n\nexport const FK_TAB_SCROLL_START_ICON =\n new InjectionToken<FkTabScrollStartIconDirective>('FK_TAB_SCROLL_START_ICON');\n\nexport const FK_TAB_SCROLL_END_ICON =\n new InjectionToken<FkTabScrollEndIconDirective>('FK_TAB_SCROLL_END_ICON');\n\n@Directive({\n selector: '[fkTabCloseIcon]',\n standalone: true,\n providers: [\n { provide: FK_TAB_CLOSE_ICON, useExisting: FkTabCloseIconDirective },\n ],\n host: {\n 'aria-hidden': 'true',\n },\n})\nexport class FkTabCloseIconDirective {}\n\n@Directive({\n selector: '[fkTabScrollStartIcon]',\n standalone: true,\n providers: [\n {\n provide: FK_TAB_SCROLL_START_ICON,\n useExisting: FkTabScrollStartIconDirective,\n },\n ],\n host: {\n 'aria-hidden': 'true',\n },\n})\nexport class FkTabScrollStartIconDirective {}\n\n@Directive({\n selector: '[fkTabScrollEndIcon]',\n standalone: true,\n providers: [\n {\n provide: FK_TAB_SCROLL_END_ICON,\n useExisting: FkTabScrollEndIconDirective,\n },\n ],\n host: {\n 'aria-hidden': 'true',\n },\n})\nexport class FkTabScrollEndIconDirective {}\n","import { computed, Injectable, signal } from '@angular/core';\n\nimport type {\n FkPanelRegistration,\n FkTabChangeEvent,\n FkTabRegistration,\n FkTabsActivationMode,\n FkTabsOrientation,\n FkTabsVariant,\n} from './tabs.types';\n\n@Injectable()\nexport class TabsService {\n // ===== ID GENERATION =====\n private tabIdCounter = 0;\n\n createTabIds(value: string): { tabId: string; panelId: string } {\n const key = value || String(this.tabIdCounter++);\n\n return {\n tabId: `fk-tab-${key}`,\n panelId: `fk-tabpanel-${key}`,\n };\n }\n\n // ===== CONFIGURATION (linked to parent component's input signals) =====\n // These are callbacks to the parent component's input signals,\n // set during the parent component's constructor.\n // This avoids effects and eliminates ExpressionChangedAfterItHasBeenCheckedError.\n private _orientationFn: () => FkTabsOrientation = () => 'horizontal';\n private _activationModeFn: () => FkTabsActivationMode = () => 'automatic';\n private _variantFn: () => FkTabsVariant = () => 'underline';\n private _lazyFn: () => boolean = () => false;\n private _keepMountedFn: () => boolean = () => true;\n private _scrollableFn: () => boolean = () => false;\n private _showScrollButtonsFn: () => boolean = () => false;\n\n readonly orientation = computed(() => this._orientationFn());\n readonly activationMode = computed(() => this._activationModeFn());\n readonly variant = computed(() => this._variantFn());\n readonly lazy = computed(() => this._lazyFn());\n readonly keepMounted = computed(() => this._keepMountedFn());\n readonly scrollable = computed(() => this._scrollableFn());\n readonly showScrollButtons = computed(() => this._showScrollButtonsFn());\n\n setConfig(config: {\n orientation: () => FkTabsOrientation;\n activationMode: () => FkTabsActivationMode;\n variant: () => FkTabsVariant;\n lazy: () => boolean;\n keepMounted: () => boolean;\n scrollable: () => boolean;\n showScrollButtons: () => boolean;\n }): void {\n this._orientationFn = config.orientation;\n this._activationModeFn = config.activationMode;\n this._variantFn = config.variant;\n this._lazyFn = config.lazy;\n this._keepMountedFn = config.keepMounted;\n this._scrollableFn = config.scrollable;\n this._showScrollButtonsFn = config.showScrollButtons;\n }\n\n // ===== CONTROLLED VALUE (linked to parent's value input) =====\n private _controlledValueFn: (() => string | undefined) | null = null;\n\n setControlledValue(fn: () => string | undefined): void {\n this._controlledValueFn = fn;\n }\n\n // Active value resolves controlled value first, then internal state\n private readonly _internalActiveValue = signal<string | null>(null);\n readonly activeValue = computed(() => {\n const controlled = this._controlledValueFn?.();\n\n if (controlled !== undefined) {\n return controlled;\n }\n\n return this._internalActiveValue();\n });\n\n // Writable proxy for setting active value\n setActiveValue(value: string | null): void {\n this._internalActiveValue.set(value);\n }\n readonly focusedValue = signal<string | null>(null);\n readonly tabs = signal<FkTabRegistration[]>([]);\n readonly panels = signal<FkPanelRegistration[]>([]);\n readonly activatedPanels = signal<Set<string>>(new Set());\n\n // ===== COMPUTED =====\n readonly enabledTabs = computed(() => this.tabs().filter((t) => !t.disabled));\n\n readonly activeTab = computed(() =>\n this.tabs().find((t) => t.value === this.activeValue()),\n );\n\n // ===== CALLBACKS (set by fk-tabs root) =====\n onTabChange: ((event: FkTabChangeEvent) => void) | null = null;\n onValueChange: ((value: string) => void) | null = null;\n onTabClose: ((value: string) => void) | null = null;\n\n // ===== REGISTRATION =====\n\n registerTab(reg: FkTabRegistration): void {\n this.tabs.update((list) => {\n const existing = list.findIndex((t) => t.value === reg.value);\n\n if (existing >= 0) {\n const updated = [...list];\n\n updated[existing] = reg;\n\n return updated;\n }\n\n return [...list, reg];\n });\n }\n\n unregisterTab(value: string): void {\n const wasActive = this.activeValue() === value;\n\n this.tabs.update((list) => list.filter((t) => t.value !== value));\n\n if (wasActive) {\n this.fallbackSelect();\n }\n }\n\n registerPanel(reg: FkPanelRegistration): void {\n this.panels.update((list) => {\n const existing = list.findIndex((p) => p.value === reg.value);\n\n if (existing >= 0) {\n const updated = [...list];\n\n updated[existing] = reg;\n\n return updated;\n }\n\n return [...list, reg];\n });\n }\n\n unregisterPanel(value: string): void {\n this.panels.update((list) => list.filter((p) => p.value !== value));\n }\n\n // ===== SELECTION =====\n\n selectTab(value: string): void {\n const tab = this.tabs().find((t) => t.value === value);\n\n if (tab && tab.disabled) {\n return;\n }\n\n const previousValue = this.activeValue();\n\n if (previousValue === value) {\n return;\n }\n\n this._internalActiveValue.set(value);\n this.activatedPanels.update((set) => {\n const next = new Set(set);\n\n next.add(value);\n\n return next;\n });\n\n this.onValueChange?.(value);\n this.onTabChange?.({ previousValue, value });\n }\n\n // ===== FOCUS =====\n\n focusTab(value: string): void {\n this.focusedValue.set(value);\n\n const tab = this.tabs().find((t) => t.value === value);\n\n if (tab) {\n tab.element.focus();\n }\n\n if (this.activationMode() === 'automatic') {\n this.selectTab(value);\n }\n }\n\n // ===== KEYBOARD NAVIGATION =====\n\n handleKeydown(event: KeyboardEvent): void {\n const orientation = this.orientation();\n const enabled = this.enabledTabs();\n\n if (enabled.length === 0) {\n return;\n }\n\n const currentValue = this.focusedValue() ?? this.activeValue();\n const currentIndex = enabled.findIndex((t) => t.value === currentValue);\n\n let targetIndex: number | null = null;\n\n switch (event.key) {\n case 'ArrowRight':\n if (orientation === 'horizontal') {\n targetIndex = this.getNextIndex(currentIndex, 1, enabled.length);\n event.preventDefault();\n }\n\n break;\n\n case 'ArrowLeft':\n if (orientation === 'horizontal') {\n targetIndex = this.getNextIndex(currentIndex, -1, enabled.length);\n event.preventDefault();\n }\n\n break;\n\n case 'ArrowDown':\n if (orientation === 'vertical') {\n targetIndex = this.getNextIndex(currentIndex, 1, enabled.length);\n event.preventDefault();\n }\n\n break;\n\n case 'ArrowUp':\n if (orientation === 'vertical') {\n targetIndex = this.getNextIndex(currentIndex, -1, enabled.length);\n event.preventDefault();\n }\n\n break;\n\n case 'Home':\n targetIndex = 0;\n\n event.preventDefault();\n\n break;\n\n case 'End':\n targetIndex = enabled.length - 1;\n\n event.preventDefault();\n\n break;\n\n case 'Enter':\n case ' ':\n if (this.activationMode() === 'manual' && currentValue) {\n this.selectTab(currentValue);\n\n event.preventDefault();\n }\n\n break;\n }\n\n if (targetIndex !== null && enabled[targetIndex]) {\n this.focusTab(enabled[targetIndex].value);\n }\n }\n\n // ===== FALLBACK =====\n\n fallbackSelect(): void {\n const enabled = this.enabledTabs();\n\n if (enabled.length > 0) {\n this.selectTab(enabled[0].value);\n } else {\n this._internalActiveValue.set(null);\n }\n }\n\n // ===== HELPERS =====\n\n private getNextIndex(\n current: number,\n direction: number,\n length: number,\n ): number {\n if (current < 0) {\n return 0;\n }\n\n return (current + direction + length) % length;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n input,\n OnChanges,\n OnInit,\n signal,\n SimpleChanges,\n TemplateRef,\n} from '@angular/core';\n\nimport { FK_TAB_CLOSE_ICON } from './tab-icon.directive';\nimport { TabsService } from './tabs.service';\n\n@Component({\n selector: 'fk-tab',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './tab.component.html',\n styleUrl: './tab.component.scss',\n})\nexport class FkTabComponent implements OnInit, OnChanges {\n private readonly service = inject(TabsService);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== INPUTS =====\n /** Unique value that identifies this tab and links it to its `fk-tab-panel`. */\n readonly value = input.required<string>();\n /** When true, the tab is non-interactive and cannot be selected. */\n readonly disabled = input(false);\n /** When true, renders a close button on the tab trigger. */\n readonly closable = input(false);\n /** Optional badge content (string or number) rendered in the top-right corner of the trigger. */\n readonly badge = input<string | number | undefined>(undefined);\n /** Optional icon — either an icon name string or a `TemplateRef` — shown before the label. */\n readonly icon = input<TemplateRef<unknown> | string | undefined>(undefined);\n\n // ===== CONTENT CHILDREN =====\n readonly closeIconRef = contentChild(FK_TAB_CLOSE_ICON);\n\n // ===== GENERATED IDS =====\n readonly tabId = signal('');\n readonly panelId = signal('');\n\n // ===== COMPUTED =====\n readonly isActive = computed(\n () => this.service.activeValue() === this.value(),\n );\n\n readonly classes = computed(() => {\n return [\n 'fk-tab',\n this.isActive() ? 'fk-tab--active' : '',\n this.disabled() ? 'fk-tab--disabled' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n // ===== HOST BINDINGS =====\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n readonly role = 'tab';\n\n @HostBinding('id')\n get hostId() {\n return this.tabId();\n }\n\n @HostBinding('attr.aria-selected')\n get ariaSelected() {\n return this.isActive();\n }\n\n @HostBinding('attr.aria-controls')\n get ariaControls() {\n return this.panelId();\n }\n\n @HostBinding('attr.tabindex')\n get tabIndex() {\n return this.isActive() ? 0 : -1;\n }\n\n @HostBinding('attr.aria-disabled')\n get ariaDisabled() {\n return this.disabled() || null;\n }\n\n // ===== HOST LISTENERS =====\n\n @HostListener('click')\n onClick(): void {\n if (!this.disabled()) {\n this.service.selectTab(this.value());\n }\n }\n\n @HostListener('focus')\n onFocus(): void {\n this.service.focusedValue.set(this.value());\n }\n\n private initialized = false;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.service.unregisterTab(this.value());\n });\n }\n\n ngOnInit(): void {\n const val = this.value();\n const dis = this.disabled();\n const ids = this.service.createTabIds(val);\n\n this.tabId.set(ids.tabId);\n this.panelId.set(ids.panelId);\n\n this.service.registerTab({\n value: val,\n disabled: dis,\n element: this.elementRef.nativeElement,\n tabId: ids.tabId,\n panelId: ids.panelId,\n });\n\n // Auto-select first non-disabled tab\n if (this.service.activeValue() === null && !dis) {\n this.service.setActiveValue(val);\n this.service.activatedPanels.update((set) => {\n const next = new Set(set);\n\n next.add(val);\n\n return next;\n });\n }\n\n this.initialized = true;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.initialized) {\n return;\n }\n\n // Re-register when disabled state changes\n if ('disabled' in changes) {\n const val = this.value();\n const ids = this.service.createTabIds(val);\n\n this.service.registerTab({\n value: val,\n disabled: this.disabled(),\n element: this.elementRef.nativeElement,\n tabId: ids.tabId,\n panelId: ids.panelId,\n });\n }\n }\n\n // ===== TEMPLATE HELPERS =====\n\n isTemplateRef(val: unknown): val is TemplateRef<unknown> {\n return val instanceof TemplateRef;\n }\n\n onClose(event: MouseEvent): void {\n event.stopPropagation();\n\n this.service.onTabClose?.(this.value());\n }\n}\n","@if (icon(); as iconValue) {\n <span class=\"fk-tab__icon\">\n @if (isTemplateRef(iconValue)) {\n <ng-container *ngTemplateOutlet=\"iconValue\" />\n } @else {\n {{ iconValue }}\n }\n </span>\n}\n\n<span class=\"fk-tab__label\">\n <ng-content />\n</span>\n\n@if (badge() !== undefined) {\n <span class=\"fk-tab__badge\">{{ badge() }}</span>\n}\n\n@if (closable()) {\n <button\n class=\"fk-tab__close\"\n type=\"button\"\n (click)=\"onClose($event)\"\n [attr.aria-label]=\"'Close ' + value()\"\n tabindex=\"-1\"\n >\n <ng-content select=\"[fkTabCloseIcon]\" />\n @if (!closeIconRef()) {\n <svg\n class=\"fk-tab__close-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4.5 4.5l7 7m0-7l-7 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n }\n </button>\n}\n","import { isPlatformBrowser, NgStyle } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n input,\n NgZone,\n PLATFORM_ID,\n signal,\n viewChild,\n} from '@angular/core';\n\nimport {\n FK_TAB_SCROLL_END_ICON,\n FK_TAB_SCROLL_START_ICON,\n} from './tab-icon.directive';\nimport { TabsService } from './tabs.service';\nimport type { FkTabIndicatorState } from './tabs.types';\n\n@Component({\n selector: 'fk-tab-list',\n standalone: true,\n imports: [NgStyle],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './tab-list.component.html',\n styleUrl: './tab-list.component.scss',\n})\nexport class FkTabListComponent implements AfterViewInit {\n readonly service = inject(TabsService);\n private readonly ngZone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n /** Accessible label for the `tablist` role element. */\n readonly ariaLabel = input<string | null>(null);\n\n // ===== CONTENT CHILDREN =====\n readonly scrollStartIconRef = contentChild(FK_TAB_SCROLL_START_ICON);\n readonly scrollEndIconRef = contentChild(FK_TAB_SCROLL_END_ICON);\n\n // ===== VIEW CHILDREN =====\n readonly scrollContainer =\n viewChild<ElementRef<HTMLElement>>('scrollContainer');\n\n // ===== INDICATOR STATE =====\n readonly indicatorState = signal<FkTabIndicatorState>(\n {\n visible: false,\n offset: 0,\n size: 0,\n },\n {\n equal: (a, b) =>\n a.visible === b.visible && a.offset === b.offset && a.size === b.size,\n },\n );\n\n // ===== SCROLL STATE =====\n readonly canScrollStart = signal(false);\n readonly canScrollEnd = signal(false);\n\n // ===== HOST CLASS =====\n readonly classes = computed(() => {\n return ['fk-tab-list', this.className()].filter(Boolean).join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n readonly role = 'tablist';\n\n @HostBinding('attr.aria-orientation')\n get ariaOrientation() {\n return this.service.orientation();\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel() {\n return this.ariaLabel();\n }\n\n // ===== INDICATOR STYLES =====\n readonly indicatorStyles = computed(() => {\n const state = this.indicatorState();\n const orientation = this.service.orientation();\n\n if (!state.visible) {\n return { opacity: '0' };\n }\n\n if (orientation === 'vertical') {\n return {\n opacity: '1',\n height: `${state.size}px`,\n transform: `translateY(${state.offset}px)`,\n };\n }\n\n return {\n opacity: '1',\n width: `${state.size}px`,\n transform: `translateX(${state.offset}px)`,\n };\n });\n\n readonly showIndicator = computed(() => {\n return this.service.variant() === 'underline';\n });\n\n // ===== RESIZE OBSERVER =====\n private resizeObserver: ResizeObserver | null = null;\n private activeTabResizeObserver: ResizeObserver | null = null;\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n this.service.handleKeydown(event);\n }\n\n constructor() {\n // Recalculate indicator whenever active tab or tabs list changes.\n // Indicator measurement relies on getBoundingClientRect and\n // ResizeObserver — both browser-only — so the effect no-ops\n // during SSR. The browser pass re-runs it after hydration.\n effect(() => {\n this.service.activeValue();\n this.service.tabs();\n this.service.orientation();\n this.service.variant();\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.updateIndicator();\n this.observeActiveTab();\n });\n }\n\n ngAfterViewInit(): void {\n // ResizeObserver + requestAnimationFrame are browser-only — the SSR\n // pass skips indicator measurement entirely and lets the browser\n // pass take over once the view re-runs on the client.\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.setupResizeObservers();\n\n requestAnimationFrame(() => {\n this.updateIndicator();\n this.updateScrollState();\n });\n }\n\n // ===== SCROLL =====\n\n /** Scrolls the active tab into view inside the scroll container. */\n scrollToActiveTab(): void {\n const activeTab = this.service.activeTab();\n\n if (activeTab) {\n activeTab.element.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n\n /** Scrolls the tab list by 80% of its visible width in the given direction (+1 or −1). */\n scrollBy(direction: number): void {\n const container = this.scrollContainer()?.nativeElement;\n\n if (!container) {\n return;\n }\n\n const amount = container.clientWidth * 0.8;\n const orientation = this.service.orientation();\n\n if (orientation === 'vertical') {\n container.scrollBy({ top: amount * direction, behavior: 'smooth' });\n } else {\n container.scrollBy({ left: amount * direction, behavior: 'smooth' });\n }\n }\n\n onScroll(): void {\n this.updateScrollState();\n this.updateIndicator();\n }\n\n // ===== INDICATOR =====\n\n /** Recalculates the sliding indicator position and size based on the active tab element. */\n updateIndicator(): void {\n if (!this.showIndicator()) {\n this.indicatorState.set({ visible: false, offset: 0, size: 0 });\n\n return;\n }\n\n const activeTab = this.service.activeTab();\n const container = this.scrollContainer()?.nativeElement;\n\n if (!activeTab || !container) {\n this.indicatorState.set({ visible: false, offset: 0, size: 0 });\n\n return;\n }\n\n const tabRect = activeTab.element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.width === 0 && tabRect.height === 0) {\n this.indicatorState.set({ visible: false, offset: 0, size: 0 });\n\n return;\n }\n\n const orientation = this.service.orientation();\n\n if (orientation === 'vertical') {\n this.indicatorState.set({\n visible: true,\n offset: tabRect.top - containerRect.top + container.scrollTop,\n size: tabRect.height,\n });\n } else {\n this.indicatorState.set({\n visible: true,\n offset: tabRect.left - containerRect.left + container.scrollLeft,\n size: tabRect.width,\n });\n }\n }\n\n // ===== SCROLL STATE =====\n\n private updateScrollState(): void {\n const container = this.scrollContainer()?.nativeElement;\n\n if (!container) {\n return;\n }\n\n const orientation = this.service.orientation();\n\n if (orientation === 'vertical') {\n this.canScrollStart.set(container.scrollTop > 0);\n this.canScrollEnd.set(\n container.scrollTop + container.clientHeight <\n container.scrollHeight - 1,\n );\n } else {\n this.canScrollStart.set(container.scrollLeft > 0);\n this.canScrollEnd.set(\n container.scrollLeft + container.clientWidth <\n container.scrollWidth - 1,\n );\n }\n }\n\n // ===== RESIZE OBSERVERS =====\n\n private setupResizeObservers(): void {\n const container = this.scrollContainer()?.nativeElement;\n\n if (!container || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver(() => {\n this.ngZone.run(() => {\n this.updateIndicator();\n this.updateScrollState();\n });\n });\n\n this.resizeObserver.observe(container);\n });\n\n this.destroyRef.onDestroy(() => {\n this.resizeObserver?.disconnect();\n this.activeTabResizeObserver?.disconnect();\n });\n }\n\n private observeActiveTab(): void {\n const activeTab = this.service.activeTab();\n\n if (this.activeTabResizeObserver) {\n this.activeTabResizeObserver.disconnect();\n }\n\n if (!activeTab || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n this.activeTabResizeObserver = new ResizeObserver(() => {\n this.ngZone.run(() => {\n this.updateIndicator();\n });\n });\n\n this.activeTabResizeObserver.observe(activeTab.element);\n });\n\n this.scrollToActiveTab();\n }\n}\n","@if (service.scrollable() && service.showScrollButtons()) {\n <button\n class=\"fk-tab-list__scroll-btn\"\n [class.fk-tab-list__scroll-btn--hidden]=\"!canScrollStart()\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n (click)=\"scrollBy(-1)\"\n >\n <ng-content select=\"[fkTabScrollStartIcon]\" />\n @if (!scrollStartIconRef()) {\n <svg\n class=\"fk-tab-list__scroll-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10 4L6 8l4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </button>\n}\n\n<div\n class=\"fk-tab-list__scroll-container\"\n #scrollContainer\n (scroll)=\"onScroll()\"\n>\n <ng-content />\n\n @if (showIndicator()) {\n <div\n class=\"fk-tab-list__indicator\"\n [class.fk-tab-list__indicator--hidden]=\"!indicatorState().visible\"\n [ngStyle]=\"indicatorStyles()\"\n ></div>\n }\n</div>\n\n@if (service.scrollable() && service.showScrollButtons()) {\n <button\n class=\"fk-tab-list__scroll-btn\"\n [class.fk-tab-list__scroll-btn--hidden]=\"!canScrollEnd()\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n (click)=\"scrollBy(1)\"\n >\n <ng-content select=\"[fkTabScrollEndIcon]\" />\n @if (!scrollEndIconRef()) {\n <svg\n class=\"fk-tab-list__scroll-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n HostBinding,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\n\nimport { TabsService } from './tabs.service';\n\n@Component({\n selector: 'fk-tab-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `@if (shouldRender()) {\n <ng-content />\n }`,\n styleUrl: './tab-panel.component.scss',\n})\nexport class FkTabPanelComponent implements OnInit {\n private readonly service = inject(TabsService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== INPUTS =====\n /** Unique value matching the corresponding `fk-tab`'s value; determines which panel to show. */\n readonly value = input.required<string>();\n\n // ===== GENERATED IDS =====\n readonly panelId = signal('');\n readonly tabId = signal('');\n\n // ===== COMPUTED =====\n readonly isActive = computed(\n () => this.service.activeValue() === this.value(),\n );\n\n readonly shouldRender = computed(() => {\n const lazy = this.service.lazy();\n const keepMounted = this.service.keepMounted();\n const isActive = this.isActive();\n const wasActivated = this.service.activatedPanels().has(this.value());\n\n if (!lazy) {\n return true;\n }\n\n if (keepMounted) {\n return isActive || wasActivated;\n }\n\n return isActive;\n });\n\n readonly classes = computed(() => {\n return ['fk-tab-panel', this.className()].filter(Boolean).join(' ');\n });\n\n // ===== HOST BINDINGS =====\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n readonly role = 'tabpanel';\n\n @HostBinding('id')\n get hostId() {\n return this.panelId();\n }\n\n @HostBinding('attr.aria-labelledby')\n get ariaLabelledby() {\n return this.tabId();\n }\n\n @HostBinding('hidden')\n get isHidden() {\n return !this.isActive() || null;\n }\n\n @HostBinding('attr.tabindex')\n readonly tabindex = 0;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.service.unregisterPanel(this.value());\n });\n }\n\n ngOnInit(): void {\n const val = this.value();\n const tabs = this.service.tabs();\n const matchingTab = tabs.find((t) => t.value === val);\n\n if (matchingTab) {\n this.panelId.set(matchingTab.panelId);\n this.tabId.set(matchingTab.tabId);\n } else {\n const ids = this.service.createTabIds(val);\n\n this.panelId.set(ids.panelId);\n this.tabId.set(ids.tabId);\n }\n\n this.service.registerPanel({\n value: val,\n panelId: this.panelId(),\n tabId: this.tabId(),\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n HostBinding,\n inject,\n input,\n OnInit,\n output,\n} from '@angular/core';\n\nimport { TabsService } from './tabs.service';\nimport type {\n FkTabChangeEvent,\n FkTabCloseEvent,\n FkTabsActivationMode,\n FkTabsOrientation,\n FkTabsSize,\n FkTabsVariant,\n} from './tabs.types';\n\n@Component({\n selector: 'fk-tabs',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [TabsService],\n template: `<ng-content />`,\n styleUrl: './tabs.component.scss',\n})\nexport class FkTabsComponent implements OnInit {\n private readonly service = inject(TabsService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== INPUTS =====\n /** Controlled active tab value; when set, the parent owns the active state. */\n readonly value = input<string | undefined>(undefined);\n /** Initial active tab value used in uncontrolled mode. */\n readonly defaultValue = input<string | undefined>(undefined);\n /** Layout direction of the tab list. */\n readonly orientation = input<FkTabsOrientation>('horizontal');\n /** Whether tabs activate on focus (automatic) or only on click/Enter (manual). */\n readonly activationMode = input<FkTabsActivationMode>('automatic');\n /** Visual style of the tab strip. */\n readonly variant = input<FkTabsVariant>('underline');\n /** Size of the tab triggers. */\n readonly size = input<FkTabsSize>('md');\n /** When true, tab panels are not rendered until first activated. */\n readonly lazy = input(false);\n /** When true (and `lazy` is true), panels remain mounted in the DOM after their first activation. */\n readonly keepMounted = input(true);\n /** When true, each tab trigger stretches to fill an equal share of the tab list. */\n readonly stretch = input(false);\n /** When true, the tab list spans the full width of its container. */\n readonly fullWidth = input(false);\n /** When true, the tab list scrolls horizontally/vertically when tabs overflow. */\n readonly scrollable = input(false);\n /** When true (and `scrollable` is true), arrow buttons appear at the edges of the tab list. */\n readonly showScrollButtons = input(false);\n\n // ===== OUTPUTS =====\n /** Fires when the active tab changes, emitting the new tab value. */\n readonly valueChange = output<string>();\n /** Fires when the active tab changes, emitting the full change event including previous and next values. */\n readonly tabChange = output<FkTabChangeEvent>();\n /** Fires when a closable tab's close button is clicked, emitting the tab value. */\n readonly tabClose = output<FkTabCloseEvent>();\n\n // ===== HOST CLASS =====\n readonly classes = computed(() => {\n return [\n 'fk-tabs',\n `fk-tabs--${this.orientation()}`,\n `fk-tabs--${this.variant()}`,\n `fk-tabs--${this.size()}`,\n this.stretch() ? 'fk-tabs--stretch' : '',\n this.fullWidth() ? 'fk-tabs--full-width' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n constructor() {\n // Link config inputs directly to service via callbacks.\n // This avoids effects entirely — the service reads input signals\n // directly through the signal graph, eliminating CD timing issues.\n this.service.setConfig({\n orientation: () => this.orientation(),\n activationMode: () => this.activationMode(),\n variant: () => this.variant(),\n lazy: () => this.lazy(),\n keepMounted: () => this.keepMounted(),\n scrollable: () => this.scrollable(),\n showScrollButtons: () => this.showScrollButtons(),\n });\n\n // Link controlled value input to service\n this.service.setControlledValue(() => this.value());\n\n // Wire service callbacks to outputs\n this.service.onValueChange = (v) => this.valueChange.emit(v);\n this.service.onTabChange = (e) => this.tabChange.emit(e);\n this.service.onTabClose = (v) => this.tabClose.emit({ value: v });\n\n this.destroyRef.onDestroy(() => {\n this.service.onValueChange = null;\n this.service.onTabChange = null;\n this.service.onTabClose = null;\n });\n }\n\n ngOnInit(): void {\n // Set initial value synchronously before child views are checked\n const v = this.value();\n const dv = this.defaultValue();\n\n if (v !== undefined) {\n this.service.setActiveValue(v);\n this.service.activatedPanels.update((set) => {\n const next = new Set(set);\n\n next.add(v);\n\n return next;\n });\n } else if (dv !== undefined) {\n this.service.setActiveValue(dv);\n this.service.activatedPanels.update((set) => {\n const next = new Set(set);\n\n next.add(dv);\n\n return next;\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { IconComponent } from '@frame-kit/ui-ng/core/icon';
|
|
4
|
+
|
|
5
|
+
class TimelineComponent {
|
|
6
|
+
// ===== INPUTS =====
|
|
7
|
+
/** Array of timeline item data objects rendered in order. */
|
|
8
|
+
items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
9
|
+
/** Direction the timeline runs — vertical stacks items top-to-bottom, horizontal left-to-right. */
|
|
10
|
+
orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
11
|
+
/** Alignment of the item content relative to the connector line. */
|
|
12
|
+
align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
|
|
13
|
+
/** Size variant controlling the dot and spacing of each item. */
|
|
14
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
15
|
+
/** When true, the items array is rendered in reverse order. */
|
|
16
|
+
reverse = input(false, ...(ngDevMode ? [{ debugName: "reverse" }] : /* istanbul ignore next */ []));
|
|
17
|
+
// ===== BASE PROPS =====
|
|
18
|
+
ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
19
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
20
|
+
id = input(null, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
21
|
+
// ===== COMPUTED =====
|
|
22
|
+
orderedItems = computed(() => {
|
|
23
|
+
const list = this.items();
|
|
24
|
+
return this.reverse() ? [...list].reverse() : list;
|
|
25
|
+
}, ...(ngDevMode ? [{ debugName: "orderedItems" }] : /* istanbul ignore next */ []));
|
|
26
|
+
classes = computed(() => {
|
|
27
|
+
return [
|
|
28
|
+
'fk-timeline',
|
|
29
|
+
`fk-timeline--${this.orientation()}`,
|
|
30
|
+
`fk-timeline--${this.align()}`,
|
|
31
|
+
`fk-timeline--${this.size()}`,
|
|
32
|
+
this.className(),
|
|
33
|
+
]
|
|
34
|
+
.filter(Boolean)
|
|
35
|
+
.join(' ');
|
|
36
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
37
|
+
// ===== HOST BINDINGS =====
|
|
38
|
+
get hostClass() {
|
|
39
|
+
return this.classes();
|
|
40
|
+
}
|
|
41
|
+
get hostRole() {
|
|
42
|
+
return 'list';
|
|
43
|
+
}
|
|
44
|
+
get hostAriaLabel() {
|
|
45
|
+
return this.ariaLabel();
|
|
46
|
+
}
|
|
47
|
+
get hostAriaOrientation() {
|
|
48
|
+
return this.orientation();
|
|
49
|
+
}
|
|
50
|
+
get hostId() {
|
|
51
|
+
return this.id();
|
|
52
|
+
}
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TimelineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
54
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: TimelineComponent, isStandalone: true, selector: "fk-timeline", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "attr.role": "this.hostRole", "attr.aria-label": "this.hostAriaLabel", "attr.aria-orientation": "this.hostAriaOrientation", "attr.id": "this.hostId" } }, ngImport: i0, template: "@for (item of orderedItems(); track item.id ?? $index; let last = $last) {\n <div\n class=\"fk-timeline__item\"\n [class.fk-timeline__item--active]=\"item.status === 'active'\"\n [class.fk-timeline__item--completed]=\"item.status === 'completed'\"\n [class.fk-timeline__item--error]=\"item.status === 'error'\"\n [class.fk-timeline__item--warning]=\"item.status === 'warning'\"\n role=\"listitem\"\n >\n <div class=\"fk-timeline__separator\">\n <div class=\"fk-timeline__marker\">\n @if (item.icon) {\n <fk-icon [name]=\"item.icon\" size=\"xs\" />\n }\n </div>\n\n @if (!last) {\n <div class=\"fk-timeline__connector\"></div>\n }\n </div>\n\n <div class=\"fk-timeline__content\">\n @if (item.title) {\n <span class=\"fk-timeline__title\">{{ item.title }}</span>\n }\n\n @if (item.description) {\n <span class=\"fk-timeline__description\">{{ item.description }}</span>\n }\n\n @if (item.timestamp) {\n <span class=\"fk-timeline__timestamp\">{{ item.timestamp }}</span>\n }\n </div>\n </div>\n}\n\n<ng-content />\n", styles: [":host{display:flex;gap:var(--fk-timeline-gap, 0)}:host.fk-timeline--vertical{flex-direction:column}:host.fk-timeline--horizontal{flex-direction:row;overflow-x:auto}.fk-timeline__item{display:flex;position:relative}.fk-timeline__separator{display:flex;flex-shrink:0;align-items:flex-start}.fk-timeline__marker{display:flex;align-items:center;justify-content:center;flex-shrink:0;border-radius:50%;background:var(--fk-timeline-marker-bg, var(--fk-color-surface, #ffffff));border:var(--fk-timeline-marker-border-width, 2px) solid var(--fk-timeline-marker-border-color, var(--fk-color-border, #d9e2ee));color:var(--fk-timeline-marker-color, var(--fk-color-muted, #8a98a8));overflow:hidden;z-index:1}.fk-timeline__connector{background:var(--fk-timeline-connector-color, var(--fk-color-border, #d9e2ee));flex-shrink:0}.fk-timeline__content{display:flex;flex-direction:column;gap:var(--fk-timeline-content-gap, var(--fk-rhythm-1, .25rem));min-width:0}.fk-timeline__title{font-size:var(--fk-timeline-title-font-size, var(--fk-typography-body-font-size, .9375rem));font-weight:var(--fk-timeline-title-font-weight, var(--fk-font-weight-medium, 500));color:var(--fk-timeline-title-color, var(--fk-color-text, #1f2d3d))}.fk-timeline__description{font-size:var(--fk-timeline-description-font-size, var(--fk-typography-small-font-size, .8125rem));color:var(--fk-timeline-description-color, var(--fk-color-muted, #8a98a8))}.fk-timeline__timestamp{font-size:var(--fk-timeline-timestamp-font-size, var(--fk-typography-caption-font-size, .6875rem));color:var(--fk-timeline-timestamp-color, var(--fk-color-muted, #8a98a8))}.fk-timeline__item--active .fk-timeline__marker{background:var(--fk-timeline-marker-active, var(--fk-color-primary, #0a84ff));border-color:var(--fk-timeline-marker-active, var(--fk-color-primary, #0a84ff));color:var(--fk-color-surface, #ffffff)}.fk-timeline__item--completed .fk-timeline__marker{background:var(--fk-timeline-marker-completed, var(--fk-color-success, #10b981));border-color:var(--fk-timeline-marker-completed, var(--fk-color-success, #10b981));color:var(--fk-color-surface, #ffffff)}.fk-timeline__item--error .fk-timeline__marker{background:var(--fk-timeline-marker-error, var(--fk-color-danger, #e02424));border-color:var(--fk-timeline-marker-error, var(--fk-color-danger, #e02424));color:var(--fk-color-surface, #ffffff)}.fk-timeline__item--warning .fk-timeline__marker{background:var(--fk-timeline-marker-warning, var(--fk-color-warning, #f59e0b));border-color:var(--fk-timeline-marker-warning, var(--fk-color-warning, #f59e0b));color:var(--fk-color-surface, #ffffff)}:host.fk-timeline--vertical .fk-timeline__item{flex-direction:row;align-items:stretch}:host.fk-timeline--vertical .fk-timeline__separator{flex-direction:column;align-items:center;flex-shrink:0}:host.fk-timeline--vertical .fk-timeline__connector{width:var(--fk-timeline-connector-width, 2px);flex:1;min-height:var(--fk-rhythm-2, .5rem)}:host.fk-timeline--vertical .fk-timeline__content{padding-bottom:var(--fk-timeline-item-gap, var(--fk-rhythm-3, .75rem))}:host.fk-timeline--vertical.fk-timeline--sm .fk-timeline__marker{width:var(--fk-timeline-marker-size-sm, 1rem);height:var(--fk-timeline-marker-size-sm, 1rem)}:host.fk-timeline--vertical.fk-timeline--sm .fk-timeline__content{padding-left:var(--fk-rhythm-2, .5rem);padding-top:0}:host.fk-timeline--vertical.fk-timeline--md .fk-timeline__marker{width:var(--fk-timeline-marker-size-md, 1.5rem);height:var(--fk-timeline-marker-size-md, 1.5rem)}:host.fk-timeline--vertical.fk-timeline--md .fk-timeline__content{padding-left:var(--fk-rhythm-3, .75rem);padding-top:.125rem}:host.fk-timeline--vertical.fk-timeline--lg .fk-timeline__marker{width:var(--fk-timeline-marker-size-lg, 2rem);height:var(--fk-timeline-marker-size-lg, 2rem)}:host.fk-timeline--vertical.fk-timeline--lg .fk-timeline__content{padding-left:var(--fk-rhythm-3, .75rem);padding-top:.25rem}:host.fk-timeline--vertical.fk-timeline--end .fk-timeline__item{flex-direction:row-reverse}:host.fk-timeline--vertical.fk-timeline--end .fk-timeline__content{padding-left:0;padding-right:var(--fk-rhythm-3, .75rem);text-align:right}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item{display:grid;grid-template-columns:1fr auto 1fr}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__separator{grid-column:2}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item:nth-child(odd) .fk-timeline__content{grid-column:3;padding-left:var(--fk-rhythm-3, .75rem);padding-right:0;text-align:left}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item:nth-child(2n) .fk-timeline__content{grid-column:1;grid-row:1;padding-left:0;padding-right:var(--fk-rhythm-3, .75rem);text-align:right}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item:nth-child(2n) .fk-timeline__separator{grid-row:1}:host.fk-timeline--horizontal .fk-timeline__item{display:flex;flex-direction:column;align-items:center;flex:1 1 0;min-width:0}:host.fk-timeline--horizontal .fk-timeline__item:last-child{flex:0 0 auto}:host.fk-timeline--horizontal .fk-timeline__separator{flex-direction:row;align-items:center;width:100%}:host.fk-timeline--horizontal .fk-timeline__connector{height:var(--fk-timeline-connector-width, 2px);flex:1;min-width:var(--fk-rhythm-3, .75rem)}:host.fk-timeline--horizontal .fk-timeline__content{align-items:center;text-align:center;padding-top:var(--fk-rhythm-2, .5rem);max-width:8rem}:host.fk-timeline--horizontal.fk-timeline--sm .fk-timeline__marker{width:var(--fk-timeline-marker-size-sm, 1rem);height:var(--fk-timeline-marker-size-sm, 1rem)}:host.fk-timeline--horizontal.fk-timeline--md .fk-timeline__marker{width:var(--fk-timeline-marker-size-md, 1.5rem);height:var(--fk-timeline-marker-size-md, 1.5rem)}:host.fk-timeline--horizontal.fk-timeline--lg .fk-timeline__marker{width:var(--fk-timeline-marker-size-lg, 2rem);height:var(--fk-timeline-marker-size-lg, 2rem)}@media(prefers-reduced-motion:reduce){.fk-timeline__connector,.fk-timeline__marker{transition:none}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "fk-icon", inputs: ["name", "size", "color", "className", "id", "ariaLabel", "ariaHidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TimelineComponent, decorators: [{
|
|
57
|
+
type: Component,
|
|
58
|
+
args: [{ selector: 'fk-timeline', standalone: true, imports: [IconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (item of orderedItems(); track item.id ?? $index; let last = $last) {\n <div\n class=\"fk-timeline__item\"\n [class.fk-timeline__item--active]=\"item.status === 'active'\"\n [class.fk-timeline__item--completed]=\"item.status === 'completed'\"\n [class.fk-timeline__item--error]=\"item.status === 'error'\"\n [class.fk-timeline__item--warning]=\"item.status === 'warning'\"\n role=\"listitem\"\n >\n <div class=\"fk-timeline__separator\">\n <div class=\"fk-timeline__marker\">\n @if (item.icon) {\n <fk-icon [name]=\"item.icon\" size=\"xs\" />\n }\n </div>\n\n @if (!last) {\n <div class=\"fk-timeline__connector\"></div>\n }\n </div>\n\n <div class=\"fk-timeline__content\">\n @if (item.title) {\n <span class=\"fk-timeline__title\">{{ item.title }}</span>\n }\n\n @if (item.description) {\n <span class=\"fk-timeline__description\">{{ item.description }}</span>\n }\n\n @if (item.timestamp) {\n <span class=\"fk-timeline__timestamp\">{{ item.timestamp }}</span>\n }\n </div>\n </div>\n}\n\n<ng-content />\n", styles: [":host{display:flex;gap:var(--fk-timeline-gap, 0)}:host.fk-timeline--vertical{flex-direction:column}:host.fk-timeline--horizontal{flex-direction:row;overflow-x:auto}.fk-timeline__item{display:flex;position:relative}.fk-timeline__separator{display:flex;flex-shrink:0;align-items:flex-start}.fk-timeline__marker{display:flex;align-items:center;justify-content:center;flex-shrink:0;border-radius:50%;background:var(--fk-timeline-marker-bg, var(--fk-color-surface, #ffffff));border:var(--fk-timeline-marker-border-width, 2px) solid var(--fk-timeline-marker-border-color, var(--fk-color-border, #d9e2ee));color:var(--fk-timeline-marker-color, var(--fk-color-muted, #8a98a8));overflow:hidden;z-index:1}.fk-timeline__connector{background:var(--fk-timeline-connector-color, var(--fk-color-border, #d9e2ee));flex-shrink:0}.fk-timeline__content{display:flex;flex-direction:column;gap:var(--fk-timeline-content-gap, var(--fk-rhythm-1, .25rem));min-width:0}.fk-timeline__title{font-size:var(--fk-timeline-title-font-size, var(--fk-typography-body-font-size, .9375rem));font-weight:var(--fk-timeline-title-font-weight, var(--fk-font-weight-medium, 500));color:var(--fk-timeline-title-color, var(--fk-color-text, #1f2d3d))}.fk-timeline__description{font-size:var(--fk-timeline-description-font-size, var(--fk-typography-small-font-size, .8125rem));color:var(--fk-timeline-description-color, var(--fk-color-muted, #8a98a8))}.fk-timeline__timestamp{font-size:var(--fk-timeline-timestamp-font-size, var(--fk-typography-caption-font-size, .6875rem));color:var(--fk-timeline-timestamp-color, var(--fk-color-muted, #8a98a8))}.fk-timeline__item--active .fk-timeline__marker{background:var(--fk-timeline-marker-active, var(--fk-color-primary, #0a84ff));border-color:var(--fk-timeline-marker-active, var(--fk-color-primary, #0a84ff));color:var(--fk-color-surface, #ffffff)}.fk-timeline__item--completed .fk-timeline__marker{background:var(--fk-timeline-marker-completed, var(--fk-color-success, #10b981));border-color:var(--fk-timeline-marker-completed, var(--fk-color-success, #10b981));color:var(--fk-color-surface, #ffffff)}.fk-timeline__item--error .fk-timeline__marker{background:var(--fk-timeline-marker-error, var(--fk-color-danger, #e02424));border-color:var(--fk-timeline-marker-error, var(--fk-color-danger, #e02424));color:var(--fk-color-surface, #ffffff)}.fk-timeline__item--warning .fk-timeline__marker{background:var(--fk-timeline-marker-warning, var(--fk-color-warning, #f59e0b));border-color:var(--fk-timeline-marker-warning, var(--fk-color-warning, #f59e0b));color:var(--fk-color-surface, #ffffff)}:host.fk-timeline--vertical .fk-timeline__item{flex-direction:row;align-items:stretch}:host.fk-timeline--vertical .fk-timeline__separator{flex-direction:column;align-items:center;flex-shrink:0}:host.fk-timeline--vertical .fk-timeline__connector{width:var(--fk-timeline-connector-width, 2px);flex:1;min-height:var(--fk-rhythm-2, .5rem)}:host.fk-timeline--vertical .fk-timeline__content{padding-bottom:var(--fk-timeline-item-gap, var(--fk-rhythm-3, .75rem))}:host.fk-timeline--vertical.fk-timeline--sm .fk-timeline__marker{width:var(--fk-timeline-marker-size-sm, 1rem);height:var(--fk-timeline-marker-size-sm, 1rem)}:host.fk-timeline--vertical.fk-timeline--sm .fk-timeline__content{padding-left:var(--fk-rhythm-2, .5rem);padding-top:0}:host.fk-timeline--vertical.fk-timeline--md .fk-timeline__marker{width:var(--fk-timeline-marker-size-md, 1.5rem);height:var(--fk-timeline-marker-size-md, 1.5rem)}:host.fk-timeline--vertical.fk-timeline--md .fk-timeline__content{padding-left:var(--fk-rhythm-3, .75rem);padding-top:.125rem}:host.fk-timeline--vertical.fk-timeline--lg .fk-timeline__marker{width:var(--fk-timeline-marker-size-lg, 2rem);height:var(--fk-timeline-marker-size-lg, 2rem)}:host.fk-timeline--vertical.fk-timeline--lg .fk-timeline__content{padding-left:var(--fk-rhythm-3, .75rem);padding-top:.25rem}:host.fk-timeline--vertical.fk-timeline--end .fk-timeline__item{flex-direction:row-reverse}:host.fk-timeline--vertical.fk-timeline--end .fk-timeline__content{padding-left:0;padding-right:var(--fk-rhythm-3, .75rem);text-align:right}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item{display:grid;grid-template-columns:1fr auto 1fr}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__separator{grid-column:2}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item:nth-child(odd) .fk-timeline__content{grid-column:3;padding-left:var(--fk-rhythm-3, .75rem);padding-right:0;text-align:left}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item:nth-child(2n) .fk-timeline__content{grid-column:1;grid-row:1;padding-left:0;padding-right:var(--fk-rhythm-3, .75rem);text-align:right}:host.fk-timeline--vertical.fk-timeline--alternate .fk-timeline__item:nth-child(2n) .fk-timeline__separator{grid-row:1}:host.fk-timeline--horizontal .fk-timeline__item{display:flex;flex-direction:column;align-items:center;flex:1 1 0;min-width:0}:host.fk-timeline--horizontal .fk-timeline__item:last-child{flex:0 0 auto}:host.fk-timeline--horizontal .fk-timeline__separator{flex-direction:row;align-items:center;width:100%}:host.fk-timeline--horizontal .fk-timeline__connector{height:var(--fk-timeline-connector-width, 2px);flex:1;min-width:var(--fk-rhythm-3, .75rem)}:host.fk-timeline--horizontal .fk-timeline__content{align-items:center;text-align:center;padding-top:var(--fk-rhythm-2, .5rem);max-width:8rem}:host.fk-timeline--horizontal.fk-timeline--sm .fk-timeline__marker{width:var(--fk-timeline-marker-size-sm, 1rem);height:var(--fk-timeline-marker-size-sm, 1rem)}:host.fk-timeline--horizontal.fk-timeline--md .fk-timeline__marker{width:var(--fk-timeline-marker-size-md, 1.5rem);height:var(--fk-timeline-marker-size-md, 1.5rem)}:host.fk-timeline--horizontal.fk-timeline--lg .fk-timeline__marker{width:var(--fk-timeline-marker-size-lg, 2rem);height:var(--fk-timeline-marker-size-lg, 2rem)}@media(prefers-reduced-motion:reduce){.fk-timeline__connector,.fk-timeline__marker{transition:none}}\n"] }]
|
|
59
|
+
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], reverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverse", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], hostClass: [{
|
|
60
|
+
type: HostBinding,
|
|
61
|
+
args: ['class']
|
|
62
|
+
}], hostRole: [{
|
|
63
|
+
type: HostBinding,
|
|
64
|
+
args: ['attr.role']
|
|
65
|
+
}], hostAriaLabel: [{
|
|
66
|
+
type: HostBinding,
|
|
67
|
+
args: ['attr.aria-label']
|
|
68
|
+
}], hostAriaOrientation: [{
|
|
69
|
+
type: HostBinding,
|
|
70
|
+
args: ['attr.aria-orientation']
|
|
71
|
+
}], hostId: [{
|
|
72
|
+
type: HostBinding,
|
|
73
|
+
args: ['attr.id']
|
|
74
|
+
}] } });
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Generated bundle index. Do not edit.
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
export { TimelineComponent };
|
|
81
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-timeline.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-timeline.mjs","sources":["../../../../packages/ui-ng/ui/timeline/timeline.component.ts","../../../../packages/ui-ng/ui/timeline/timeline.component.html","../../../../packages/ui-ng/ui/timeline/frame-kit-ui-ng-ui-timeline.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport { IconComponent } from '@frame-kit/ui-ng/core/icon';\nimport type {\n TimelineAlign,\n TimelineItemData,\n TimelineOrientation,\n TimelineSize,\n} from './timeline.types';\n\n@Component({\n selector: 'fk-timeline',\n standalone: true,\n imports: [IconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './timeline.component.html',\n styleUrl: './timeline.component.scss',\n})\nexport class TimelineComponent {\n // ===== INPUTS =====\n /** Array of timeline item data objects rendered in order. */\n readonly items = input<TimelineItemData[]>([]);\n /** Direction the timeline runs — vertical stacks items top-to-bottom, horizontal left-to-right. */\n readonly orientation = input<TimelineOrientation>('vertical');\n /** Alignment of the item content relative to the connector line. */\n readonly align = input<TimelineAlign>('start');\n /** Size variant controlling the dot and spacing of each item. */\n readonly size = input<TimelineSize>('md');\n /** When true, the items array is rendered in reverse order. */\n readonly reverse = input<boolean>(false);\n\n // ===== BASE PROPS =====\n readonly ariaLabel = input<string | null>(null);\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly orderedItems = computed(() => {\n const list = this.items();\n\n return this.reverse() ? [...list].reverse() : list;\n });\n\n readonly classes = computed(() => {\n return [\n 'fk-timeline',\n `fk-timeline--${this.orientation()}`,\n `fk-timeline--${this.align()}`,\n `fk-timeline--${this.size()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n // ===== HOST BINDINGS =====\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n get hostRole() {\n return 'list';\n }\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel() {\n return this.ariaLabel();\n }\n\n @HostBinding('attr.aria-orientation')\n get hostAriaOrientation() {\n return this.orientation();\n }\n\n @HostBinding('attr.id')\n get hostId() {\n return this.id();\n }\n}\n","@for (item of orderedItems(); track item.id ?? $index; let last = $last) {\n <div\n class=\"fk-timeline__item\"\n [class.fk-timeline__item--active]=\"item.status === 'active'\"\n [class.fk-timeline__item--completed]=\"item.status === 'completed'\"\n [class.fk-timeline__item--error]=\"item.status === 'error'\"\n [class.fk-timeline__item--warning]=\"item.status === 'warning'\"\n role=\"listitem\"\n >\n <div class=\"fk-timeline__separator\">\n <div class=\"fk-timeline__marker\">\n @if (item.icon) {\n <fk-icon [name]=\"item.icon\" size=\"xs\" />\n }\n </div>\n\n @if (!last) {\n <div class=\"fk-timeline__connector\"></div>\n }\n </div>\n\n <div class=\"fk-timeline__content\">\n @if (item.title) {\n <span class=\"fk-timeline__title\">{{ item.title }}</span>\n }\n\n @if (item.description) {\n <span class=\"fk-timeline__description\">{{ item.description }}</span>\n }\n\n @if (item.timestamp) {\n <span class=\"fk-timeline__timestamp\">{{ item.timestamp }}</span>\n }\n </div>\n </div>\n}\n\n<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, output, computed, HostBinding, ChangeDetectionStrategy, Component, ApplicationRef, EnvironmentInjector, ElementRef, effect, Injector, createComponent } from '@angular/core';
|
|
3
|
+
import { IconRegistryService } from '@frame-kit/ui-ng/core/icon';
|
|
4
|
+
import { TOAST_CONFIG, ToastService, ToastRef, TOAST_DATA, TOAST_REF } from '@frame-kit/ui-ng/services/toast';
|
|
5
|
+
|
|
6
|
+
class ToastComponent {
|
|
7
|
+
registry = inject(IconRegistryService, { optional: true });
|
|
8
|
+
config = inject(TOAST_CONFIG, { optional: true });
|
|
9
|
+
// ===== INPUTS =====
|
|
10
|
+
/** Severity level that drives the toast icon and color. */
|
|
11
|
+
severity = input('info', ...(ngDevMode ? [{ debugName: "severity" }] : /* istanbul ignore next */ []));
|
|
12
|
+
/** Primary message text shown in the toast. */
|
|
13
|
+
summary = input('', ...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
|
|
14
|
+
/** Optional secondary detail text shown below the summary. */
|
|
15
|
+
detail = input(undefined, ...(ngDevMode ? [{ debugName: "detail" }] : /* istanbul ignore next */ []));
|
|
16
|
+
/** When true, renders the dismiss button so the user can close the toast. */
|
|
17
|
+
dismissible = input(true, ...(ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []));
|
|
18
|
+
// ===== BASE PROPS =====
|
|
19
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
20
|
+
id = input(null, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
21
|
+
// ===== OUTPUTS =====
|
|
22
|
+
/** Fires when the user clicks the dismiss button. */
|
|
23
|
+
dismiss = output();
|
|
24
|
+
// ===== COMPUTED =====
|
|
25
|
+
classes = computed(() => ['fk-toast', `fk-toast--${this.severity()}`, this.className()]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join(' '), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
28
|
+
iconSvg = computed(() => {
|
|
29
|
+
const configIcons = this.config?.icons;
|
|
30
|
+
const sev = this.severity();
|
|
31
|
+
const iconName = configIcons?.[sev];
|
|
32
|
+
if (iconName && this.registry) {
|
|
33
|
+
const content = this.registry.getIcon(iconName);
|
|
34
|
+
if (content) {
|
|
35
|
+
return content;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}, ...(ngDevMode ? [{ debugName: "iconSvg" }] : /* istanbul ignore next */ []));
|
|
40
|
+
role = computed(() => {
|
|
41
|
+
const sev = this.severity();
|
|
42
|
+
return sev === 'error' || sev === 'warning' ? 'alert' : 'status';
|
|
43
|
+
}, ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
|
|
44
|
+
get hostClass() {
|
|
45
|
+
return this.classes();
|
|
46
|
+
}
|
|
47
|
+
get hostId() {
|
|
48
|
+
return this.id();
|
|
49
|
+
}
|
|
50
|
+
get hostRole() {
|
|
51
|
+
return this.role();
|
|
52
|
+
}
|
|
53
|
+
onDismiss() {
|
|
54
|
+
this.dismiss.emit();
|
|
55
|
+
}
|
|
56
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
57
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToastComponent, isStandalone: true, selector: "fk-toast", inputs: { severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null }, summary: { classPropertyName: "summary", publicName: "summary", isSignal: true, isRequired: false, transformFunction: null }, detail: { classPropertyName: "detail", publicName: "detail", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismiss: "dismiss" }, host: { properties: { "class": "this.hostClass", "attr.id": "this.hostId", "attr.role": "this.hostRole" } }, ngImport: i0, template: "<div class=\"fk-toast__icon\">\n @if (iconSvg()) {\n <span class=\"fk-toast__icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n } @else {\n @switch (severity()) {\n @case ('success') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n }\n @case ('error') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M15 9l-6 6M9 9l6 6\" />\n </svg>\n }\n @case ('warning') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n }\n @case ('info') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n }\n }\n }\n</div>\n\n<div class=\"fk-toast__body\">\n <span class=\"fk-toast__summary\">{{ summary() }}</span>\n\n @if (detail()) {\n <span class=\"fk-toast__detail\">{{ detail() }}</span>\n }\n</div>\n\n@if (dismissible()) {\n <button\n class=\"fk-toast__dismiss\"\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"onDismiss()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n}\n", styles: [":host{display:flex;align-items:flex-start;gap:var(--fk-toast-gap, var(--fk-rhythm-3, .75rem));padding:var(--fk-toast-padding, var(--fk-rhythm-4, 1rem));border:1px solid var(--fk-toast-border-color, var(--fk-color-border, #d9e2ee));border-radius:var(--fk-toast-border-radius, var(--fk-radius-lg, .5rem));background:var(--fk-toast-bg, var(--fk-color-surface, #ffffff));box-shadow:var(--fk-toast-shadow, 0 4px 12px rgba(0, 0, 0, .1));width:100%;box-sizing:border-box}:host.fk-toast--success{border-left:3px solid var(--fk-toast-success-accent, var(--fk-color-success, #10b981))}:host.fk-toast--success .fk-toast__icon{color:var(--fk-toast-success-color, var(--fk-color-success, #10b981))}:host.fk-toast--error{border-left:3px solid var(--fk-toast-error-accent, var(--fk-color-danger, #e02424))}:host.fk-toast--error .fk-toast__icon{color:var(--fk-toast-error-color, var(--fk-color-danger, #e02424))}:host.fk-toast--warning{border-left:3px solid var(--fk-toast-warning-accent, var(--fk-color-warning, #f59e0b))}:host.fk-toast--warning .fk-toast__icon{color:var(--fk-toast-warning-color, var(--fk-color-warning, #f59e0b))}:host.fk-toast--info{border-left:3px solid var(--fk-toast-info-accent, var(--fk-color-primary, #0a84ff))}:host.fk-toast--info .fk-toast__icon{color:var(--fk-toast-info-color, var(--fk-color-primary, #0a84ff))}.fk-toast__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.fk-toast__icon svg{width:var(--fk-toast-icon-size, 1.25rem);height:var(--fk-toast-icon-size, 1.25rem);display:block}.fk-toast__icon-custom{display:inline-flex}.fk-toast__icon-custom svg{width:var(--fk-toast-icon-size, 1.25rem);height:var(--fk-toast-icon-size, 1.25rem);display:block}.fk-toast__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--fk-toast-body-gap, var(--fk-rhythm-1, .25rem))}.fk-toast__summary{font-size:var(--fk-toast-summary-font-size, var(--fk-typography-body-font-size, .875rem));font-weight:var(--fk-toast-summary-font-weight, var(--fk-font-weight-semibold, 600));color:var(--fk-toast-summary-color, var(--fk-color-text, #1f2d3d))}.fk-toast__detail{font-size:var(--fk-toast-detail-font-size, var(--fk-typography-small-font-size, .8125rem));color:var(--fk-toast-detail-color, var(--fk-color-muted, #8a98a8))}.fk-toast__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:var(--fk-toast-dismiss-size, 1.5rem);height:var(--fk-toast-dismiss-size, 1.5rem);padding:0;background:none;border:none;border-radius:var(--fk-radius-sm, .25rem);color:var(--fk-toast-dismiss-color, var(--fk-color-muted, #8a98a8));cursor:pointer}.fk-toast__dismiss:hover{color:var(--fk-toast-dismiss-hover-color, var(--fk-color-text, #1f2d3d))}.fk-toast__dismiss:focus-visible{outline:none;box-shadow:var(--fk-focus-ring, 0 0 0 3px rgba(10, 132, 255, .18))}.fk-toast__dismiss svg{width:.875rem;height:.875rem;display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, decorators: [{
|
|
60
|
+
type: Component,
|
|
61
|
+
args: [{ selector: 'fk-toast', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"fk-toast__icon\">\n @if (iconSvg()) {\n <span class=\"fk-toast__icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n } @else {\n @switch (severity()) {\n @case ('success') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n }\n @case ('error') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M15 9l-6 6M9 9l6 6\" />\n </svg>\n }\n @case ('warning') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n }\n @case ('info') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n }\n }\n }\n</div>\n\n<div class=\"fk-toast__body\">\n <span class=\"fk-toast__summary\">{{ summary() }}</span>\n\n @if (detail()) {\n <span class=\"fk-toast__detail\">{{ detail() }}</span>\n }\n</div>\n\n@if (dismissible()) {\n <button\n class=\"fk-toast__dismiss\"\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"onDismiss()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n}\n", styles: [":host{display:flex;align-items:flex-start;gap:var(--fk-toast-gap, var(--fk-rhythm-3, .75rem));padding:var(--fk-toast-padding, var(--fk-rhythm-4, 1rem));border:1px solid var(--fk-toast-border-color, var(--fk-color-border, #d9e2ee));border-radius:var(--fk-toast-border-radius, var(--fk-radius-lg, .5rem));background:var(--fk-toast-bg, var(--fk-color-surface, #ffffff));box-shadow:var(--fk-toast-shadow, 0 4px 12px rgba(0, 0, 0, .1));width:100%;box-sizing:border-box}:host.fk-toast--success{border-left:3px solid var(--fk-toast-success-accent, var(--fk-color-success, #10b981))}:host.fk-toast--success .fk-toast__icon{color:var(--fk-toast-success-color, var(--fk-color-success, #10b981))}:host.fk-toast--error{border-left:3px solid var(--fk-toast-error-accent, var(--fk-color-danger, #e02424))}:host.fk-toast--error .fk-toast__icon{color:var(--fk-toast-error-color, var(--fk-color-danger, #e02424))}:host.fk-toast--warning{border-left:3px solid var(--fk-toast-warning-accent, var(--fk-color-warning, #f59e0b))}:host.fk-toast--warning .fk-toast__icon{color:var(--fk-toast-warning-color, var(--fk-color-warning, #f59e0b))}:host.fk-toast--info{border-left:3px solid var(--fk-toast-info-accent, var(--fk-color-primary, #0a84ff))}:host.fk-toast--info .fk-toast__icon{color:var(--fk-toast-info-color, var(--fk-color-primary, #0a84ff))}.fk-toast__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.fk-toast__icon svg{width:var(--fk-toast-icon-size, 1.25rem);height:var(--fk-toast-icon-size, 1.25rem);display:block}.fk-toast__icon-custom{display:inline-flex}.fk-toast__icon-custom svg{width:var(--fk-toast-icon-size, 1.25rem);height:var(--fk-toast-icon-size, 1.25rem);display:block}.fk-toast__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--fk-toast-body-gap, var(--fk-rhythm-1, .25rem))}.fk-toast__summary{font-size:var(--fk-toast-summary-font-size, var(--fk-typography-body-font-size, .875rem));font-weight:var(--fk-toast-summary-font-weight, var(--fk-font-weight-semibold, 600));color:var(--fk-toast-summary-color, var(--fk-color-text, #1f2d3d))}.fk-toast__detail{font-size:var(--fk-toast-detail-font-size, var(--fk-typography-small-font-size, .8125rem));color:var(--fk-toast-detail-color, var(--fk-color-muted, #8a98a8))}.fk-toast__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:var(--fk-toast-dismiss-size, 1.5rem);height:var(--fk-toast-dismiss-size, 1.5rem);padding:0;background:none;border:none;border-radius:var(--fk-radius-sm, .25rem);color:var(--fk-toast-dismiss-color, var(--fk-color-muted, #8a98a8));cursor:pointer}.fk-toast__dismiss:hover{color:var(--fk-toast-dismiss-hover-color, var(--fk-color-text, #1f2d3d))}.fk-toast__dismiss:focus-visible{outline:none;box-shadow:var(--fk-focus-ring, 0 0 0 3px rgba(10, 132, 255, .18))}.fk-toast__dismiss svg{width:.875rem;height:.875rem;display:block}\n"] }]
|
|
62
|
+
}], propDecorators: { severity: [{ type: i0.Input, args: [{ isSignal: true, alias: "severity", required: false }] }], summary: [{ type: i0.Input, args: [{ isSignal: true, alias: "summary", required: false }] }], detail: [{ type: i0.Input, args: [{ isSignal: true, alias: "detail", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], dismiss: [{ type: i0.Output, args: ["dismiss"] }], hostClass: [{
|
|
63
|
+
type: HostBinding,
|
|
64
|
+
args: ['class']
|
|
65
|
+
}], hostId: [{
|
|
66
|
+
type: HostBinding,
|
|
67
|
+
args: ['attr.id']
|
|
68
|
+
}], hostRole: [{
|
|
69
|
+
type: HostBinding,
|
|
70
|
+
args: ['attr.role']
|
|
71
|
+
}] } });
|
|
72
|
+
|
|
73
|
+
class ToastContainerComponent {
|
|
74
|
+
toastService = inject(ToastService);
|
|
75
|
+
appRef = inject(ApplicationRef);
|
|
76
|
+
injector = inject(EnvironmentInjector);
|
|
77
|
+
elRef = inject(ElementRef);
|
|
78
|
+
customRefs = new Map();
|
|
79
|
+
// ===== INPUTS =====
|
|
80
|
+
/** Screen position where toasts are stacked. */
|
|
81
|
+
position = input('top-right', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
|
|
82
|
+
// ===== BASE PROPS =====
|
|
83
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
84
|
+
id = input(null, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
85
|
+
// ===== COMPUTED =====
|
|
86
|
+
defaultToasts = computed(() => this.toastService.toasts().filter((t) => !t.component), ...(ngDevMode ? [{ debugName: "defaultToasts" }] : /* istanbul ignore next */ []));
|
|
87
|
+
classes = computed(() => [
|
|
88
|
+
'fk-toast-container',
|
|
89
|
+
`fk-toast-container--${this.position()}`,
|
|
90
|
+
this.className(),
|
|
91
|
+
]
|
|
92
|
+
.filter(Boolean)
|
|
93
|
+
.join(' '), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
94
|
+
get hostClass() {
|
|
95
|
+
return this.classes();
|
|
96
|
+
}
|
|
97
|
+
get hostId() {
|
|
98
|
+
return this.id();
|
|
99
|
+
}
|
|
100
|
+
constructor() {
|
|
101
|
+
effect(() => {
|
|
102
|
+
const allToasts = this.toastService.toasts();
|
|
103
|
+
const customToasts = allToasts.filter((t) => !!t.component);
|
|
104
|
+
const currentIds = new Set(customToasts.map((t) => t.id));
|
|
105
|
+
// Remove stale custom components
|
|
106
|
+
for (const [id, ref] of this.customRefs) {
|
|
107
|
+
if (!currentIds.has(id)) {
|
|
108
|
+
const wrapper = this.elRef.nativeElement.querySelector(`[data-toast-id="${id}"]`);
|
|
109
|
+
if (wrapper) {
|
|
110
|
+
wrapper.remove();
|
|
111
|
+
}
|
|
112
|
+
this.appRef.detachView(ref.hostView);
|
|
113
|
+
ref.destroy();
|
|
114
|
+
this.customRefs.delete(id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Create new custom components
|
|
118
|
+
for (const toast of customToasts) {
|
|
119
|
+
if (!this.customRefs.has(toast.id) && toast.component) {
|
|
120
|
+
this.createCustomToast(toast);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
ngOnDestroy() {
|
|
126
|
+
for (const ref of this.customRefs.values()) {
|
|
127
|
+
this.appRef.detachView(ref.hostView);
|
|
128
|
+
ref.destroy();
|
|
129
|
+
}
|
|
130
|
+
this.customRefs.clear();
|
|
131
|
+
}
|
|
132
|
+
onDismiss(id) {
|
|
133
|
+
this.toastService.dismiss(id);
|
|
134
|
+
}
|
|
135
|
+
createCustomToast(toast) {
|
|
136
|
+
if (!toast.component) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const toastRef = new ToastRef(toast.id, (id) => this.toastService.dismiss(id));
|
|
140
|
+
const childInjector = Injector.create({
|
|
141
|
+
parent: this.injector,
|
|
142
|
+
providers: [
|
|
143
|
+
{ provide: TOAST_DATA, useValue: toast.data },
|
|
144
|
+
{ provide: TOAST_REF, useValue: toastRef },
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
const wrapper = document.createElement('div');
|
|
148
|
+
wrapper.classList.add('fk-toast-container__custom', `fk-toast-container__custom--${toast.severity}`);
|
|
149
|
+
wrapper.setAttribute('data-toast-id', toast.id);
|
|
150
|
+
const componentRef = createComponent(toast.component, {
|
|
151
|
+
environmentInjector: this.injector,
|
|
152
|
+
elementInjector: childInjector,
|
|
153
|
+
hostElement: document.createElement('div'),
|
|
154
|
+
});
|
|
155
|
+
this.appRef.attachView(componentRef.hostView);
|
|
156
|
+
wrapper.appendChild(componentRef.location.nativeElement);
|
|
157
|
+
this.elRef.nativeElement.appendChild(wrapper);
|
|
158
|
+
this.customRefs.set(toast.id, componentRef);
|
|
159
|
+
}
|
|
160
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
161
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToastContainerComponent, isStandalone: true, selector: "fk-toast-container", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "attr.id": "this.hostId" } }, ngImport: i0, template: "@for (toast of defaultToasts(); track toast.id) {\n <fk-toast\n [id]=\"toast.id\"\n [severity]=\"toast.severity\"\n [summary]=\"toast.summary\"\n [detail]=\"toast.detail\"\n (dismiss)=\"onDismiss(toast.id)\"\n />\n}\n", styles: [":host{position:fixed;z-index:var(--fk-toast-container-z-index, 9500);display:flex;flex-direction:column;gap:var(--fk-toast-container-gap, var(--fk-rhythm-3, .75rem));padding:var(--fk-toast-container-padding, var(--fk-rhythm-4, 1rem));max-width:var(--fk-toast-container-max-width, 24rem);width:100%;pointer-events:none;box-sizing:border-box}:host fk-toast,:host .fk-toast-container__custom{pointer-events:auto}.fk-toast-container__custom{width:100%;box-sizing:border-box;border-radius:var(--fk-toast-border-radius, var(--fk-radius-lg, .5rem));background:var(--fk-toast-bg, var(--fk-color-surface, #ffffff));box-shadow:var(--fk-toast-shadow, 0 4px 12px rgba(0, 0, 0, .1));border:1px solid var(--fk-toast-border-color, var(--fk-color-border, #d9e2ee));overflow:hidden}.fk-toast-container__custom--success{border-left:3px solid var(--fk-toast-success-accent, var(--fk-color-success, #10b981))}.fk-toast-container__custom--error{border-left:3px solid var(--fk-toast-error-accent, var(--fk-color-danger, #e02424))}.fk-toast-container__custom--warning{border-left:3px solid var(--fk-toast-warning-accent, var(--fk-color-warning, #f59e0b))}.fk-toast-container__custom--info{border-left:3px solid var(--fk-toast-info-accent, var(--fk-color-primary, #0a84ff))}:host.fk-toast-container--top-right{top:0;right:0}:host.fk-toast-container--top-center{top:0;left:50%;transform:translate(-50%)}:host.fk-toast-container--top-left{top:0;left:0}:host.fk-toast-container--bottom-right{bottom:0;right:0;flex-direction:column-reverse}:host.fk-toast-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);flex-direction:column-reverse}:host.fk-toast-container--bottom-left{bottom:0;left:0;flex-direction:column-reverse}\n"], dependencies: [{ kind: "component", type: ToastComponent, selector: "fk-toast", inputs: ["severity", "summary", "detail", "dismissible", "className", "id"], outputs: ["dismiss"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
162
|
+
}
|
|
163
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastContainerComponent, decorators: [{
|
|
164
|
+
type: Component,
|
|
165
|
+
args: [{ selector: 'fk-toast-container', standalone: true, imports: [ToastComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (toast of defaultToasts(); track toast.id) {\n <fk-toast\n [id]=\"toast.id\"\n [severity]=\"toast.severity\"\n [summary]=\"toast.summary\"\n [detail]=\"toast.detail\"\n (dismiss)=\"onDismiss(toast.id)\"\n />\n}\n", styles: [":host{position:fixed;z-index:var(--fk-toast-container-z-index, 9500);display:flex;flex-direction:column;gap:var(--fk-toast-container-gap, var(--fk-rhythm-3, .75rem));padding:var(--fk-toast-container-padding, var(--fk-rhythm-4, 1rem));max-width:var(--fk-toast-container-max-width, 24rem);width:100%;pointer-events:none;box-sizing:border-box}:host fk-toast,:host .fk-toast-container__custom{pointer-events:auto}.fk-toast-container__custom{width:100%;box-sizing:border-box;border-radius:var(--fk-toast-border-radius, var(--fk-radius-lg, .5rem));background:var(--fk-toast-bg, var(--fk-color-surface, #ffffff));box-shadow:var(--fk-toast-shadow, 0 4px 12px rgba(0, 0, 0, .1));border:1px solid var(--fk-toast-border-color, var(--fk-color-border, #d9e2ee));overflow:hidden}.fk-toast-container__custom--success{border-left:3px solid var(--fk-toast-success-accent, var(--fk-color-success, #10b981))}.fk-toast-container__custom--error{border-left:3px solid var(--fk-toast-error-accent, var(--fk-color-danger, #e02424))}.fk-toast-container__custom--warning{border-left:3px solid var(--fk-toast-warning-accent, var(--fk-color-warning, #f59e0b))}.fk-toast-container__custom--info{border-left:3px solid var(--fk-toast-info-accent, var(--fk-color-primary, #0a84ff))}:host.fk-toast-container--top-right{top:0;right:0}:host.fk-toast-container--top-center{top:0;left:50%;transform:translate(-50%)}:host.fk-toast-container--top-left{top:0;left:0}:host.fk-toast-container--bottom-right{bottom:0;right:0;flex-direction:column-reverse}:host.fk-toast-container--bottom-center{bottom:0;left:50%;transform:translate(-50%);flex-direction:column-reverse}:host.fk-toast-container--bottom-left{bottom:0;left:0;flex-direction:column-reverse}\n"] }]
|
|
166
|
+
}], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], hostClass: [{
|
|
167
|
+
type: HostBinding,
|
|
168
|
+
args: ['class']
|
|
169
|
+
}], hostId: [{
|
|
170
|
+
type: HostBinding,
|
|
171
|
+
args: ['attr.id']
|
|
172
|
+
}] } });
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Generated bundle index. Do not edit.
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
export { ToastComponent, ToastContainerComponent };
|
|
179
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-toast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-toast.mjs","sources":["../../../../packages/ui-ng/ui/toast/toast.component.ts","../../../../packages/ui-ng/ui/toast/toast.component.html","../../../../packages/ui-ng/ui/toast/toast-container.component.ts","../../../../packages/ui-ng/ui/toast/toast-container.component.html","../../../../packages/ui-ng/ui/toast/frame-kit-ui-ng-ui-toast.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n} from '@angular/core';\n\nimport { IconRegistryService } from '@frame-kit/ui-ng/core/icon';\nimport { TOAST_CONFIG } from '@frame-kit/ui-ng/services/toast';\nimport type { ToastSeverity } from '@frame-kit/ui-ng/services/toast';\n\n@Component({\n selector: 'fk-toast',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './toast.component.html',\n styleUrl: './toast.component.scss',\n})\nexport class ToastComponent {\n private readonly registry = inject(IconRegistryService, { optional: true });\n private readonly config = inject(TOAST_CONFIG, { optional: true });\n\n // ===== INPUTS =====\n /** Severity level that drives the toast icon and color. */\n readonly severity = input<ToastSeverity>('info');\n /** Primary message text shown in the toast. */\n readonly summary = input<string>('');\n /** Optional secondary detail text shown below the summary. */\n readonly detail = input<string | undefined>(undefined);\n /** When true, renders the dismiss button so the user can close the toast. */\n readonly dismissible = input<boolean>(true);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== OUTPUTS =====\n /** Fires when the user clicks the dismiss button. */\n readonly dismiss = output<void>();\n\n // ===== COMPUTED =====\n\n readonly classes = computed(() =>\n ['fk-toast', `fk-toast--${this.severity()}`, this.className()]\n .filter(Boolean)\n .join(' '),\n );\n\n readonly iconSvg = computed(() => {\n const configIcons = this.config?.icons;\n const sev = this.severity();\n\n const iconName = configIcons?.[sev];\n\n if (iconName && this.registry) {\n const content = this.registry.getIcon(iconName);\n\n if (content) {\n return content;\n }\n }\n\n return null;\n });\n\n readonly role = computed(() => {\n const sev = this.severity();\n\n return sev === 'error' || sev === 'warning' ? 'alert' : 'status';\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId() {\n return this.id();\n }\n\n @HostBinding('attr.role')\n get hostRole() {\n return this.role();\n }\n\n onDismiss(): void {\n this.dismiss.emit();\n }\n}\n","<div class=\"fk-toast__icon\">\n @if (iconSvg()) {\n <span class=\"fk-toast__icon-custom\" [innerHTML]=\"iconSvg()\"></span>\n } @else {\n @switch (severity()) {\n @case ('success') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n }\n @case ('error') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M15 9l-6 6M9 9l6 6\" />\n </svg>\n }\n @case ('warning') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path\n d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"\n />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n }\n @case ('info') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n }\n }\n }\n</div>\n\n<div class=\"fk-toast__body\">\n <span class=\"fk-toast__summary\">{{ summary() }}</span>\n\n @if (detail()) {\n <span class=\"fk-toast__detail\">{{ detail() }}</span>\n }\n</div>\n\n@if (dismissible()) {\n <button\n class=\"fk-toast__dismiss\"\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"onDismiss()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n}\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n computed,\n createComponent,\n effect,\n ElementRef,\n EnvironmentInjector,\n HostBinding,\n inject,\n Injector,\n input,\n OnDestroy,\n} from '@angular/core';\n\nimport { ToastService } from '@frame-kit/ui-ng/services/toast';\nimport type { Toast } from '@frame-kit/ui-ng/services/toast';\nimport {\n TOAST_DATA,\n TOAST_REF,\n ToastRef,\n} from '@frame-kit/ui-ng/services/toast';\nimport { ToastComponent } from './toast.component';\n\nexport type ToastPosition =\n | 'top-right'\n | 'top-center'\n | 'top-left'\n | 'bottom-right'\n | 'bottom-center'\n | 'bottom-left';\n\n@Component({\n selector: 'fk-toast-container',\n standalone: true,\n imports: [ToastComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './toast-container.component.html',\n styleUrl: './toast-container.component.scss',\n})\nexport class ToastContainerComponent implements OnDestroy {\n protected readonly toastService = inject(ToastService);\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly elRef = inject(ElementRef);\n\n private readonly customRefs = new Map<string, ComponentRef<unknown>>();\n\n // ===== INPUTS =====\n /** Screen position where toasts are stacked. */\n readonly position = input<ToastPosition>('top-right');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n\n // ===== COMPUTED =====\n\n readonly defaultToasts = computed(() =>\n this.toastService.toasts().filter((t) => !t.component),\n );\n\n readonly classes = computed(() =>\n [\n 'fk-toast-container',\n `fk-toast-container--${this.position()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.id')\n get hostId() {\n return this.id();\n }\n\n constructor() {\n effect(() => {\n const allToasts = this.toastService.toasts();\n const customToasts = allToasts.filter((t) => !!t.component);\n const currentIds = new Set(customToasts.map((t) => t.id));\n\n // Remove stale custom components\n for (const [id, ref] of this.customRefs) {\n if (!currentIds.has(id)) {\n const wrapper = this.elRef.nativeElement.querySelector(\n `[data-toast-id=\"${id}\"]`,\n );\n\n if (wrapper) {\n wrapper.remove();\n }\n\n this.appRef.detachView(ref.hostView);\n ref.destroy();\n this.customRefs.delete(id);\n }\n }\n\n // Create new custom components\n for (const toast of customToasts) {\n if (!this.customRefs.has(toast.id) && toast.component) {\n this.createCustomToast(toast);\n }\n }\n });\n }\n\n ngOnDestroy(): void {\n for (const ref of this.customRefs.values()) {\n this.appRef.detachView(ref.hostView);\n ref.destroy();\n }\n\n this.customRefs.clear();\n }\n\n onDismiss(id: string): void {\n this.toastService.dismiss(id);\n }\n\n private createCustomToast(toast: Toast): void {\n if (!toast.component) {\n return;\n }\n\n const toastRef = new ToastRef(toast.id, (id) =>\n this.toastService.dismiss(id),\n );\n\n const childInjector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: TOAST_DATA, useValue: toast.data },\n { provide: TOAST_REF, useValue: toastRef },\n ],\n });\n\n const wrapper = document.createElement('div');\n\n wrapper.classList.add(\n 'fk-toast-container__custom',\n `fk-toast-container__custom--${toast.severity}`,\n );\n wrapper.setAttribute('data-toast-id', toast.id);\n\n const componentRef = createComponent(toast.component, {\n environmentInjector: this.injector,\n elementInjector: childInjector,\n hostElement: document.createElement('div'),\n });\n\n this.appRef.attachView(componentRef.hostView);\n wrapper.appendChild(componentRef.location.nativeElement);\n this.elRef.nativeElement.appendChild(wrapper);\n this.customRefs.set(toast.id, componentRef);\n }\n}\n","@for (toast of defaultToasts(); track toast.id) {\n <fk-toast\n [id]=\"toast.id\"\n [severity]=\"toast.severity\"\n [summary]=\"toast.summary\"\n [detail]=\"toast.detail\"\n (dismiss)=\"onDismiss(toast.id)\"\n />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|