@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,82 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, Directive, input, contentChild, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
const FK_ALERT_ICON_START = new InjectionToken('FK_ALERT_ICON_START');
|
|
5
|
+
class FkAlertIconStartDirective {
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FkAlertIconStartDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
7
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: FkAlertIconStartDirective, isStandalone: true, selector: "[fkAlertIconStart]", host: { attributes: { "aria-hidden": "true" } }, providers: [
|
|
8
|
+
{ provide: FK_ALERT_ICON_START, useExisting: FkAlertIconStartDirective },
|
|
9
|
+
], ngImport: i0 });
|
|
10
|
+
}
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FkAlertIconStartDirective, decorators: [{
|
|
12
|
+
type: Directive,
|
|
13
|
+
args: [{
|
|
14
|
+
selector: '[fkAlertIconStart]',
|
|
15
|
+
standalone: true,
|
|
16
|
+
providers: [
|
|
17
|
+
{ provide: FK_ALERT_ICON_START, useExisting: FkAlertIconStartDirective },
|
|
18
|
+
],
|
|
19
|
+
host: {
|
|
20
|
+
'aria-hidden': 'true',
|
|
21
|
+
},
|
|
22
|
+
}]
|
|
23
|
+
}] });
|
|
24
|
+
|
|
25
|
+
class AlertComponent {
|
|
26
|
+
// ===== INPUTS =====
|
|
27
|
+
/** Semantic variant that drives the alert color scheme and icon. */
|
|
28
|
+
variant = input('info', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
29
|
+
/** Override the text color as a CSS value, bypassing the variant token. */
|
|
30
|
+
color = input(null, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
31
|
+
/** Override the background color as a CSS value, bypassing the variant token. */
|
|
32
|
+
backgroundColor = input(null, ...(ngDevMode ? [{ debugName: "backgroundColor" }] : /* istanbul ignore next */ []));
|
|
33
|
+
/** Override the border color as a CSS value, bypassing the variant token. */
|
|
34
|
+
borderColor = input(null, ...(ngDevMode ? [{ debugName: "borderColor" }] : /* istanbul ignore next */ []));
|
|
35
|
+
// ===== CONTENT CHILDREN =====
|
|
36
|
+
iconStartRef = contentChild(FK_ALERT_ICON_START, ...(ngDevMode ? [{ debugName: "iconStartRef" }] : /* istanbul ignore next */ []));
|
|
37
|
+
// ===== BASE PROPS =====
|
|
38
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
39
|
+
// ===== COMPUTED =====
|
|
40
|
+
classes = computed(() => {
|
|
41
|
+
return ['fk-alert', `fk-alert--${this.variant()}`, this.className()]
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join(' ');
|
|
44
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
45
|
+
get hostClass() {
|
|
46
|
+
return this.classes();
|
|
47
|
+
}
|
|
48
|
+
get hostColor() {
|
|
49
|
+
return this.color();
|
|
50
|
+
}
|
|
51
|
+
get hostBackgroundColor() {
|
|
52
|
+
return this.backgroundColor();
|
|
53
|
+
}
|
|
54
|
+
get hostBorderColor() {
|
|
55
|
+
return this.borderColor();
|
|
56
|
+
}
|
|
57
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
58
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AlertComponent, isStandalone: true, selector: "fk-alert", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, borderColor: { classPropertyName: "borderColor", publicName: "borderColor", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "style.color": "this.hostColor", "style.background-color": "this.hostBackgroundColor", "style.border-color": "this.hostBorderColor" } }, queries: [{ propertyName: "iconStartRef", first: true, predicate: FK_ALERT_ICON_START, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content select=\"[fkAlertIconStart]\" />\n<span class=\"fk-alert__content\">\n <ng-content />\n</span>\n", styles: [":host{display:flex;align-items:center;gap:var(--fk-alert-icon-gap, .5rem);padding:var(--fk-alert-padding, var(--fk-rhythm-4, 1rem));border:1px solid transparent;border-radius:var(--fk-alert-border-radius, var(--fk-radius-md, .375rem));font-size:var(--fk-alert-font-size, var(--fk-typography-small-font-size, .8125rem));line-height:1.5}.fk-alert__content{flex:1}:host.fk-alert--info{background-color:var(--fk-alert-info-bg, #e8f4fd);border-color:var(--fk-alert-info-border-color, #b6e0fe);color:var(--fk-alert-info-color, #084298)}:host.fk-alert--success{background-color:var(--fk-alert-success-bg, #e6f4ea);border-color:var(--fk-alert-success-border-color, #a3d9a5);color:var(--fk-alert-success-color, #1e7e34)}:host.fk-alert--warning{background-color:var(--fk-alert-warning-bg, #fff4e5);border-color:var(--fk-alert-warning-border-color, #ffd8a8);color:var(--fk-alert-warning-color, #8a5700)}:host.fk-alert--error{background-color:var(--fk-alert-error-bg, #fdecea);border-color:var(--fk-alert-error-border-color, #f5c2c7);color:var(--fk-alert-error-color, #842029)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
59
|
+
}
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AlertComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: 'fk-alert', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content select=\"[fkAlertIconStart]\" />\n<span class=\"fk-alert__content\">\n <ng-content />\n</span>\n", styles: [":host{display:flex;align-items:center;gap:var(--fk-alert-icon-gap, .5rem);padding:var(--fk-alert-padding, var(--fk-rhythm-4, 1rem));border:1px solid transparent;border-radius:var(--fk-alert-border-radius, var(--fk-radius-md, .375rem));font-size:var(--fk-alert-font-size, var(--fk-typography-small-font-size, .8125rem));line-height:1.5}.fk-alert__content{flex:1}:host.fk-alert--info{background-color:var(--fk-alert-info-bg, #e8f4fd);border-color:var(--fk-alert-info-border-color, #b6e0fe);color:var(--fk-alert-info-color, #084298)}:host.fk-alert--success{background-color:var(--fk-alert-success-bg, #e6f4ea);border-color:var(--fk-alert-success-border-color, #a3d9a5);color:var(--fk-alert-success-color, #1e7e34)}:host.fk-alert--warning{background-color:var(--fk-alert-warning-bg, #fff4e5);border-color:var(--fk-alert-warning-border-color, #ffd8a8);color:var(--fk-alert-warning-color, #8a5700)}:host.fk-alert--error{background-color:var(--fk-alert-error-bg, #fdecea);border-color:var(--fk-alert-error-border-color, #f5c2c7);color:var(--fk-alert-error-color, #842029)}\n"] }]
|
|
63
|
+
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], backgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundColor", required: false }] }], borderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderColor", required: false }] }], iconStartRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FK_ALERT_ICON_START), { isSignal: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], hostClass: [{
|
|
64
|
+
type: HostBinding,
|
|
65
|
+
args: ['class']
|
|
66
|
+
}], hostColor: [{
|
|
67
|
+
type: HostBinding,
|
|
68
|
+
args: ['style.color']
|
|
69
|
+
}], hostBackgroundColor: [{
|
|
70
|
+
type: HostBinding,
|
|
71
|
+
args: ['style.background-color']
|
|
72
|
+
}], hostBorderColor: [{
|
|
73
|
+
type: HostBinding,
|
|
74
|
+
args: ['style.border-color']
|
|
75
|
+
}] } });
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Generated bundle index. Do not edit.
|
|
79
|
+
*/
|
|
80
|
+
|
|
81
|
+
export { AlertComponent, FK_ALERT_ICON_START, FkAlertIconStartDirective };
|
|
82
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-alert.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-alert.mjs","sources":["../../../../packages/ui-ng/ui/alert/alert-icon.directive.ts","../../../../packages/ui-ng/ui/alert/alert.component.ts","../../../../packages/ui-ng/ui/alert/alert.component.html","../../../../packages/ui-ng/ui/alert/frame-kit-ui-ng-ui-alert.ts"],"sourcesContent":["import { Directive, InjectionToken } from '@angular/core';\n\nexport const FK_ALERT_ICON_START =\n new InjectionToken<FkAlertIconStartDirective>('FK_ALERT_ICON_START');\n\n@Directive({\n selector: '[fkAlertIconStart]',\n standalone: true,\n providers: [\n { provide: FK_ALERT_ICON_START, useExisting: FkAlertIconStartDirective },\n ],\n host: {\n 'aria-hidden': 'true',\n },\n})\nexport class FkAlertIconStartDirective {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport type { AlertVariant } from './alert.types';\nimport { FK_ALERT_ICON_START } from './alert-icon.directive';\n\n@Component({\n selector: 'fk-alert',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './alert.component.html',\n styleUrl: './alert.component.scss',\n})\nexport class AlertComponent {\n // ===== INPUTS =====\n /** Semantic variant that drives the alert color scheme and icon. */\n readonly variant = input<AlertVariant>('info');\n /** Override the text color as a CSS value, bypassing the variant token. */\n readonly color = input<string | null>(null);\n /** Override the background color as a CSS value, bypassing the variant token. */\n readonly backgroundColor = input<string | null>(null);\n /** Override the border color as a CSS value, bypassing the variant token. */\n readonly borderColor = input<string | null>(null);\n\n // ===== CONTENT CHILDREN =====\n readonly iconStartRef = contentChild(FK_ALERT_ICON_START);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-alert', `fk-alert--${this.variant()}`, this.className()]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('style.color')\n get hostColor() {\n return this.color();\n }\n\n @HostBinding('style.background-color')\n get hostBackgroundColor() {\n return this.backgroundColor();\n }\n\n @HostBinding('style.border-color')\n get hostBorderColor() {\n return this.borderColor();\n }\n}\n","<ng-content select=\"[fkAlertIconStart]\" />\n<span class=\"fk-alert__content\">\n <ng-content />\n</span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { TooltipDirective } from '@frame-kit/ui-ng/directives/tooltip';
|
|
4
|
+
import { AvatarComponent } from '@frame-kit/ui-ng/ui/avatar';
|
|
5
|
+
|
|
6
|
+
class AvatarStackComponent {
|
|
7
|
+
// ===== INPUTS =====
|
|
8
|
+
/** Array of user objects to render as overlapping avatars. */
|
|
9
|
+
users = input([], ...(ngDevMode ? [{ debugName: "users" }] : /* istanbul ignore next */ []));
|
|
10
|
+
/** Maximum number of avatars displayed before an overflow counter appears. */
|
|
11
|
+
maxVisible = input(5, ...(ngDevMode ? [{ debugName: "maxVisible" }] : /* istanbul ignore next */ []));
|
|
12
|
+
/** Size applied to every avatar in the stack. */
|
|
13
|
+
size = input('sm', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
14
|
+
// ===== BASE PROPS =====
|
|
15
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
16
|
+
id = input(null, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
17
|
+
ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
18
|
+
// ===== OUTPUTS =====
|
|
19
|
+
/** Fires when the user clicks an individual avatar, emitting that user's data. */
|
|
20
|
+
avatarClick = output();
|
|
21
|
+
/** Fires when the user clicks the overflow counter showing hidden avatars. */
|
|
22
|
+
overflowClick = output();
|
|
23
|
+
// ===== COMPUTED =====
|
|
24
|
+
visibleUsers = computed(() => {
|
|
25
|
+
return this.users().slice(0, this.maxVisible());
|
|
26
|
+
}, ...(ngDevMode ? [{ debugName: "visibleUsers" }] : /* istanbul ignore next */ []));
|
|
27
|
+
overflowCount = computed(() => {
|
|
28
|
+
const total = this.users().length;
|
|
29
|
+
const max = this.maxVisible();
|
|
30
|
+
return total > max ? total - max : 0;
|
|
31
|
+
}, ...(ngDevMode ? [{ debugName: "overflowCount" }] : /* istanbul ignore next */ []));
|
|
32
|
+
overflowTooltip = computed(() => {
|
|
33
|
+
const hidden = this.users().slice(this.maxVisible());
|
|
34
|
+
return hidden.map((u) => u.name).join(', ');
|
|
35
|
+
}, ...(ngDevMode ? [{ debugName: "overflowTooltip" }] : /* istanbul ignore next */ []));
|
|
36
|
+
classes = computed(() => {
|
|
37
|
+
return [
|
|
38
|
+
'fk-avatar-stack',
|
|
39
|
+
`fk-avatar-stack--${this.size()}`,
|
|
40
|
+
this.className(),
|
|
41
|
+
]
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join(' ');
|
|
44
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
45
|
+
get hostClass() {
|
|
46
|
+
return this.classes();
|
|
47
|
+
}
|
|
48
|
+
get hostId() {
|
|
49
|
+
return this.id();
|
|
50
|
+
}
|
|
51
|
+
get hostAriaLabel() {
|
|
52
|
+
return this.ariaLabel();
|
|
53
|
+
}
|
|
54
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AvatarStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
55
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AvatarStackComponent, isStandalone: true, selector: "fk-avatar-stack", inputs: { users: { classPropertyName: "users", publicName: "users", isSignal: true, isRequired: false, transformFunction: null }, maxVisible: { classPropertyName: "maxVisible", publicName: "maxVisible", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", 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 }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { avatarClick: "avatarClick", overflowClick: "overflowClick" }, host: { properties: { "class": "this.hostClass", "attr.id": "this.hostId", "attr.aria-label": "this.hostAriaLabel" } }, ngImport: i0, template: "@for (user of visibleUsers(); track user.id) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"fk-avatar-stack__item\"\n [fkTooltip]=\"user.name\"\n (click)=\"avatarClick.emit(user)\"\n >\n <fk-avatar\n [name]=\"user.name\"\n [avatarUrl]=\"user.avatarUrl ?? null\"\n [size]=\"size()\"\n />\n </div>\n}\n\n@if (overflowCount() > 0) {\n <button\n class=\"fk-avatar-stack__overflow\"\n type=\"button\"\n [fkTooltip]=\"overflowTooltip()\"\n aria-label=\"Show all users\"\n (click)=\"overflowClick.emit()\"\n >\n +{{ overflowCount() }}\n </button>\n}\n", styles: [":host{display:inline-flex;align-items:center}.fk-avatar-stack__item{position:relative;display:inline-flex;cursor:pointer}.fk-avatar-stack__item:not(:first-child){margin-left:calc(-1 * var(--fk-avatar-stack-overlap, .5rem))}.fk-avatar-stack__item:hover{z-index:10}.fk-avatar-stack__item fk-avatar{box-shadow:var(--fk-avatar-stack-ring, 0 0 0 2px var(--fk-color-surface, #ffffff));border-radius:50%}.fk-avatar-stack__overflow{display:inline-flex;align-items:center;justify-content:center;margin-left:calc(-1 * var(--fk-avatar-stack-overlap, .5rem));border-radius:50%;border:none;cursor:pointer;font-weight:var(--fk-font-weight-semibold, 600);color:var(--fk-avatar-stack-overflow-color, var(--fk-color-text, #1f2d3d));background:var(--fk-avatar-stack-overflow-bg, var(--fk-color-surface-muted, #f1f5f9));box-shadow:var(--fk-avatar-stack-ring, 0 0 0 2px var(--fk-color-surface, #ffffff))}.fk-avatar-stack__overflow:hover{z-index:10;background:var(--fk-avatar-stack-overflow-bg-hover, var(--fk-color-surface-hover, #e2e8f0))}.fk-avatar-stack__overflow:focus-visible{outline:none;box-shadow:var(--fk-avatar-stack-overflow-focus-ring, var(--fk-focus-ring, 0 0 0 3px rgba(10, 132, 255, .18)))}:host.fk-avatar-stack--sm .fk-avatar-stack__overflow{width:var(--fk-avatar-size-sm, 1.75rem);height:var(--fk-avatar-size-sm, 1.75rem);font-size:var(--fk-avatar-stack-overflow-font-size-sm, .625rem)}:host.fk-avatar-stack--md .fk-avatar-stack__overflow{width:var(--fk-avatar-size-md, 2.25rem);height:var(--fk-avatar-size-md, 2.25rem);font-size:var(--fk-avatar-stack-overflow-font-size-md, .75rem)}:host.fk-avatar-stack--lg .fk-avatar-stack__overflow{width:var(--fk-avatar-size-lg, 3rem);height:var(--fk-avatar-size-lg, 3rem);font-size:var(--fk-avatar-stack-overflow-font-size-lg, .875rem)}\n"], dependencies: [{ kind: "component", type: AvatarComponent, selector: "fk-avatar", inputs: ["name", "avatarUrl", "initials", "status", "showStatus", "size", "className", "id", "ariaLabel"] }, { kind: "directive", type: TooltipDirective, selector: "[fkTooltip]", inputs: ["fkTooltip", "fkTooltipPosition", "fkTooltipOffset", "fkTooltipShowDelay", "fkTooltipHideDelay", "fkTooltipDisabled", "fkTooltipClassName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AvatarStackComponent, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{ selector: 'fk-avatar-stack', standalone: true, imports: [AvatarComponent, TooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (user of visibleUsers(); track user.id) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"fk-avatar-stack__item\"\n [fkTooltip]=\"user.name\"\n (click)=\"avatarClick.emit(user)\"\n >\n <fk-avatar\n [name]=\"user.name\"\n [avatarUrl]=\"user.avatarUrl ?? null\"\n [size]=\"size()\"\n />\n </div>\n}\n\n@if (overflowCount() > 0) {\n <button\n class=\"fk-avatar-stack__overflow\"\n type=\"button\"\n [fkTooltip]=\"overflowTooltip()\"\n aria-label=\"Show all users\"\n (click)=\"overflowClick.emit()\"\n >\n +{{ overflowCount() }}\n </button>\n}\n", styles: [":host{display:inline-flex;align-items:center}.fk-avatar-stack__item{position:relative;display:inline-flex;cursor:pointer}.fk-avatar-stack__item:not(:first-child){margin-left:calc(-1 * var(--fk-avatar-stack-overlap, .5rem))}.fk-avatar-stack__item:hover{z-index:10}.fk-avatar-stack__item fk-avatar{box-shadow:var(--fk-avatar-stack-ring, 0 0 0 2px var(--fk-color-surface, #ffffff));border-radius:50%}.fk-avatar-stack__overflow{display:inline-flex;align-items:center;justify-content:center;margin-left:calc(-1 * var(--fk-avatar-stack-overlap, .5rem));border-radius:50%;border:none;cursor:pointer;font-weight:var(--fk-font-weight-semibold, 600);color:var(--fk-avatar-stack-overflow-color, var(--fk-color-text, #1f2d3d));background:var(--fk-avatar-stack-overflow-bg, var(--fk-color-surface-muted, #f1f5f9));box-shadow:var(--fk-avatar-stack-ring, 0 0 0 2px var(--fk-color-surface, #ffffff))}.fk-avatar-stack__overflow:hover{z-index:10;background:var(--fk-avatar-stack-overflow-bg-hover, var(--fk-color-surface-hover, #e2e8f0))}.fk-avatar-stack__overflow:focus-visible{outline:none;box-shadow:var(--fk-avatar-stack-overflow-focus-ring, var(--fk-focus-ring, 0 0 0 3px rgba(10, 132, 255, .18)))}:host.fk-avatar-stack--sm .fk-avatar-stack__overflow{width:var(--fk-avatar-size-sm, 1.75rem);height:var(--fk-avatar-size-sm, 1.75rem);font-size:var(--fk-avatar-stack-overflow-font-size-sm, .625rem)}:host.fk-avatar-stack--md .fk-avatar-stack__overflow{width:var(--fk-avatar-size-md, 2.25rem);height:var(--fk-avatar-size-md, 2.25rem);font-size:var(--fk-avatar-stack-overflow-font-size-md, .75rem)}:host.fk-avatar-stack--lg .fk-avatar-stack__overflow{width:var(--fk-avatar-size-lg, 3rem);height:var(--fk-avatar-size-lg, 3rem);font-size:var(--fk-avatar-stack-overflow-font-size-lg, .875rem)}\n"] }]
|
|
60
|
+
}], propDecorators: { users: [{ type: i0.Input, args: [{ isSignal: true, alias: "users", required: false }] }], maxVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisible", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], avatarClick: [{ type: i0.Output, args: ["avatarClick"] }], overflowClick: [{ type: i0.Output, args: ["overflowClick"] }], hostClass: [{
|
|
61
|
+
type: HostBinding,
|
|
62
|
+
args: ['class']
|
|
63
|
+
}], hostId: [{
|
|
64
|
+
type: HostBinding,
|
|
65
|
+
args: ['attr.id']
|
|
66
|
+
}], hostAriaLabel: [{
|
|
67
|
+
type: HostBinding,
|
|
68
|
+
args: ['attr.aria-label']
|
|
69
|
+
}] } });
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Generated bundle index. Do not edit.
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
export { AvatarStackComponent };
|
|
76
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-avatar-stack.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-avatar-stack.mjs","sources":["../../../../packages/ui-ng/ui/avatar-stack/avatar-stack.component.ts","../../../../packages/ui-ng/ui/avatar-stack/avatar-stack.component.html","../../../../packages/ui-ng/ui/avatar-stack/frame-kit-ui-ng-ui-avatar-stack.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n} from '@angular/core';\n\nimport { TooltipDirective } from '@frame-kit/ui-ng/directives/tooltip';\nimport { AvatarComponent } from '@frame-kit/ui-ng/ui/avatar';\nimport type { AvatarStackSize, AvatarStackUser } from './avatar-stack.types';\n\n@Component({\n selector: 'fk-avatar-stack',\n standalone: true,\n imports: [AvatarComponent, TooltipDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './avatar-stack.component.html',\n styleUrl: './avatar-stack.component.scss',\n})\nexport class AvatarStackComponent {\n // ===== INPUTS =====\n /** Array of user objects to render as overlapping avatars. */\n readonly users = input<AvatarStackUser[]>([]);\n /** Maximum number of avatars displayed before an overflow counter appears. */\n readonly maxVisible = input<number>(5);\n /** Size applied to every avatar in the stack. */\n readonly size = input<AvatarStackSize>('sm');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== OUTPUTS =====\n /** Fires when the user clicks an individual avatar, emitting that user's data. */\n readonly avatarClick = output<AvatarStackUser>();\n /** Fires when the user clicks the overflow counter showing hidden avatars. */\n readonly overflowClick = output<void>();\n\n // ===== COMPUTED =====\n readonly visibleUsers = computed(() => {\n return this.users().slice(0, this.maxVisible());\n });\n\n readonly overflowCount = computed(() => {\n const total = this.users().length;\n const max = this.maxVisible();\n\n return total > max ? total - max : 0;\n });\n\n readonly overflowTooltip = computed(() => {\n const hidden = this.users().slice(this.maxVisible());\n\n return hidden.map((u) => u.name).join(', ');\n });\n\n readonly classes = computed(() => {\n return [\n 'fk-avatar-stack',\n `fk-avatar-stack--${this.size()}`,\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 @HostBinding('attr.aria-label')\n get hostAriaLabel() {\n return this.ariaLabel();\n }\n}\n","@for (user of visibleUsers(); track user.id) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"fk-avatar-stack__item\"\n [fkTooltip]=\"user.name\"\n (click)=\"avatarClick.emit(user)\"\n >\n <fk-avatar\n [name]=\"user.name\"\n [avatarUrl]=\"user.avatarUrl ?? null\"\n [size]=\"size()\"\n />\n </div>\n}\n\n@if (overflowCount() > 0) {\n <button\n class=\"fk-avatar-stack__overflow\"\n type=\"button\"\n [fkTooltip]=\"overflowTooltip()\"\n aria-label=\"Show all users\"\n (click)=\"overflowClick.emit()\"\n >\n +{{ overflowCount() }}\n </button>\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
|
+
|
|
4
|
+
class AvatarComponent {
|
|
5
|
+
// ===== IDENTITY =====
|
|
6
|
+
/** Full display name used to derive initials when no explicit initials or image are provided. */
|
|
7
|
+
name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
8
|
+
/** URL of the avatar image; falls back to initials when the image fails to load. */
|
|
9
|
+
avatarUrl = input(null, ...(ngDevMode ? [{ debugName: "avatarUrl" }] : /* istanbul ignore next */ []));
|
|
10
|
+
/** Explicit two-character initials that override the name-derived fallback. */
|
|
11
|
+
initials = input(null, ...(ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []));
|
|
12
|
+
// ===== STATUS =====
|
|
13
|
+
/** Online/offline/away status to reflect on the indicator dot. */
|
|
14
|
+
status = input(null, ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
|
|
15
|
+
/** When true, renders the status indicator dot over the avatar. */
|
|
16
|
+
showStatus = input(false, ...(ngDevMode ? [{ debugName: "showStatus" }] : /* istanbul ignore next */ []));
|
|
17
|
+
// ===== DISPLAY =====
|
|
18
|
+
/** Controls the avatar size. */
|
|
19
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
20
|
+
// ===== BASE PROPS =====
|
|
21
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
22
|
+
id = input(null, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
23
|
+
ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
24
|
+
// ===== COMPUTED =====
|
|
25
|
+
derivedInitials = computed(() => {
|
|
26
|
+
const explicit = this.initials();
|
|
27
|
+
if (explicit) {
|
|
28
|
+
return explicit;
|
|
29
|
+
}
|
|
30
|
+
const name = this.name();
|
|
31
|
+
if (!name) {
|
|
32
|
+
return '?';
|
|
33
|
+
}
|
|
34
|
+
const parts = name.trim().split(/\s+/);
|
|
35
|
+
if (parts.length >= 2) {
|
|
36
|
+
return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
|
|
37
|
+
}
|
|
38
|
+
return parts[0].substring(0, 2).toUpperCase();
|
|
39
|
+
}, ...(ngDevMode ? [{ debugName: "derivedInitials" }] : /* istanbul ignore next */ []));
|
|
40
|
+
showIndicator = computed(() => this.showStatus() && this.status() !== null, ...(ngDevMode ? [{ debugName: "showIndicator" }] : /* istanbul ignore next */ []));
|
|
41
|
+
classes = computed(() => {
|
|
42
|
+
return [
|
|
43
|
+
'fk-avatar',
|
|
44
|
+
`fk-avatar--${this.size()}`,
|
|
45
|
+
this.showIndicator() ? `fk-avatar--status-${this.status()}` : '',
|
|
46
|
+
this.className(),
|
|
47
|
+
]
|
|
48
|
+
.filter(Boolean)
|
|
49
|
+
.join(' ');
|
|
50
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
51
|
+
get hostClass() {
|
|
52
|
+
return this.classes();
|
|
53
|
+
}
|
|
54
|
+
get hostId() {
|
|
55
|
+
return this.id();
|
|
56
|
+
}
|
|
57
|
+
// Tracks whether the image failed to load
|
|
58
|
+
imgError = { value: false };
|
|
59
|
+
onImgError() {
|
|
60
|
+
this.imgError.value = true;
|
|
61
|
+
}
|
|
62
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
63
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AvatarComponent, isStandalone: true, selector: "fk-avatar", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, avatarUrl: { classPropertyName: "avatarUrl", publicName: "avatarUrl", isSignal: true, isRequired: false, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, showStatus: { classPropertyName: "showStatus", publicName: "showStatus", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", 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 }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "attr.id": "this.hostId" } }, ngImport: i0, template: "<!-- Avatar circle -->\n<span\n class=\"fk-avatar__circle\"\n [attr.aria-label]=\"ariaLabel() ?? 'Avatar for ' + name()\"\n role=\"img\"\n>\n @if (avatarUrl() && !imgError.value) {\n <img\n class=\"fk-avatar__image\"\n [src]=\"avatarUrl()\"\n [alt]=\"name()\"\n (error)=\"onImgError()\"\n />\n } @else {\n <span class=\"fk-avatar__initials\" aria-hidden=\"true\">\n {{ derivedInitials() }}\n </span>\n }\n</span>\n\n<!-- Status indicator -->\n@if (showIndicator()) {\n <span\n class=\"fk-avatar__status\"\n [attr.aria-label]=\"status() + ' status'\"\n role=\"status\"\n ></span>\n}\n", styles: [":host{display:inline-flex;position:relative;flex-shrink:0}.fk-avatar__circle{display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--fk-avatar-radius, var(--fk-radius-full, 9999px));background-color:var(--fk-avatar-bg, var(--fk-color-surface-muted, #f7f9fb));color:var(--fk-avatar-color, var(--fk-color-muted, #8a98a8));font-family:var(--fk-avatar-font-family, var(--fk-font-family-base));font-weight:var(--fk-avatar-font-weight, var(--fk-font-weight-semibold, 600));line-height:1;-webkit-user-select:none;user-select:none}.fk-avatar__image{width:100%;height:100%;object-fit:cover;display:block}.fk-avatar__initials{display:flex;align-items:center;justify-content:center;width:100%;height:100%;text-transform:uppercase}.fk-avatar__status{position:absolute;border-radius:var(--fk-radius-full, 9999px);border:2px solid var(--fk-avatar-status-border, var(--fk-color-surface, #ffffff))}:host.fk-avatar--sm .fk-avatar__circle{width:var(--fk-avatar-size-sm, 1.75rem);height:var(--fk-avatar-size-sm, 1.75rem);font-size:var(--fk-avatar-font-size-sm, .6875rem)}:host.fk-avatar--sm .fk-avatar__status{width:.5rem;height:.5rem;bottom:-1px;right:-1px}:host.fk-avatar--md .fk-avatar__circle{width:var(--fk-avatar-size-md, 2.25rem);height:var(--fk-avatar-size-md, 2.25rem);font-size:var(--fk-avatar-font-size-md, .8125rem)}:host.fk-avatar--md .fk-avatar__status{width:.625rem;height:.625rem;bottom:0;right:0}:host.fk-avatar--lg .fk-avatar__circle{width:var(--fk-avatar-size-lg, 3rem);height:var(--fk-avatar-size-lg, 3rem);font-size:var(--fk-avatar-font-size-lg, 1rem)}:host.fk-avatar--lg .fk-avatar__status{width:.75rem;height:.75rem;bottom:0;right:0}:host.fk-avatar--status-online .fk-avatar__status{background-color:var(--fk-avatar-status-online, var(--fk-color-success, #10b981))}:host.fk-avatar--status-offline .fk-avatar__status{background-color:var(--fk-avatar-status-offline, var(--fk-color-muted, #8a98a8))}:host.fk-avatar--status-away .fk-avatar__status{background-color:var(--fk-avatar-status-away, var(--fk-color-warning, #f59e0b))}:host.fk-avatar--status-busy .fk-avatar__status{background-color:var(--fk-avatar-status-busy, var(--fk-color-danger, #e02424))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AvatarComponent, decorators: [{
|
|
66
|
+
type: Component,
|
|
67
|
+
args: [{ selector: 'fk-avatar', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Avatar circle -->\n<span\n class=\"fk-avatar__circle\"\n [attr.aria-label]=\"ariaLabel() ?? 'Avatar for ' + name()\"\n role=\"img\"\n>\n @if (avatarUrl() && !imgError.value) {\n <img\n class=\"fk-avatar__image\"\n [src]=\"avatarUrl()\"\n [alt]=\"name()\"\n (error)=\"onImgError()\"\n />\n } @else {\n <span class=\"fk-avatar__initials\" aria-hidden=\"true\">\n {{ derivedInitials() }}\n </span>\n }\n</span>\n\n<!-- Status indicator -->\n@if (showIndicator()) {\n <span\n class=\"fk-avatar__status\"\n [attr.aria-label]=\"status() + ' status'\"\n role=\"status\"\n ></span>\n}\n", styles: [":host{display:inline-flex;position:relative;flex-shrink:0}.fk-avatar__circle{display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--fk-avatar-radius, var(--fk-radius-full, 9999px));background-color:var(--fk-avatar-bg, var(--fk-color-surface-muted, #f7f9fb));color:var(--fk-avatar-color, var(--fk-color-muted, #8a98a8));font-family:var(--fk-avatar-font-family, var(--fk-font-family-base));font-weight:var(--fk-avatar-font-weight, var(--fk-font-weight-semibold, 600));line-height:1;-webkit-user-select:none;user-select:none}.fk-avatar__image{width:100%;height:100%;object-fit:cover;display:block}.fk-avatar__initials{display:flex;align-items:center;justify-content:center;width:100%;height:100%;text-transform:uppercase}.fk-avatar__status{position:absolute;border-radius:var(--fk-radius-full, 9999px);border:2px solid var(--fk-avatar-status-border, var(--fk-color-surface, #ffffff))}:host.fk-avatar--sm .fk-avatar__circle{width:var(--fk-avatar-size-sm, 1.75rem);height:var(--fk-avatar-size-sm, 1.75rem);font-size:var(--fk-avatar-font-size-sm, .6875rem)}:host.fk-avatar--sm .fk-avatar__status{width:.5rem;height:.5rem;bottom:-1px;right:-1px}:host.fk-avatar--md .fk-avatar__circle{width:var(--fk-avatar-size-md, 2.25rem);height:var(--fk-avatar-size-md, 2.25rem);font-size:var(--fk-avatar-font-size-md, .8125rem)}:host.fk-avatar--md .fk-avatar__status{width:.625rem;height:.625rem;bottom:0;right:0}:host.fk-avatar--lg .fk-avatar__circle{width:var(--fk-avatar-size-lg, 3rem);height:var(--fk-avatar-size-lg, 3rem);font-size:var(--fk-avatar-font-size-lg, 1rem)}:host.fk-avatar--lg .fk-avatar__status{width:.75rem;height:.75rem;bottom:0;right:0}:host.fk-avatar--status-online .fk-avatar__status{background-color:var(--fk-avatar-status-online, var(--fk-color-success, #10b981))}:host.fk-avatar--status-offline .fk-avatar__status{background-color:var(--fk-avatar-status-offline, var(--fk-color-muted, #8a98a8))}:host.fk-avatar--status-away .fk-avatar__status{background-color:var(--fk-avatar-status-away, var(--fk-color-warning, #f59e0b))}:host.fk-avatar--status-busy .fk-avatar__status{background-color:var(--fk-avatar-status-busy, var(--fk-color-danger, #e02424))}\n"] }]
|
|
68
|
+
}], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], avatarUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarUrl", required: false }] }], initials: [{ type: i0.Input, args: [{ isSignal: true, alias: "initials", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], showStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "showStatus", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hostClass: [{
|
|
69
|
+
type: HostBinding,
|
|
70
|
+
args: ['class']
|
|
71
|
+
}], hostId: [{
|
|
72
|
+
type: HostBinding,
|
|
73
|
+
args: ['attr.id']
|
|
74
|
+
}] } });
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Generated bundle index. Do not edit.
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
export { AvatarComponent };
|
|
81
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-avatar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-avatar.mjs","sources":["../../../../packages/ui-ng/ui/avatar/avatar.component.ts","../../../../packages/ui-ng/ui/avatar/avatar.component.html","../../../../packages/ui-ng/ui/avatar/frame-kit-ui-ng-ui-avatar.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport type { AvatarSize, AvatarStatus } from './avatar.types';\n\n@Component({\n selector: 'fk-avatar',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './avatar.component.html',\n styleUrl: './avatar.component.scss',\n})\nexport class AvatarComponent {\n // ===== IDENTITY =====\n /** Full display name used to derive initials when no explicit initials or image are provided. */\n readonly name = input.required<string>();\n /** URL of the avatar image; falls back to initials when the image fails to load. */\n readonly avatarUrl = input<string | null>(null);\n /** Explicit two-character initials that override the name-derived fallback. */\n readonly initials = input<string | null>(null);\n\n // ===== STATUS =====\n /** Online/offline/away status to reflect on the indicator dot. */\n readonly status = input<AvatarStatus | null>(null);\n /** When true, renders the status indicator dot over the avatar. */\n readonly showStatus = input<boolean>(false);\n\n // ===== DISPLAY =====\n /** Controls the avatar size. */\n readonly size = input<AvatarSize>('md');\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n\n readonly derivedInitials = computed(() => {\n const explicit = this.initials();\n\n if (explicit) {\n return explicit;\n }\n\n const name = this.name();\n\n if (!name) {\n return '?';\n }\n\n const parts = name.trim().split(/\\s+/);\n\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n return parts[0].substring(0, 2).toUpperCase();\n });\n\n readonly showIndicator = computed(\n () => this.showStatus() && this.status() !== null,\n );\n\n readonly classes = computed(() => {\n return [\n 'fk-avatar',\n `fk-avatar--${this.size()}`,\n this.showIndicator() ? `fk-avatar--status-${this.status()}` : '',\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(): string | null {\n return this.id();\n }\n\n // Tracks whether the image failed to load\n readonly imgError = { value: false };\n\n onImgError(): void {\n this.imgError.value = true;\n }\n}\n","<!-- Avatar circle -->\n<span\n class=\"fk-avatar__circle\"\n [attr.aria-label]=\"ariaLabel() ?? 'Avatar for ' + name()\"\n role=\"img\"\n>\n @if (avatarUrl() && !imgError.value) {\n <img\n class=\"fk-avatar__image\"\n [src]=\"avatarUrl()\"\n [alt]=\"name()\"\n (error)=\"onImgError()\"\n />\n } @else {\n <span class=\"fk-avatar__initials\" aria-hidden=\"true\">\n {{ derivedInitials() }}\n </span>\n }\n</span>\n\n<!-- Status indicator -->\n@if (showIndicator()) {\n <span\n class=\"fk-avatar__status\"\n [attr.aria-label]=\"status() + ' status'\"\n role=\"status\"\n ></span>\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
|
+
|
|
4
|
+
class BadgeComponent {
|
|
5
|
+
// ===== INPUTS =====
|
|
6
|
+
/** Visual style variant that drives the badge color scheme. */
|
|
7
|
+
variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
8
|
+
/** Override the text color as a CSS value. */
|
|
9
|
+
color = input(null, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
10
|
+
/** Override the background color as a CSS value. */
|
|
11
|
+
backgroundColor = input(null, ...(ngDevMode ? [{ debugName: "backgroundColor" }] : /* istanbul ignore next */ []));
|
|
12
|
+
/** Override the border color as a CSS value; renders as a 1px solid border. */
|
|
13
|
+
borderColor = input(null, ...(ngDevMode ? [{ debugName: "borderColor" }] : /* istanbul ignore next */ []));
|
|
14
|
+
/** Custom padding shorthand applied to all sides. */
|
|
15
|
+
padding = input(null, ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
|
|
16
|
+
/** Custom inline (left/right) padding applied independently. */
|
|
17
|
+
paddingInline = input(null, ...(ngDevMode ? [{ debugName: "paddingInline" }] : /* 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
|
+
ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
22
|
+
// ===== COMPUTED =====
|
|
23
|
+
classes = computed(() => {
|
|
24
|
+
return ['fk-badge', `fk-badge--${this.variant()}`, this.className()]
|
|
25
|
+
.filter(Boolean)
|
|
26
|
+
.join(' ');
|
|
27
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
28
|
+
get hostClass() {
|
|
29
|
+
return this.classes();
|
|
30
|
+
}
|
|
31
|
+
get hostColor() {
|
|
32
|
+
return this.color();
|
|
33
|
+
}
|
|
34
|
+
get hostBackgroundColor() {
|
|
35
|
+
return this.backgroundColor();
|
|
36
|
+
}
|
|
37
|
+
get hostBorder() {
|
|
38
|
+
const bc = this.borderColor();
|
|
39
|
+
if (!bc) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return `1px solid ${bc}`;
|
|
43
|
+
}
|
|
44
|
+
get hostPadding() {
|
|
45
|
+
return this.padding();
|
|
46
|
+
}
|
|
47
|
+
get hostPaddingInline() {
|
|
48
|
+
return this.paddingInline();
|
|
49
|
+
}
|
|
50
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: BadgeComponent, isStandalone: true, selector: "fk-badge", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, backgroundColor: { classPropertyName: "backgroundColor", publicName: "backgroundColor", isSignal: true, isRequired: false, transformFunction: null }, borderColor: { classPropertyName: "borderColor", publicName: "borderColor", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, paddingInline: { classPropertyName: "paddingInline", publicName: "paddingInline", 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 }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "style.color": "this.hostColor", "style.background-color": "this.hostBackgroundColor", "style.border": "this.hostBorder", "style.padding": "this.hostPadding", "style.padding-inline": "this.hostPaddingInline" } }, ngImport: i0, template: "<span [id]=\"id() ?? undefined\" [attr.aria-label]=\"ariaLabel()\"\n ><ng-content\n/></span>\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;height:var(--fk-badge-height, 1.5rem);border-radius:var(--fk-badge-border-radius, 999px);padding-inline:var(--fk-badge-padding-inline, .5rem);font-size:var(--fk-badge-font-size, .75rem);font-weight:var(--fk-badge-font-weight, var(--fk-font-weight-medium, 500));line-height:1;white-space:nowrap;vertical-align:middle}:host.fk-badge--default{background-color:var(--fk-badge-default-bg, var(--fk-color-surface-muted, #f7f9fb));color:var(--fk-badge-default-color, var(--fk-color-text, #1f2d3d))}:host.fk-badge--primary{background-color:var(--fk-badge-primary-bg, var(--fk-color-primary-subtle, #e8f4ff));color:var(--fk-badge-primary-color, var(--fk-color-primary, #0a84ff))}:host.fk-badge--success{background-color:var(--fk-badge-success-bg, var(--fk-color-success-subtle, #e6f9ed));color:var(--fk-badge-success-color, var(--fk-color-success, #16a34a))}:host.fk-badge--warning{background-color:var(--fk-badge-warning-bg, var(--fk-color-warning-subtle, #fff8e6));color:var(--fk-badge-warning-color, var(--fk-color-warning, #d97706))}:host.fk-badge--danger{background-color:var(--fk-badge-danger-bg, var(--fk-color-danger-subtle, #fde8e8));color:var(--fk-badge-danger-color, var(--fk-color-danger, #e02424))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
52
|
+
}
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BadgeComponent, decorators: [{
|
|
54
|
+
type: Component,
|
|
55
|
+
args: [{ selector: 'fk-badge', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span [id]=\"id() ?? undefined\" [attr.aria-label]=\"ariaLabel()\"\n ><ng-content\n/></span>\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;height:var(--fk-badge-height, 1.5rem);border-radius:var(--fk-badge-border-radius, 999px);padding-inline:var(--fk-badge-padding-inline, .5rem);font-size:var(--fk-badge-font-size, .75rem);font-weight:var(--fk-badge-font-weight, var(--fk-font-weight-medium, 500));line-height:1;white-space:nowrap;vertical-align:middle}:host.fk-badge--default{background-color:var(--fk-badge-default-bg, var(--fk-color-surface-muted, #f7f9fb));color:var(--fk-badge-default-color, var(--fk-color-text, #1f2d3d))}:host.fk-badge--primary{background-color:var(--fk-badge-primary-bg, var(--fk-color-primary-subtle, #e8f4ff));color:var(--fk-badge-primary-color, var(--fk-color-primary, #0a84ff))}:host.fk-badge--success{background-color:var(--fk-badge-success-bg, var(--fk-color-success-subtle, #e6f9ed));color:var(--fk-badge-success-color, var(--fk-color-success, #16a34a))}:host.fk-badge--warning{background-color:var(--fk-badge-warning-bg, var(--fk-color-warning-subtle, #fff8e6));color:var(--fk-badge-warning-color, var(--fk-color-warning, #d97706))}:host.fk-badge--danger{background-color:var(--fk-badge-danger-bg, var(--fk-color-danger-subtle, #fde8e8));color:var(--fk-badge-danger-color, var(--fk-color-danger, #e02424))}\n"] }]
|
|
56
|
+
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], backgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundColor", required: false }] }], borderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderColor", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], paddingInline: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingInline", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hostClass: [{
|
|
57
|
+
type: HostBinding,
|
|
58
|
+
args: ['class']
|
|
59
|
+
}], hostColor: [{
|
|
60
|
+
type: HostBinding,
|
|
61
|
+
args: ['style.color']
|
|
62
|
+
}], hostBackgroundColor: [{
|
|
63
|
+
type: HostBinding,
|
|
64
|
+
args: ['style.background-color']
|
|
65
|
+
}], hostBorder: [{
|
|
66
|
+
type: HostBinding,
|
|
67
|
+
args: ['style.border']
|
|
68
|
+
}], hostPadding: [{
|
|
69
|
+
type: HostBinding,
|
|
70
|
+
args: ['style.padding']
|
|
71
|
+
}], hostPaddingInline: [{
|
|
72
|
+
type: HostBinding,
|
|
73
|
+
args: ['style.padding-inline']
|
|
74
|
+
}] } });
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Generated bundle index. Do not edit.
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
export { BadgeComponent };
|
|
81
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-badge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-badge.mjs","sources":["../../../../packages/ui-ng/ui/badge/badge.component.ts","../../../../packages/ui-ng/ui/badge/badge.component.html","../../../../packages/ui-ng/ui/badge/frame-kit-ui-ng-ui-badge.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport type { BadgeVariant } from './badge.types';\n\n@Component({\n selector: 'fk-badge',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './badge.component.scss',\n templateUrl: './badge.component.html',\n})\nexport class BadgeComponent {\n // ===== INPUTS =====\n /** Visual style variant that drives the badge color scheme. */\n readonly variant = input<BadgeVariant>('default');\n /** Override the text color as a CSS value. */\n readonly color = input<string | null>(null);\n /** Override the background color as a CSS value. */\n readonly backgroundColor = input<string | null>(null);\n /** Override the border color as a CSS value; renders as a 1px solid border. */\n readonly borderColor = input<string | null>(null);\n /** Custom padding shorthand applied to all sides. */\n readonly padding = input<string | null>(null);\n /** Custom inline (left/right) padding applied independently. */\n readonly paddingInline = input<string | null>(null);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly id = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-badge', `fk-badge--${this.variant()}`, this.className()]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('style.color')\n get hostColor() {\n return this.color();\n }\n\n @HostBinding('style.background-color')\n get hostBackgroundColor() {\n return this.backgroundColor();\n }\n\n @HostBinding('style.border')\n get hostBorder() {\n const bc = this.borderColor();\n\n if (!bc) {\n return null;\n }\n\n return `1px solid ${bc}`;\n }\n\n @HostBinding('style.padding')\n get hostPadding() {\n return this.padding();\n }\n\n @HostBinding('style.padding-inline')\n get hostPaddingInline() {\n return this.paddingInline();\n }\n}\n","<span [id]=\"id() ?? undefined\" [attr.aria-label]=\"ariaLabel()\"\n ><ng-content\n/></span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MAkBa,cAAc,CAAA;;;AAGhB,IAAA,OAAO,GAAG,KAAK,CAAe,SAAS,8EAAC;;AAExC,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,4EAAC;;AAElC,IAAA,eAAe,GAAG,KAAK,CAAgB,IAAI,sFAAC;;AAE5C,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;;AAExC,IAAA,OAAO,GAAG,KAAK,CAAgB,IAAI,8EAAC;;AAEpC,IAAA,aAAa,GAAG,KAAK,CAAgB,IAAI,oFAAC;;AAG1C,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;AAC7B,IAAA,EAAE,GAAG,KAAK,CAAgB,IAAI,yEAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,gFAAC;;AAGtC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,OAAO,CAAC,UAAU,EAAE,CAAA,UAAA,EAAa,IAAI,CAAC,OAAO,EAAE,CAAA,CAAE,EAAE,IAAI,CAAC,SAAS,EAAE;aAChE,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,8EAAC;AAEF,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;AAEA,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACrB;AAEA,IAAA,IACI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;IAC/B;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QAE7B,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,CAAA,UAAA,EAAa,EAAE,CAAA,CAAE;IAC1B;AAEA,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;AAEA,IAAA,IACI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE;IAC7B;uGA7DW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,i/CClB3B,iGAGA,EAAA,MAAA,EAAA,CAAA,0vCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDea,cAAc,EAAA,UAAA,EAAA,CAAA;kBAR1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EACM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,iGAAA,EAAA,MAAA,EAAA,CAAA,0vCAAA,CAAA,EAAA;;sBA+B9C,WAAW;uBAAC,OAAO;;sBAKnB,WAAW;uBAAC,aAAa;;sBAKzB,WAAW;uBAAC,wBAAwB;;sBAKpC,WAAW;uBAAC,cAAc;;sBAW1B,WAAW;uBAAC,eAAe;;sBAK3B,WAAW;uBAAC,sBAAsB;;;AE5ErC;;AAEG;;;;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, contentChild, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { RouterLink } from '@angular/router';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generic route-driven breadcrumb.
|
|
8
|
+
*
|
|
9
|
+
* Consumers pass an ordered list of crumbs — the final crumb is always the
|
|
10
|
+
* "current location" (rendered as plain text with `aria-current="page"`),
|
|
11
|
+
* every earlier crumb with a `routerLink` renders as an `<a [routerLink]>`
|
|
12
|
+
* and navigates via the Angular router. Earlier crumbs without a
|
|
13
|
+
* `routerLink` render as plain text so consumers can include
|
|
14
|
+
* non-navigable ancestors (e.g. a section header) when needed.
|
|
15
|
+
*
|
|
16
|
+
* The chevron separator between crumbs ships as an inline SVG so the
|
|
17
|
+
* component renders correctly with no consumer setup. Consumers can
|
|
18
|
+
* replace the separator by projecting an `<ng-template #fkBreadcrumbSeparator>`
|
|
19
|
+
* with any content — the template is instantiated once per gap between
|
|
20
|
+
* crumbs.
|
|
21
|
+
*
|
|
22
|
+
* For breadcrumbs that reflect a tree/hierarchy selection (e.g. org nodes),
|
|
23
|
+
* use `fk-node-tree-breadcrumb` instead — that component walks a `TreeNode`
|
|
24
|
+
* array by `parentId` and emits node-select events rather than navigating.
|
|
25
|
+
*/
|
|
26
|
+
class BreadcrumbComponent {
|
|
27
|
+
// ===== INPUTS =====
|
|
28
|
+
/** Ordered list of crumb items; the last item is always treated as the current page. */
|
|
29
|
+
items = input.required(...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
30
|
+
// ===== BASE PROPS =====
|
|
31
|
+
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
32
|
+
ariaLabel = input('Breadcrumb', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
33
|
+
// ===== CONTENT CHILDREN =====
|
|
34
|
+
separatorRef = contentChild('fkBreadcrumbSeparator', ...(ngDevMode ? [{ debugName: "separatorRef" }] : /* istanbul ignore next */ []));
|
|
35
|
+
// ===== COMPUTED =====
|
|
36
|
+
classes = computed(() => {
|
|
37
|
+
return ['fk-breadcrumb', this.className()].filter(Boolean).join(' ');
|
|
38
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
39
|
+
get hostClass() {
|
|
40
|
+
return this.classes();
|
|
41
|
+
}
|
|
42
|
+
role = 'navigation';
|
|
43
|
+
get hostAriaLabel() {
|
|
44
|
+
return this.ariaLabel();
|
|
45
|
+
}
|
|
46
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
47
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: BreadcrumbComponent, isStandalone: true, selector: "fk-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "attr.role": "this.role", "attr.aria-label": "this.hostAriaLabel" } }, queries: [{ propertyName: "separatorRef", first: true, predicate: ["fkBreadcrumbSeparator"], descendants: true, isSignal: true }], ngImport: i0, template: "<ol class=\"fk-breadcrumb__list\">\n @for (crumb of items(); track $index; let last = $last) {\n <li class=\"fk-breadcrumb__item\">\n @if (last) {\n <span class=\"fk-breadcrumb__current\" aria-current=\"page\">\n {{ crumb.label }}\n </span>\n } @else {\n @if (crumb.routerLink) {\n <a class=\"fk-breadcrumb__link\" [routerLink]=\"crumb.routerLink\">\n {{ crumb.label }}\n </a>\n } @else {\n <span class=\"fk-breadcrumb__text\">{{ crumb.label }}</span>\n }\n\n <span class=\"fk-breadcrumb__separator\" aria-hidden=\"true\">\n @if (separatorRef(); as tmpl) {\n <ng-container *ngTemplateOutlet=\"tmpl\" />\n } @else {\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 </span>\n }\n </li>\n }\n</ol>\n", styles: [".fk-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;gap:var(--fk-breadcrumb-gap, var(--fk-rhythm-1, .25rem));margin:0;padding:0;list-style:none;font-size:var(--fk-breadcrumb-font-size, var(--fk-typography-caption-font-size, .75rem));line-height:1.5}.fk-breadcrumb__item{display:flex;align-items:center;gap:var(--fk-breadcrumb-gap, var(--fk-rhythm-1, .25rem))}.fk-breadcrumb__link{display:inline-flex;align-items:center;color:var(--fk-breadcrumb-link-color, var(--fk-color-muted, #64748b));text-decoration:none;cursor:pointer}.fk-breadcrumb__link:hover{color:var(--fk-breadcrumb-link-color-hover, var(--fk-color-text, #1f2d3d));text-decoration:underline}.fk-breadcrumb__link:focus-visible{outline:none;box-shadow:var(--fk-focus-ring, 0 0 0 3px rgba(10, 132, 255, .18));border-radius:var(--fk-radius-sm, .25rem)}.fk-breadcrumb__text{display:inline-flex;align-items:center;color:var(--fk-breadcrumb-link-color, var(--fk-color-muted, #64748b))}.fk-breadcrumb__current{display:inline-flex;align-items:center;color:var(--fk-breadcrumb-current-color, var(--fk-color-text, #1f2d3d));font-weight:var(--fk-breadcrumb-current-font-weight, var(--fk-font-weight-medium, 500))}.fk-breadcrumb__separator{display:flex;align-items:center;color:var(--fk-breadcrumb-separator-color, var(--fk-color-muted, #64748b));-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
48
|
+
}
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BreadcrumbComponent, decorators: [{
|
|
50
|
+
type: Component,
|
|
51
|
+
args: [{ selector: 'fk-breadcrumb', standalone: true, imports: [NgTemplateOutlet, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ol class=\"fk-breadcrumb__list\">\n @for (crumb of items(); track $index; let last = $last) {\n <li class=\"fk-breadcrumb__item\">\n @if (last) {\n <span class=\"fk-breadcrumb__current\" aria-current=\"page\">\n {{ crumb.label }}\n </span>\n } @else {\n @if (crumb.routerLink) {\n <a class=\"fk-breadcrumb__link\" [routerLink]=\"crumb.routerLink\">\n {{ crumb.label }}\n </a>\n } @else {\n <span class=\"fk-breadcrumb__text\">{{ crumb.label }}</span>\n }\n\n <span class=\"fk-breadcrumb__separator\" aria-hidden=\"true\">\n @if (separatorRef(); as tmpl) {\n <ng-container *ngTemplateOutlet=\"tmpl\" />\n } @else {\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 </span>\n }\n </li>\n }\n</ol>\n", styles: [".fk-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;gap:var(--fk-breadcrumb-gap, var(--fk-rhythm-1, .25rem));margin:0;padding:0;list-style:none;font-size:var(--fk-breadcrumb-font-size, var(--fk-typography-caption-font-size, .75rem));line-height:1.5}.fk-breadcrumb__item{display:flex;align-items:center;gap:var(--fk-breadcrumb-gap, var(--fk-rhythm-1, .25rem))}.fk-breadcrumb__link{display:inline-flex;align-items:center;color:var(--fk-breadcrumb-link-color, var(--fk-color-muted, #64748b));text-decoration:none;cursor:pointer}.fk-breadcrumb__link:hover{color:var(--fk-breadcrumb-link-color-hover, var(--fk-color-text, #1f2d3d));text-decoration:underline}.fk-breadcrumb__link:focus-visible{outline:none;box-shadow:var(--fk-focus-ring, 0 0 0 3px rgba(10, 132, 255, .18));border-radius:var(--fk-radius-sm, .25rem)}.fk-breadcrumb__text{display:inline-flex;align-items:center;color:var(--fk-breadcrumb-link-color, var(--fk-color-muted, #64748b))}.fk-breadcrumb__current{display:inline-flex;align-items:center;color:var(--fk-breadcrumb-current-color, var(--fk-color-text, #1f2d3d));font-weight:var(--fk-breadcrumb-current-font-weight, var(--fk-font-weight-medium, 500))}.fk-breadcrumb__separator{display:flex;align-items:center;color:var(--fk-breadcrumb-separator-color, var(--fk-color-muted, #64748b));-webkit-user-select:none;user-select:none}\n"] }]
|
|
52
|
+
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], separatorRef: [{ type: i0.ContentChild, args: ['fkBreadcrumbSeparator', { isSignal: true }] }], hostClass: [{
|
|
53
|
+
type: HostBinding,
|
|
54
|
+
args: ['class']
|
|
55
|
+
}], role: [{
|
|
56
|
+
type: HostBinding,
|
|
57
|
+
args: ['attr.role']
|
|
58
|
+
}], hostAriaLabel: [{
|
|
59
|
+
type: HostBinding,
|
|
60
|
+
args: ['attr.aria-label']
|
|
61
|
+
}] } });
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Generated bundle index. Do not edit.
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
export { BreadcrumbComponent };
|
|
68
|
+
//# sourceMappingURL=frame-kit-ui-ng-ui-breadcrumb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-kit-ui-ng-ui-breadcrumb.mjs","sources":["../../../../packages/ui-ng/ui/breadcrumb/breadcrumb.component.ts","../../../../packages/ui-ng/ui/breadcrumb/breadcrumb.component.html","../../../../packages/ui-ng/ui/breadcrumb/frame-kit-ui-ng-ui-breadcrumb.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n HostBinding,\n input,\n TemplateRef,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nimport type { BreadcrumbItem } from './breadcrumb.types';\n\n/**\n * Generic route-driven breadcrumb.\n *\n * Consumers pass an ordered list of crumbs — the final crumb is always the\n * \"current location\" (rendered as plain text with `aria-current=\"page\"`),\n * every earlier crumb with a `routerLink` renders as an `<a [routerLink]>`\n * and navigates via the Angular router. Earlier crumbs without a\n * `routerLink` render as plain text so consumers can include\n * non-navigable ancestors (e.g. a section header) when needed.\n *\n * The chevron separator between crumbs ships as an inline SVG so the\n * component renders correctly with no consumer setup. Consumers can\n * replace the separator by projecting an `<ng-template #fkBreadcrumbSeparator>`\n * with any content — the template is instantiated once per gap between\n * crumbs.\n *\n * For breadcrumbs that reflect a tree/hierarchy selection (e.g. org nodes),\n * use `fk-node-tree-breadcrumb` instead — that component walks a `TreeNode`\n * array by `parentId` and emits node-select events rather than navigating.\n */\n@Component({\n selector: 'fk-breadcrumb',\n standalone: true,\n imports: [NgTemplateOutlet, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.scss',\n})\nexport class BreadcrumbComponent {\n // ===== INPUTS =====\n /** Ordered list of crumb items; the last item is always treated as the current page. */\n readonly items = input.required<readonly BreadcrumbItem[]>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n readonly ariaLabel = input<string>('Breadcrumb');\n\n // ===== CONTENT CHILDREN =====\n readonly separatorRef = contentChild<TemplateRef<unknown>>(\n 'fkBreadcrumbSeparator',\n );\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return ['fk-breadcrumb', 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 = 'navigation';\n\n @HostBinding('attr.aria-label')\n get hostAriaLabel(): string {\n return this.ariaLabel();\n }\n}\n","<ol class=\"fk-breadcrumb__list\">\n @for (crumb of items(); track $index; let last = $last) {\n <li class=\"fk-breadcrumb__item\">\n @if (last) {\n <span class=\"fk-breadcrumb__current\" aria-current=\"page\">\n {{ crumb.label }}\n </span>\n } @else {\n @if (crumb.routerLink) {\n <a class=\"fk-breadcrumb__link\" [routerLink]=\"crumb.routerLink\">\n {{ crumb.label }}\n </a>\n } @else {\n <span class=\"fk-breadcrumb__text\">{{ crumb.label }}</span>\n }\n\n <span class=\"fk-breadcrumb__separator\" aria-hidden=\"true\">\n @if (separatorRef(); as tmpl) {\n <ng-container *ngTemplateOutlet=\"tmpl\" />\n } @else {\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 </span>\n }\n </li>\n }\n</ol>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|