@ngstarter-ui/components 21.0.25 → 21.0.26

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.
@@ -6225,6 +6225,7 @@
6225
6225
  "exportedSymbols": [
6226
6226
  "Notification",
6227
6227
  "NotificationActor",
6228
+ "NotificationActorLike",
6228
6229
  "NotificationAvatarDirective",
6229
6230
  "NotificationContent",
6230
6231
  "NotificationControlsDefDirective",
@@ -6242,12 +6243,15 @@
6242
6243
  "notifications",
6243
6244
  "static"
6244
6245
  ],
6245
- "outputs": [],
6246
+ "outputs": [
6247
+ "notificationClick"
6248
+ ],
6246
6249
  "cssTokens": [
6247
6250
  "--ngs-color-neutral-900",
6248
6251
  "--ngs-color-neutral-950",
6249
6252
  "--ngs-color-on-surface",
6250
6253
  "--ngs-color-on-surface-variant",
6254
+ "--ngs-color-primary",
6251
6255
  "--ngs-color-surface-container",
6252
6256
  "--ngs-color-surface-container-low",
6253
6257
  "--ngs-color-surface-container-lowest",
@@ -6261,7 +6265,8 @@
6261
6265
  "--ngs-notification-is-unread-hover-bg",
6262
6266
  "--ngs-notification-list-gap",
6263
6267
  "--ngs-notification-padding",
6264
- "--ngs-notification-radius"
6268
+ "--ngs-notification-radius",
6269
+ "--ngs-radius-xl"
6265
6270
  ],
6266
6271
  "example": null
6267
6272
  },
@@ -10001,21 +10006,30 @@
10001
10006
  "useWhen": "Use ngs-tree when users need to inspect or navigate hierarchical data where parent and child levels matter: folders and files, categories, permissions, taxonomies, organization structures, nested settings, product/entity hierarchies, and other expandable trees. Use dataSource with childrenAccessor for nested/static data, or treeControl with a custom DataSource for flat trees and dynamic loading. Define node templates with *ngsTreeNodeDef and use when for different node types. Use ngsTreeNodePadding for indentation and ngsTreeNodeToggle for expand/collapse controls. Use ProgressBar or Skeleton inside node templates when children load on demand. Do not use Tree for a simple vertical collection; use List. Do not use it for primary application navigation; use Sidebar, Sidenav, Navigation, or RailNav. Do not use it for FAQ or settings sections; use ExpansionPanel. Do not use it for dense row data with columns, sorting, filters, or bulk actions; use Table or DataView. Do not use it for step-by-step workflows; use Stepper.",
10002
10007
  "exampleTopics": [
10003
10008
  "Basic tree",
10009
+ "Selectable tree",
10010
+ "Checkable tree",
10011
+ "Draggable tree",
10004
10012
  "Tree with dynamic data"
10005
10013
  ],
10006
- "minimalExample": "<ngs-tree #tree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\n <!-- This is the tree node template for leaf nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n <!-- use a disabled button to provide padding for tree leaf -->\n <button ngsIconButton disabled></button>\n {{node.name}}\n </ngs-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node;when: hasChild\"\n ngsTreeNodePadding ngsTreeNodeToggle\n [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n @if (tree.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.name}}\n </ngs-tree-node>\n</ngs-tree>",
10014
+ "minimalExample": "<ngs-tree #tree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\n <!-- This is the tree node template for leaf nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n <!-- use a disabled button to provide padding for tree leaf -->\n <button ngsIconButton disabled></button>\n {{node.name}}\n </ngs-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node;when: hasChild\"\n ngsTreeNodePadding\n [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n @if (tree.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.name}}\n </ngs-tree-node>\n</ngs-tree>",
10007
10015
  "exampleFiles": [
10008
10016
  {
10009
10017
  "name": "basic-tree-example",
10010
10018
  "title": "Basic tree",
10011
10019
  "file": "projects/docs/src/app/components/tree/_examples/basic-tree-example/basic-tree-example.html",
10012
- "source": "<ngs-tree #tree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\n <!-- This is the tree node template for leaf nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n <!-- use a disabled button to provide padding for tree leaf -->\n <button ngsIconButton disabled></button>\n {{node.name}}\n </ngs-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node;when: hasChild\"\n ngsTreeNodePadding ngsTreeNodeToggle\n [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n @if (tree.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.name}}\n </ngs-tree-node>\n</ngs-tree>"
10020
+ "source": "<ngs-tree #tree [dataSource]=\"dataSource\" [childrenAccessor]=\"childrenAccessor\">\n <!-- This is the tree node template for leaf nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n <!-- use a disabled button to provide padding for tree leaf -->\n <button ngsIconButton disabled></button>\n {{node.name}}\n </ngs-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <ngs-tree-node *ngsTreeNodeDef=\"let node;when: hasChild\"\n ngsTreeNodePadding\n [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n @if (tree.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.name}}\n </ngs-tree-node>\n</ngs-tree>"
10021
+ },
10022
+ {
10023
+ "name": "checkable-tree-example",
10024
+ "title": "Checkable tree",
10025
+ "file": "projects/docs/src/app/components/tree/_examples/checkable-tree-example/checkable-tree-example.html",
10026
+ "source": "<ngs-tree #tree\n [dataSource]=\"dataSource\"\n [childrenAccessor]=\"childrenAccessor\"\n [trackBy]=\"trackByName\"\n (checkedChange)=\"checkedValues = $event\"\n checkable>\n <ngs-tree-node *ngsTreeNodeDef=\"let node\"\n ngsTreeNodePadding\n [value]=\"node.name\"\n [disabled]=\"!!node.disabled\">\n <button ngsIconButton disabled></button>\n {{node.name}}\n </ngs-tree-node>\n <ngs-tree-node *ngsTreeNodeDef=\"let node; when: hasChild\"\n ngsTreeNodePadding\n [value]=\"node.name\"\n [disabled]=\"!!node.disabled\"\n [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n @if (tree.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.name}}\n </ngs-tree-node>\n</ngs-tree>\n<p class=\"tree-example-state\">\n Checked: {{checkedValues.length ? checkedValues.join(', ') : 'None'}}\n</p>"
10013
10027
  },
10014
10028
  {
10015
- "name": "tree-with-dynamic-data-example",
10016
- "title": "Tree with dynamic data",
10017
- "file": "projects/docs/src/app/components/tree/_examples/tree-with-dynamic-data-example/tree-with-dynamic-data-example.html",
10018
- "source": "<ngs-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding>\n <button ngsIconButton disabled></button>\n {{node.item}}\n </ngs-tree-node>\n <ngs-tree-node *ngsTreeNodeDef=\"let node; when: hasChild\" ngsTreeNodePadding ngsTreeNodeToggle\n [cdkTreeNodeTypeaheadLabel]=\"node.item\">\n <button ngsIconButton\n [attr.aria-label]=\"'Toggle ' + node.item\" ngsTreeNodeToggle>\n @if (treeControl.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.item}}\n @if (node.isLoading()) {\n <ngs-progress-bar mode=\"indeterminate\" class=\"ms-3\"/>\n }\n </ngs-tree-node>\n</ngs-tree>"
10029
+ "name": "draggable-tree-example",
10030
+ "title": "Draggable tree",
10031
+ "file": "projects/docs/src/app/components/tree/_examples/draggable-tree-example/draggable-tree-example.html",
10032
+ "source": "<ngs-tree #tree\n [dataSource]=\"dataSource\"\n [childrenAccessor]=\"childrenAccessor\"\n [trackBy]=\"trackByName\"\n (nodeDrop)=\"onNodeDrop($event)\"\n draggable>\n <ngs-tree-node *ngsTreeNodeDef=\"let node\" ngsTreeNodePadding [value]=\"node.name\">\n <button ngsIconButton disabled></button>\n {{node.name}}\n </ngs-tree-node>\n <ngs-tree-node *ngsTreeNodeDef=\"let node; when: hasChild\"\n ngsTreeNodePadding\n [value]=\"node.name\"\n [cdkTreeNodeTypeaheadLabel]=\"node.name\">\n <button ngsIconButton ngsTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.name\">\n @if (tree.isExpanded(node)) {\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"size-4\"/>\n } @else {\n <ngs-icon name=\"fluent:chevron-right-24-regular\" class=\"size-4\"/>\n }\n </button>\n {{node.name}}\n </ngs-tree-node>\n</ngs-tree>\n<p class=\"tree-example-state\">\n {{dropMessage}}\n</p>"
10019
10033
  }
10020
10034
  ],
10021
10035
  "previewAsset": "projects/components/tree/preview.svg",
@@ -10033,12 +10047,17 @@
10033
10047
  "Tree",
10034
10048
  "TreeNode",
10035
10049
  "TreeNodeDef",
10050
+ "TreeNodeDrop",
10051
+ "TreeNodeDropPosition",
10036
10052
  "TreeNodeOutlet",
10037
10053
  "TreeNodePadding",
10038
10054
  "TreeNodeToggle"
10039
10055
  ],
10040
10056
  "inputs": [
10057
+ "checkable",
10058
+ "childrenKey",
10041
10059
  "disabled",
10060
+ "draggable",
10042
10061
  "ngsNestedTreeNode",
10043
10062
  "ngsTreeNode",
10044
10063
  "ngsTreeNodeDefWhen",
@@ -10046,20 +10065,55 @@
10046
10065
  "ngsTreeNodePaddingIndent",
10047
10066
  "ngsTreeNodeToggleRecursive",
10048
10067
  "recursive",
10068
+ "selectable",
10049
10069
  "tabIndex",
10070
+ "value",
10050
10071
  "when"
10051
10072
  ],
10052
10073
  "outputs": [
10053
10074
  "activation",
10054
- "expandedChange"
10075
+ "checkedChange",
10076
+ "expandedChange",
10077
+ "selectedChange"
10055
10078
  ],
10056
10079
  "cssTokens": [
10080
+ "--ngs-checkbox-gap",
10081
+ "--ngs-color-neutral",
10082
+ "--ngs-color-primary",
10083
+ "--ngs-nav-item-active-bg",
10084
+ "--ngs-nav-item-active-color",
10085
+ "--ngs-nav-item-color",
10086
+ "--ngs-nav-item-font-size",
10087
+ "--ngs-nav-item-gap",
10088
+ "--ngs-nav-item-height",
10089
+ "--ngs-nav-item-hover-bg",
10090
+ "--ngs-nav-item-hover-color",
10091
+ "--ngs-nav-item-padding",
10092
+ "--ngs-nav-item-radius",
10057
10093
  "--ngs-tree-container-background-color",
10094
+ "--ngs-tree-gap",
10095
+ "--ngs-tree-node-active-bg",
10096
+ "--ngs-tree-node-active-color",
10097
+ "--ngs-tree-node-checkbox-gap",
10098
+ "--ngs-tree-node-color",
10099
+ "--ngs-tree-node-disabled-opacity",
10100
+ "--ngs-tree-node-drop-line-color",
10101
+ "--ngs-tree-node-drop-line-radius",
10102
+ "--ngs-tree-node-drop-line-size",
10103
+ "--ngs-tree-node-drop-target-bg",
10104
+ "--ngs-tree-node-drop-target-color",
10105
+ "--ngs-tree-node-drop-target-outline",
10106
+ "--ngs-tree-node-drop-target-outline-offset",
10107
+ "--ngs-tree-node-font-size",
10108
+ "--ngs-tree-node-gap",
10109
+ "--ngs-tree-node-hover-bg",
10110
+ "--ngs-tree-node-hover-color",
10111
+ "--ngs-tree-node-line-color",
10058
10112
  "--ngs-tree-node-min-height",
10059
- "--ngs-tree-node-text-color",
10060
- "--ngs-tree-node-text-font",
10061
- "--ngs-tree-node-text-size",
10062
- "--ngs-tree-node-text-weight"
10113
+ "--ngs-tree-node-padding",
10114
+ "--ngs-tree-node-radius",
10115
+ "--ngs-tree-node-title-font-size",
10116
+ "--ngs-tree-padding"
10063
10117
  ],
10064
10118
  "example": null
10065
10119
  },
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, TemplateRef, input, Directive, contentChildren, contentChild, booleanAttribute, Component, ElementRef } from '@angular/core';
2
+ import { inject, TemplateRef, input, Directive, contentChildren, contentChild, booleanAttribute, output, computed, ChangeDetectionStrategy, Component, ElementRef } from '@angular/core';
3
3
  import { NgTemplateOutlet } from '@angular/common';
4
4
  import { Skeleton } from '@ngstarter-ui/components/skeleton';
5
5
 
@@ -34,35 +34,62 @@ class NotificationList {
34
34
  controlsDef = contentChild(NotificationControlsDefDirective, ...(ngDevMode ? [{ debugName: "controlsDef" }] : /* istanbul ignore next */ []));
35
35
  notifications = input([], ...(ngDevMode ? [{ debugName: "notifications" }] : /* istanbul ignore next */ []));
36
36
  static = input(true, { ...(ngDevMode ? { debugName: "static" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
37
- _initialized = false;
38
- _defsMap = new Map();
39
- get controlsTpl() {
40
- return this.controlsDef()?.templateRef;
41
- }
42
- ngAfterContentInit() {
37
+ notificationClick = output();
38
+ _initialized = true;
39
+ _defsMap = computed(() => {
40
+ const defsMap = new Map();
43
41
  this.defs().forEach((def) => {
44
- this._defsMap.set(def.ngsNotificationDef(), def.templateRef);
42
+ defsMap.set(def.ngsNotificationDef(), def.templateRef);
45
43
  });
46
- this._initialized = true;
44
+ return defsMap;
45
+ }, ...(ngDevMode ? [{ debugName: "_defsMap" }] : /* istanbul ignore next */ []));
46
+ get controlsTpl() {
47
+ return this.controlsDef()?.templateRef;
47
48
  }
48
49
  getNotificationTemplate(type) {
49
- if (!this._defsMap.has(type)) {
50
+ const defsMap = this._defsMap();
51
+ if (!defsMap.has(type)) {
50
52
  throw new Error(`Invalid type "${type}" for notification def`);
51
53
  }
52
- return this._defsMap.get(type);
54
+ return defsMap.get(type);
55
+ }
56
+ handleNotificationClick(notification, event) {
57
+ if (!this.static() && !this.isEventFromInteractiveElement(event)) {
58
+ this.notificationClick.emit(notification);
59
+ }
60
+ }
61
+ handleNotificationKeydown(notification, event) {
62
+ if (this.static() || this.isEventFromInteractiveElement(event)) {
63
+ return;
64
+ }
65
+ if (event.key === 'Enter' || event.key === ' ') {
66
+ event.preventDefault();
67
+ this.notificationClick.emit(notification);
68
+ }
69
+ }
70
+ stopControlsEvent(event) {
71
+ event.stopPropagation();
72
+ }
73
+ isEventFromInteractiveElement(event) {
74
+ const target = event.target;
75
+ if (!(target instanceof HTMLElement)) {
76
+ return false;
77
+ }
78
+ return !!target.closest('a,button,input,select,textarea,[role="link"],[role="menuitem"],.controls');
53
79
  }
54
80
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationList, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: NotificationList, isStandalone: true, selector: "ngs-notification-list", inputs: { notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, static: { classPropertyName: "static", publicName: "static", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.is-static": "static()" }, classAttribute: "ngs-notification-list" }, queries: [{ propertyName: "defs", predicate: NotificationDefDirective, isSignal: true }, { propertyName: "controlsDef", first: true, predicate: NotificationControlsDefDirective, descendants: true, isSignal: true }], exportAs: ["ngsNotificationList"], ngImport: i0, template: "@if (_initialized) {\n @for (notification of notifications(); track notification) {\n <div class=\"notification\">\n <ng-container [ngTemplateOutlet]=\"getNotificationTemplate(notification.type)\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n @if (controlsDef()) {\n <div class=\"controls\">\n <ng-container [ngTemplateOutlet]=\"controlsTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n </div>\n }\n </div>\n }\n}\n", styles: [":host{--ngs-notification-list-gap: calc(var(--spacing, .25rem) * 6);display:flex;flex-direction:column;gap:var(--ngs-notification-list-gap)}:host .notification{position:relative}:host .controls{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
81
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: NotificationList, isStandalone: true, selector: "ngs-notification-list", inputs: { notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, static: { classPropertyName: "static", publicName: "static", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { notificationClick: "notificationClick" }, host: { attributes: { "role": "list" }, properties: { "class.is-static": "static()" }, classAttribute: "ngs-notification-list" }, queries: [{ propertyName: "defs", predicate: NotificationDefDirective, isSignal: true }, { propertyName: "controlsDef", first: true, predicate: NotificationControlsDefDirective, descendants: true, isSignal: true }], exportAs: ["ngsNotificationList"], ngImport: i0, template: "@if (_initialized) {\n @for (notification of notifications(); track $index) {\n <div class=\"notification\"\n role=\"listitem\"\n [class.is-interactive]=\"!static()\"\n [attr.tabindex]=\"static() ? null : 0\"\n (click)=\"handleNotificationClick(notification, $event)\"\n (keydown)=\"handleNotificationKeydown(notification, $event)\">\n <ng-container [ngTemplateOutlet]=\"getNotificationTemplate(notification.type)\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n @if (controlsDef()) {\n <div class=\"controls\"\n (click)=\"stopControlsEvent($event)\"\n (keydown)=\"stopControlsEvent($event)\">\n <ng-container [ngTemplateOutlet]=\"controlsTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n </div>\n }\n </div>\n }\n}\n", styles: [":host{--ngs-notification-list-gap: calc(var(--spacing, .25rem) * 6);display:flex;flex-direction:column;gap:var(--ngs-notification-list-gap)}:host .notification{position:relative}:host .notification.is-interactive{outline:none}:host .notification.is-interactive:focus-visible{outline:2px solid var(--ngs-color-primary);outline-offset:calc(var(--spacing, .25rem) * 1);border-radius:var(--ngs-notification-radius, var(--ngs-radius-xl))}:host .controls{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
82
  }
57
83
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationList, decorators: [{
58
84
  type: Component,
59
85
  args: [{ selector: 'ngs-notification-list', exportAs: 'ngsNotificationList', imports: [
60
86
  NgTemplateOutlet
61
- ], host: {
87
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
62
88
  'class': 'ngs-notification-list',
63
- '[class.is-static]': 'static()'
64
- }, template: "@if (_initialized) {\n @for (notification of notifications(); track notification) {\n <div class=\"notification\">\n <ng-container [ngTemplateOutlet]=\"getNotificationTemplate(notification.type)\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n @if (controlsDef()) {\n <div class=\"controls\">\n <ng-container [ngTemplateOutlet]=\"controlsTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n </div>\n }\n </div>\n }\n}\n", styles: [":host{--ngs-notification-list-gap: calc(var(--spacing, .25rem) * 6);display:flex;flex-direction:column;gap:var(--ngs-notification-list-gap)}:host .notification{position:relative}:host .controls{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
65
- }], propDecorators: { defs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NotificationDefDirective), { isSignal: true }] }], controlsDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NotificationControlsDefDirective), { isSignal: true }] }], notifications: [{ type: i0.Input, args: [{ isSignal: true, alias: "notifications", required: false }] }], static: [{ type: i0.Input, args: [{ isSignal: true, alias: "static", required: false }] }] } });
89
+ '[class.is-static]': 'static()',
90
+ 'role': 'list'
91
+ }, template: "@if (_initialized) {\n @for (notification of notifications(); track $index) {\n <div class=\"notification\"\n role=\"listitem\"\n [class.is-interactive]=\"!static()\"\n [attr.tabindex]=\"static() ? null : 0\"\n (click)=\"handleNotificationClick(notification, $event)\"\n (keydown)=\"handleNotificationKeydown(notification, $event)\">\n <ng-container [ngTemplateOutlet]=\"getNotificationTemplate(notification.type)\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n @if (controlsDef()) {\n <div class=\"controls\"\n (click)=\"stopControlsEvent($event)\"\n (keydown)=\"stopControlsEvent($event)\">\n <ng-container [ngTemplateOutlet]=\"controlsTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n </div>\n }\n </div>\n }\n}\n", styles: [":host{--ngs-notification-list-gap: calc(var(--spacing, .25rem) * 6);display:flex;flex-direction:column;gap:var(--ngs-notification-list-gap)}:host .notification{position:relative}:host .notification.is-interactive{outline:none}:host .notification.is-interactive:focus-visible{outline:2px solid var(--ngs-color-primary);outline-offset:calc(var(--spacing, .25rem) * 1);border-radius:var(--ngs-notification-radius, var(--ngs-radius-xl))}:host .controls{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 1);top:calc(var(--spacing, .25rem) * 1)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
92
+ }], propDecorators: { defs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NotificationDefDirective), { isSignal: true }] }], controlsDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NotificationControlsDefDirective), { isSignal: true }] }], notifications: [{ type: i0.Input, args: [{ isSignal: true, alias: "notifications", required: false }] }], static: [{ type: i0.Input, args: [{ isSignal: true, alias: "static", required: false }] }], notificationClick: [{ type: i0.Output, args: ["notificationClick"] }] } });
66
93
 
67
94
  class NotificationSkeleton {
68
95
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationSkeleton, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -79,11 +106,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
79
106
 
80
107
  class NotificationTime {
81
108
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
82
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationTime, isStandalone: true, selector: "ngs-notification-time,[ngs-notification-time]", host: { classAttribute: "ngs-notification-time" }, exportAs: ["ngsNotificationTime"], ngImport: i0, template: "<ng-content/>\n", styles: [":host{font-size:var(--ngs-font-size-xs);color:var(--ngs-color-on-surface-variant)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationTime, isStandalone: true, selector: "ngs-notification-time,[ngs-notification-time]", host: { classAttribute: "ngs-notification-time" }, exportAs: ["ngsNotificationTime"], ngImport: i0, template: "<ng-content/>\n", styles: [":host{font-size:var(--ngs-font-size-xs);color:var(--ngs-color-on-surface-variant)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
83
110
  }
84
111
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationTime, decorators: [{
85
112
  type: Component,
86
- args: [{ selector: 'ngs-notification-time,[ngs-notification-time]', exportAs: 'ngsNotificationTime', imports: [], host: {
113
+ args: [{ selector: 'ngs-notification-time,[ngs-notification-time]', exportAs: 'ngsNotificationTime', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: {
87
114
  'class': 'ngs-notification-time'
88
115
  }, template: "<ng-content/>\n", styles: [":host{font-size:var(--ngs-font-size-xs);color:var(--ngs-color-on-surface-variant)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
89
116
  }] });
@@ -94,11 +121,11 @@ class NotificationActor {
94
121
  return this.elementRef.nativeElement.tagName === 'A';
95
122
  }
96
123
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationActor, deps: [], target: i0.ɵɵFactoryTarget.Component });
97
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationActor, isStandalone: true, selector: "ngs-notification-actor,[ngs-notification-actor]", host: { properties: { "class.as-link": "asLink" }, classAttribute: "ngs-notification-actor" }, ngImport: i0, template: "<ng-content/>\n", styles: [":host{display:inline-block;font-weight:600;color:var(--ngs-color-on-surface);font-size:var(--ngs-font-size-sm)}:host.as-link:hover{cursor:pointer;text-decoration:underline}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
124
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationActor, isStandalone: true, selector: "ngs-notification-actor,[ngs-notification-actor]", host: { properties: { "class.as-link": "asLink" }, classAttribute: "ngs-notification-actor" }, ngImport: i0, template: "<ng-content/>\n", styles: [":host{display:inline-block;font-weight:600;color:var(--ngs-color-on-surface);font-size:var(--ngs-font-size-sm)}:host.as-link:hover{cursor:pointer;text-decoration:underline}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
98
125
  }
99
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationActor, decorators: [{
100
127
  type: Component,
101
- args: [{ selector: 'ngs-notification-actor,[ngs-notification-actor]', imports: [], host: {
128
+ args: [{ selector: 'ngs-notification-actor,[ngs-notification-actor]', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: {
102
129
  'class': 'ngs-notification-actor',
103
130
  '[class.as-link]': 'asLink'
104
131
  }, template: "<ng-content/>\n", styles: [":host{display:inline-block;font-weight:600;color:var(--ngs-color-on-surface);font-size:var(--ngs-font-size-sm)}:host.as-link:hover{cursor:pointer;text-decoration:underline}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
@@ -106,11 +133,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
106
133
 
107
134
  class NotificationMessage {
108
135
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationMessage, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationMessage, isStandalone: true, selector: "ngs-notification-message", host: { classAttribute: "ngs-notification-message" }, exportAs: ["ngsNotificationMessage"], ngImport: i0, template: "<ng-content/>\n", styles: [":host{font-size:var(--ngs-font-size-sm)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
136
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationMessage, isStandalone: true, selector: "ngs-notification-message", host: { classAttribute: "ngs-notification-message" }, exportAs: ["ngsNotificationMessage"], ngImport: i0, template: "<ng-content/>\n", styles: [":host{font-size:var(--ngs-font-size-sm)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
110
137
  }
111
138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationMessage, decorators: [{
112
139
  type: Component,
113
- args: [{ selector: 'ngs-notification-message', exportAs: 'ngsNotificationMessage', imports: [], host: {
140
+ args: [{ selector: 'ngs-notification-message', exportAs: 'ngsNotificationMessage', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: {
114
141
  'class': 'ngs-notification-message'
115
142
  }, template: "<ng-content/>\n", styles: [":host{font-size:var(--ngs-font-size-sm)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
116
143
  }] });
@@ -118,11 +145,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
118
145
  class Notification {
119
146
  isUnread = input(false, { ...(ngDevMode ? { debugName: "isUnread" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
120
147
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Notification, deps: [], target: i0.ɵɵFactoryTarget.Component });
121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: Notification, isStandalone: true, selector: "ngs-notification,[ngs-notification]", inputs: { isUnread: { classPropertyName: "isUnread", publicName: "isUnread", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.is-unread": "isUnread()" }, classAttribute: "ngs-notification" }, exportAs: ["ngsNotification"], ngImport: i0, template: "<div class=\"avatar\">\n <ng-content select=\"[ngsNotificationAvatar]\"/>\n</div>\n<div class=\"grow\">\n <span class=\"message\">\n <ng-content select=\"ngs-notification-message,[ngs-notification-message]\"/>\n </span>\n <div class=\"content\">\n <ng-content select=\"ngs-notification-content,[ngs-notification-content]\"/>\n </div>\n <ng-content select=\"ngs-notification-time,[ngs-notification-time]\"/>\n</div>\n", styles: [":host{--ngs-notification-padding: calc(var(--spacing, .25rem) * 5);--ngs-notification-gap: calc(var(--spacing, .25rem) * 4);--ngs-notification-bg: var(--ngs-color-surface-container-lowest);--ngs-notification-hover-bg: var(--ngs-color-surface-container-low);--ngs-notification-is-unread-bg: var(--ngs-color-surface-container-low);--ngs-notification-is-unread-hover-bg: var(--ngs-color-surface-container);--ngs-notification-radius: .75rem;display:flex;width:100%;position:relative;border-radius:var(--ngs-notification-radius);gap:var(--ngs-notification-gap);padding:var(--ngs-notification-padding)}:host .avatar{position:relative}:host .avatar:empty{display:none}:host .actor:empty{display:none}:host .message:empty{display:none}:host-context(ngs-notification-list.is-static){cursor:auto}:host-context(ngs-notification-list){background:var(--ngs-notification-bg);cursor:pointer}:host-context(ngs-notification-list).is-unread{background:var(--ngs-notification-is-unread-bg)}:host-context(ngs-notification-list:not(.is-static)):hover{background:var(--ngs-notification-hover-bg)}:host-context(ngs-notification-list:not(.is-static)).is-unread:hover{background:var(--ngs-notification-is-unread-hover-bg)}:host-context(html.dark){--ngs-notification-is-unread-bg: var(--ngs-color-neutral-950);--ngs-notification-is-unread-hover-bg: var(--ngs-color-neutral-900)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: Notification, isStandalone: true, selector: "ngs-notification,[ngs-notification]", inputs: { isUnread: { classPropertyName: "isUnread", publicName: "isUnread", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.is-unread": "isUnread()" }, classAttribute: "ngs-notification" }, exportAs: ["ngsNotification"], ngImport: i0, template: "<div class=\"avatar\">\n <ng-content select=\"[ngsNotificationAvatar]\"/>\n</div>\n<div class=\"grow\">\n <span class=\"message\">\n <ng-content select=\"ngs-notification-message,[ngs-notification-message]\"/>\n </span>\n <div class=\"content\">\n <ng-content select=\"ngs-notification-content,[ngs-notification-content]\"/>\n </div>\n <ng-content select=\"ngs-notification-time,[ngs-notification-time]\"/>\n</div>\n", styles: [":host{--ngs-notification-padding: calc(var(--spacing, .25rem) * 5);--ngs-notification-gap: calc(var(--spacing, .25rem) * 4);--ngs-notification-bg: var(--ngs-color-surface-container-lowest);--ngs-notification-hover-bg: var(--ngs-color-surface-container-low);--ngs-notification-is-unread-bg: var(--ngs-color-surface-container-low);--ngs-notification-is-unread-hover-bg: var(--ngs-color-surface-container);--ngs-notification-radius: .75rem;display:flex;width:100%;position:relative;border-radius:var(--ngs-notification-radius);gap:var(--ngs-notification-gap);padding:var(--ngs-notification-padding)}:host .avatar{position:relative}:host .avatar:empty{display:none}:host .actor:empty{display:none}:host .message:empty{display:none}:host-context(ngs-notification-list.is-static){cursor:auto}:host-context(ngs-notification-list){background:var(--ngs-notification-bg);cursor:pointer}:host-context(ngs-notification-list).is-unread{background:var(--ngs-notification-is-unread-bg)}:host-context(ngs-notification-list:not(.is-static)):hover{background:var(--ngs-notification-hover-bg)}:host-context(ngs-notification-list:not(.is-static)).is-unread:hover{background:var(--ngs-notification-is-unread-hover-bg)}:host-context(html.dark){--ngs-notification-is-unread-bg: var(--ngs-color-neutral-950);--ngs-notification-is-unread-hover-bg: var(--ngs-color-neutral-900)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
122
149
  }
123
150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Notification, decorators: [{
124
151
  type: Component,
125
- args: [{ selector: 'ngs-notification,[ngs-notification]', exportAs: 'ngsNotification', imports: [], host: {
152
+ args: [{ selector: 'ngs-notification,[ngs-notification]', exportAs: 'ngsNotification', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: {
126
153
  'class': 'ngs-notification',
127
154
  '[class.is-unread]': 'isUnread()'
128
155
  }, template: "<div class=\"avatar\">\n <ng-content select=\"[ngsNotificationAvatar]\"/>\n</div>\n<div class=\"grow\">\n <span class=\"message\">\n <ng-content select=\"ngs-notification-message,[ngs-notification-message]\"/>\n </span>\n <div class=\"content\">\n <ng-content select=\"ngs-notification-content,[ngs-notification-content]\"/>\n </div>\n <ng-content select=\"ngs-notification-time,[ngs-notification-time]\"/>\n</div>\n", styles: [":host{--ngs-notification-padding: calc(var(--spacing, .25rem) * 5);--ngs-notification-gap: calc(var(--spacing, .25rem) * 4);--ngs-notification-bg: var(--ngs-color-surface-container-lowest);--ngs-notification-hover-bg: var(--ngs-color-surface-container-low);--ngs-notification-is-unread-bg: var(--ngs-color-surface-container-low);--ngs-notification-is-unread-hover-bg: var(--ngs-color-surface-container);--ngs-notification-radius: .75rem;display:flex;width:100%;position:relative;border-radius:var(--ngs-notification-radius);gap:var(--ngs-notification-gap);padding:var(--ngs-notification-padding)}:host .avatar{position:relative}:host .avatar:empty{display:none}:host .actor:empty{display:none}:host .message:empty{display:none}:host-context(ngs-notification-list.is-static){cursor:auto}:host-context(ngs-notification-list){background:var(--ngs-notification-bg);cursor:pointer}:host-context(ngs-notification-list).is-unread{background:var(--ngs-notification-is-unread-bg)}:host-context(ngs-notification-list:not(.is-static)):hover{background:var(--ngs-notification-hover-bg)}:host-context(ngs-notification-list:not(.is-static)).is-unread:hover{background:var(--ngs-notification-is-unread-hover-bg)}:host-context(html.dark){--ngs-notification-is-unread-bg: var(--ngs-color-neutral-950);--ngs-notification-is-unread-hover-bg: var(--ngs-color-neutral-900)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
@@ -130,11 +157,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
130
157
 
131
158
  class NotificationContent {
132
159
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
133
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationContent, isStandalone: true, selector: "ngs-notification-content,[ngs-notification-content]", host: { classAttribute: "ngs-notification-content" }, exportAs: ["ngsNotificationContent"], ngImport: i0, template: "<ng-content/>\n", styles: [":host{--ngs-notification-content-margin: calc(var(--spacing, .25rem) * 1.5) 0 calc(var(--spacing, .25rem) * 1.5) 0;display:block;margin:var(--ngs-notification-content-margin)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
160
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: NotificationContent, isStandalone: true, selector: "ngs-notification-content,[ngs-notification-content]", host: { classAttribute: "ngs-notification-content" }, exportAs: ["ngsNotificationContent"], ngImport: i0, template: "<ng-content/>\n", styles: [":host{--ngs-notification-content-margin: calc(var(--spacing, .25rem) * 1.5) 0 calc(var(--spacing, .25rem) * 1.5) 0;display:block;margin:var(--ngs-notification-content-margin)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
134
161
  }
135
162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NotificationContent, decorators: [{
136
163
  type: Component,
137
- args: [{ selector: 'ngs-notification-content,[ngs-notification-content]', exportAs: 'ngsNotificationContent', imports: [], host: {
164
+ args: [{ selector: 'ngs-notification-content,[ngs-notification-content]', exportAs: 'ngsNotificationContent', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, host: {
138
165
  'class': 'ngs-notification-content'
139
166
  }, template: "<ng-content/>\n", styles: [":host{--ngs-notification-content-margin: calc(var(--spacing, .25rem) * 1.5) 0 calc(var(--spacing, .25rem) * 1.5) 0;display:block;margin:var(--ngs-notification-content-margin)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
140
167
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"ngstarter-ui-components-notifications.mjs","sources":["../../../projects/components/notifications/src/notification-def.directive.ts","../../../projects/components/notifications/src/notification-controls-def.directive.ts","../../../projects/components/notifications/src/notification-list/notification-list.ts","../../../projects/components/notifications/src/notification-list/notification-list.html","../../../projects/components/notifications/src/notification-skeleton/notification-skeleton.ts","../../../projects/components/notifications/src/notification-skeleton/notification-skeleton.html","../../../projects/components/notifications/src/notification-time/notification-time.ts","../../../projects/components/notifications/src/notification-time/notification-time.html","../../../projects/components/notifications/src/notification-actor/notification-actor.ts","../../../projects/components/notifications/src/notification-actor/notification-actor.html","../../../projects/components/notifications/src/notification-message/notification-message.ts","../../../projects/components/notifications/src/notification-message/notification-message.html","../../../projects/components/notifications/src/notification/notification.ts","../../../projects/components/notifications/src/notification/notification.html","../../../projects/components/notifications/src/notification-content/notification-content.ts","../../../projects/components/notifications/src/notification-content/notification-content.html","../../../projects/components/notifications/src/notification-props.directive.ts","../../../projects/components/notifications/src/notification-avatar.directive.ts","../../../projects/components/notifications/ngstarter-ui-components-notifications.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationDef]',\n standalone: true\n})\nexport class NotificationDefDirective {\n readonly templateRef = inject(TemplateRef);\n ngsNotificationDef = input.required<string>();\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationControlsDef]',\n})\nexport class NotificationControlsDefDirective {\n readonly templateRef = inject(TemplateRef);\n}\n","import {\n AfterContentInit, booleanAttribute,\n Component,\n contentChild,\n contentChildren,\n input,\n TemplateRef\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NotificationDefDirective } from '../notification-def.directive';\nimport { NotificationControlsDefDirective } from '../notification-controls-def.directive';\nimport { NotificationInterface } from '../types';\n\n@Component({\n selector: 'ngs-notification-list',\n exportAs: 'ngsNotificationList',\n imports: [\n NgTemplateOutlet\n ],\n templateUrl: './notification-list.html',\n styleUrl: './notification-list.scss',\n host: {\n 'class': 'ngs-notification-list',\n '[class.is-static]': 'static()'\n }\n})\nexport class NotificationList<T extends NotificationInterface> implements AfterContentInit {\n readonly defs = contentChildren(NotificationDefDirective);\n readonly controlsDef = contentChild(NotificationControlsDefDirective);\n\n notifications = input<T[]>([]);\n static = input(true, {\n transform: booleanAttribute\n });\n\n protected _initialized = false;\n protected _defsMap = new Map<string, TemplateRef<any>>();\n\n get controlsTpl(): TemplateRef<any> {\n return this.controlsDef()?.templateRef as TemplateRef<any>;\n }\n\n ngAfterContentInit() {\n this.defs().forEach((def: NotificationDefDirective) => {\n this._defsMap.set(def.ngsNotificationDef(), def.templateRef);\n });\n this._initialized = true;\n }\n\n getNotificationTemplate(type: string): TemplateRef<any> {\n if (!this._defsMap.has(type)) {\n throw new Error(`Invalid type \"${type}\" for notification def`);\n }\n\n return this._defsMap.get(type) as TemplateRef<any>;\n }\n}\n","@if (_initialized) {\n @for (notification of notifications(); track notification) {\n <div class=\"notification\">\n <ng-container [ngTemplateOutlet]=\"getNotificationTemplate(notification.type)\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n @if (controlsDef()) {\n <div class=\"controls\">\n <ng-container [ngTemplateOutlet]=\"controlsTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n </div>\n }\n </div>\n }\n}\n","import { Component } from '@angular/core';\nimport { Skeleton } from '@ngstarter-ui/components/skeleton';\n\n@Component({\n selector: 'ngs-notification-skeleton',\n exportAs: 'ngsNotificationSkeleton',\n imports: [\n Skeleton\n ],\n templateUrl: './notification-skeleton.html',\n styleUrl: './notification-skeleton.scss',\n host: {\n 'class': 'ngs-notification-skeleton',\n }\n})\nexport class NotificationSkeleton {\n\n}\n","<div class=\"flex gap-3\">\n <ngs-skeleton roundedFull class=\"size-11\"/>\n <div class=\"grow flex flex-col gap-2\">\n <ngs-skeleton class=\"h-16\"/>\n <ngs-skeleton class=\"w-20 h-3\"/>\n </div>\n</div>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-time,[ngs-notification-time]',\n exportAs: 'ngsNotificationTime',\n imports: [],\n templateUrl: './notification-time.html',\n styleUrl: './notification-time.scss',\n host: {\n 'class': 'ngs-notification-time'\n }\n})\nexport class NotificationTime {\n\n}\n","<ng-content/>\n","import { Component, ElementRef, inject } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-actor,[ngs-notification-actor]',\n imports: [],\n templateUrl: './notification-actor.html',\n styleUrl: './notification-actor.scss',\n host: {\n 'class': 'ngs-notification-actor',\n '[class.as-link]': 'asLink'\n }\n})\nexport class NotificationActor {\n private elementRef = inject(ElementRef);\n\n protected get asLink() {\n return (this.elementRef.nativeElement as HTMLElement).tagName === 'A';\n }\n}\n","<ng-content/>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-message',\n exportAs: 'ngsNotificationMessage',\n imports: [],\n templateUrl: './notification-message.html',\n styleUrl: './notification-message.scss',\n host: {\n 'class': 'ngs-notification-message'\n }\n})\nexport class NotificationMessage {\n\n}\n","<ng-content/>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification,[ngs-notification]',\n exportAs: 'ngsNotification',\n imports: [],\n templateUrl: './notification.html',\n styleUrl: './notification.scss',\n host: {\n 'class': 'ngs-notification',\n '[class.is-unread]': 'isUnread()'\n }\n})\nexport class Notification {\n isUnread = input(false, {\n transform: booleanAttribute\n });\n}\n","<div class=\"avatar\">\n <ng-content select=\"[ngsNotificationAvatar]\"/>\n</div>\n<div class=\"grow\">\n <span class=\"message\">\n <ng-content select=\"ngs-notification-message,[ngs-notification-message]\"/>\n </span>\n <div class=\"content\">\n <ng-content select=\"ngs-notification-content,[ngs-notification-content]\"/>\n </div>\n <ng-content select=\"ngs-notification-time,[ngs-notification-time]\"/>\n</div>\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-content,[ngs-notification-content]',\n exportAs: 'ngsNotificationContent',\n imports: [],\n templateUrl: './notification-content.html',\n styleUrl: './notification-content.scss',\n host: {\n 'class': 'ngs-notification-content'\n }\n})\nexport class NotificationContent {\n\n}\n","<ng-content/>\n","import { booleanAttribute, Directive, input } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationProps]',\n exportAs: 'ngsNotificationProps',\n standalone: true,\n host: {\n 'class': 'ngs-notification-props',\n '[class.is-unread]': 'isUnread()',\n }\n})\nexport class NotificationPropsDirective {\n isUnread = input(false, {\n transform: booleanAttribute\n });\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationAvatar]',\n exportAs: 'ngsNotificationAvatar',\n host: {\n 'class': 'ngs-notification-avatar'\n }\n})\nexport class NotificationAvatarDirective {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngstarter-ui-components-notifications.mjs","sources":["../../../projects/components/notifications/src/notification-def.directive.ts","../../../projects/components/notifications/src/notification-controls-def.directive.ts","../../../projects/components/notifications/src/notification-list/notification-list.ts","../../../projects/components/notifications/src/notification-list/notification-list.html","../../../projects/components/notifications/src/notification-skeleton/notification-skeleton.ts","../../../projects/components/notifications/src/notification-skeleton/notification-skeleton.html","../../../projects/components/notifications/src/notification-time/notification-time.ts","../../../projects/components/notifications/src/notification-time/notification-time.html","../../../projects/components/notifications/src/notification-actor/notification-actor.ts","../../../projects/components/notifications/src/notification-actor/notification-actor.html","../../../projects/components/notifications/src/notification-message/notification-message.ts","../../../projects/components/notifications/src/notification-message/notification-message.html","../../../projects/components/notifications/src/notification/notification.ts","../../../projects/components/notifications/src/notification/notification.html","../../../projects/components/notifications/src/notification-content/notification-content.ts","../../../projects/components/notifications/src/notification-content/notification-content.html","../../../projects/components/notifications/src/notification-props.directive.ts","../../../projects/components/notifications/src/notification-avatar.directive.ts","../../../projects/components/notifications/ngstarter-ui-components-notifications.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationDef]',\n standalone: true\n})\nexport class NotificationDefDirective {\n readonly templateRef = inject(TemplateRef);\n ngsNotificationDef = input.required<string>();\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationControlsDef]',\n})\nexport class NotificationControlsDefDirective {\n readonly templateRef = inject(TemplateRef);\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n input,\n output,\n TemplateRef\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NotificationDefDirective } from '../notification-def.directive';\nimport { NotificationControlsDefDirective } from '../notification-controls-def.directive';\nimport { NotificationInterface } from '../types';\n\n@Component({\n selector: 'ngs-notification-list',\n exportAs: 'ngsNotificationList',\n imports: [\n NgTemplateOutlet\n ],\n templateUrl: './notification-list.html',\n styleUrl: './notification-list.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-notification-list',\n '[class.is-static]': 'static()',\n 'role': 'list'\n }\n})\nexport class NotificationList<T extends NotificationInterface> {\n readonly defs = contentChildren(NotificationDefDirective);\n readonly controlsDef = contentChild(NotificationControlsDefDirective);\n\n notifications = input<T[]>([]);\n static = input(true, {\n transform: booleanAttribute\n });\n\n readonly notificationClick = output<T>();\n\n protected _initialized = true;\n protected readonly _defsMap = computed(() => {\n const defsMap = new Map<string, TemplateRef<any>>();\n\n this.defs().forEach((def: NotificationDefDirective) => {\n defsMap.set(def.ngsNotificationDef(), def.templateRef);\n });\n\n return defsMap;\n });\n\n get controlsTpl(): TemplateRef<any> {\n return this.controlsDef()?.templateRef as TemplateRef<any>;\n }\n\n getNotificationTemplate(type: string): TemplateRef<any> {\n const defsMap = this._defsMap();\n\n if (!defsMap.has(type)) {\n throw new Error(`Invalid type \"${type}\" for notification def`);\n }\n\n return defsMap.get(type) as TemplateRef<any>;\n }\n\n protected handleNotificationClick(notification: T, event: Event) {\n if (!this.static() && !this.isEventFromInteractiveElement(event)) {\n this.notificationClick.emit(notification);\n }\n }\n\n protected handleNotificationKeydown(notification: T, event: KeyboardEvent) {\n if (this.static() || this.isEventFromInteractiveElement(event)) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.notificationClick.emit(notification);\n }\n }\n\n protected stopControlsEvent(event: Event) {\n event.stopPropagation();\n }\n\n private isEventFromInteractiveElement(event: Event): boolean {\n const target = event.target;\n\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return !!target.closest('a,button,input,select,textarea,[role=\"link\"],[role=\"menuitem\"],.controls');\n }\n}\n","@if (_initialized) {\n @for (notification of notifications(); track $index) {\n <div class=\"notification\"\n role=\"listitem\"\n [class.is-interactive]=\"!static()\"\n [attr.tabindex]=\"static() ? null : 0\"\n (click)=\"handleNotificationClick(notification, $event)\"\n (keydown)=\"handleNotificationKeydown(notification, $event)\">\n <ng-container [ngTemplateOutlet]=\"getNotificationTemplate(notification.type)\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n @if (controlsDef()) {\n <div class=\"controls\"\n (click)=\"stopControlsEvent($event)\"\n (keydown)=\"stopControlsEvent($event)\">\n <ng-container [ngTemplateOutlet]=\"controlsTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: notification }\" />\n </div>\n }\n </div>\n }\n}\n","import { Component } from '@angular/core';\nimport { Skeleton } from '@ngstarter-ui/components/skeleton';\n\n@Component({\n selector: 'ngs-notification-skeleton',\n exportAs: 'ngsNotificationSkeleton',\n imports: [\n Skeleton\n ],\n templateUrl: './notification-skeleton.html',\n styleUrl: './notification-skeleton.scss',\n host: {\n 'class': 'ngs-notification-skeleton',\n }\n})\nexport class NotificationSkeleton {\n\n}\n","<div class=\"flex gap-3\">\n <ngs-skeleton roundedFull class=\"size-11\"/>\n <div class=\"grow flex flex-col gap-2\">\n <ngs-skeleton class=\"h-16\"/>\n <ngs-skeleton class=\"w-20 h-3\"/>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-time,[ngs-notification-time]',\n exportAs: 'ngsNotificationTime',\n imports: [],\n templateUrl: './notification-time.html',\n styleUrl: './notification-time.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-notification-time'\n }\n})\nexport class NotificationTime {\n\n}\n","<ng-content/>\n","import { ChangeDetectionStrategy, Component, ElementRef, inject } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-actor,[ngs-notification-actor]',\n imports: [],\n templateUrl: './notification-actor.html',\n styleUrl: './notification-actor.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-notification-actor',\n '[class.as-link]': 'asLink'\n }\n})\nexport class NotificationActor {\n private elementRef = inject(ElementRef);\n\n protected get asLink() {\n return (this.elementRef.nativeElement as HTMLElement).tagName === 'A';\n }\n}\n","<ng-content/>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-message',\n exportAs: 'ngsNotificationMessage',\n imports: [],\n templateUrl: './notification-message.html',\n styleUrl: './notification-message.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-notification-message'\n }\n})\nexport class NotificationMessage {\n\n}\n","<ng-content/>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification,[ngs-notification]',\n exportAs: 'ngsNotification',\n imports: [],\n templateUrl: './notification.html',\n styleUrl: './notification.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-notification',\n '[class.is-unread]': 'isUnread()'\n }\n})\nexport class Notification {\n isUnread = input(false, {\n transform: booleanAttribute\n });\n}\n","<div class=\"avatar\">\n <ng-content select=\"[ngsNotificationAvatar]\"/>\n</div>\n<div class=\"grow\">\n <span class=\"message\">\n <ng-content select=\"ngs-notification-message,[ngs-notification-message]\"/>\n </span>\n <div class=\"content\">\n <ng-content select=\"ngs-notification-content,[ngs-notification-content]\"/>\n </div>\n <ng-content select=\"ngs-notification-time,[ngs-notification-time]\"/>\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'ngs-notification-content,[ngs-notification-content]',\n exportAs: 'ngsNotificationContent',\n imports: [],\n templateUrl: './notification-content.html',\n styleUrl: './notification-content.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-notification-content'\n }\n})\nexport class NotificationContent {\n\n}\n","<ng-content/>\n","import { booleanAttribute, Directive, input } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationProps]',\n exportAs: 'ngsNotificationProps',\n standalone: true,\n host: {\n 'class': 'ngs-notification-props',\n '[class.is-unread]': 'isUnread()',\n }\n})\nexport class NotificationPropsDirective {\n isUnread = input(false, {\n transform: booleanAttribute\n });\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngsNotificationAvatar]',\n exportAs: 'ngsNotificationAvatar',\n host: {\n 'class': 'ngs-notification-avatar'\n }\n})\nexport class NotificationAvatarDirective {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}