@ship-ui/core 0.19.4 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/assets/mcp/components.json +32 -4212
- package/bin/mcp/index.js +6544 -444
- package/bin/ship-fg-scanner +0 -0
- package/bin/ship-fg.mjs +18 -16
- package/bin/src/subset.ts +3 -1
- package/fesm2022/ship-ui-core-sh-form-field-experimental.mjs +42 -0
- package/fesm2022/ship-ui-core-sh-form-field-experimental.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-accordion.mjs +127 -0
- package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-alert.mjs +305 -0
- package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-blueprint.mjs +1156 -0
- package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-button-group.mjs +41 -0
- package/fesm2022/ship-ui-core-ship-button-group.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-button.mjs +38 -0
- package/fesm2022/ship-ui-core-ship-button.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-card.mjs +35 -0
- package/fesm2022/ship-ui-core-ship-card.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-checkbox.mjs +113 -0
- package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-chip.mjs +44 -0
- package/fesm2022/ship-ui-core-ship-chip.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-color-picker.mjs +947 -0
- package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-datepicker.mjs +951 -0
- package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-dialog.mjs +263 -0
- package/fesm2022/ship-ui-core-ship-dialog.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-divider.mjs +22 -0
- package/fesm2022/ship-ui-core-ship-divider.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-event-card.mjs +50 -0
- package/fesm2022/ship-ui-core-ship-event-card.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-file-upload.mjs +112 -0
- package/fesm2022/ship-ui-core-ship-file-upload.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-form-field.mjs +310 -0
- package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-icon.mjs +81 -0
- package/fesm2022/ship-ui-core-ship-icon.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-list.mjs +22 -0
- package/fesm2022/ship-ui-core-ship-list.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-menu.mjs +545 -0
- package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-popover.mjs +286 -0
- package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-progress-bar.mjs +37 -0
- package/fesm2022/ship-ui-core-ship-progress-bar.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-radio.mjs +102 -0
- package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-range-slider.mjs +277 -0
- package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-select.mjs +971 -0
- package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-sidenav.mjs +248 -0
- package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-sortable.mjs +485 -0
- package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-spinner.mjs +28 -0
- package/fesm2022/ship-ui-core-ship-spinner.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-stepper.mjs +76 -0
- package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-table-filter-bar.mjs +28 -0
- package/fesm2022/ship-ui-core-ship-table-filter-bar.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-table.mjs +442 -0
- package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-tabs.mjs +38 -0
- package/fesm2022/ship-ui-core-ship-tabs.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-theme-toggle.mjs +119 -0
- package/fesm2022/ship-ui-core-ship-theme-toggle.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-toggle-card.mjs +75 -0
- package/fesm2022/ship-ui-core-ship-toggle-card.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-toggle.mjs +105 -0
- package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-virtual-scroll.mjs +186 -0
- package/fesm2022/ship-ui-core-ship-virtual-scroll.mjs.map +1 -0
- package/fesm2022/ship-ui-core.mjs +880 -8782
- package/fesm2022/ship-ui-core.mjs.map +1 -1
- package/package.json +147 -3
- package/styles/core.scss +43 -0
- package/styles/helpers.scss +2 -0
- package/styles/index.scss +12 -123
- package/types/ship-ui-core-sh-form-field-experimental.d.ts +11 -0
- package/types/ship-ui-core-ship-accordion.d.ts +19 -0
- package/types/ship-ui-core-ship-alert.d.ts +68 -0
- package/types/ship-ui-core-ship-blueprint.d.ts +112 -0
- package/types/ship-ui-core-ship-button-group.d.ts +15 -0
- package/types/ship-ui-core-ship-button.d.ts +13 -0
- package/types/ship-ui-core-ship-card.d.ts +11 -0
- package/types/ship-ui-core-ship-checkbox.d.ts +22 -0
- package/types/ship-ui-core-ship-chip.d.ts +15 -0
- package/types/ship-ui-core-ship-color-picker.d.ts +105 -0
- package/types/ship-ui-core-ship-datepicker.d.ts +96 -0
- package/types/ship-ui-core-ship-dialog.d.ts +76 -0
- package/types/ship-ui-core-ship-divider.d.ts +8 -0
- package/types/ship-ui-core-ship-event-card.d.ts +11 -0
- package/types/ship-ui-core-ship-file-upload.d.ts +20 -0
- package/types/ship-ui-core-ship-form-field.d.ts +32 -0
- package/types/ship-ui-core-ship-icon.d.ts +18 -0
- package/types/ship-ui-core-ship-list.d.ts +8 -0
- package/types/ship-ui-core-ship-menu.d.ts +49 -0
- package/types/ship-ui-core-ship-popover.d.ts +40 -0
- package/types/ship-ui-core-ship-progress-bar.d.ts +14 -0
- package/types/ship-ui-core-ship-radio.d.ts +22 -0
- package/types/ship-ui-core-ship-range-slider.d.ts +31 -0
- package/types/ship-ui-core-ship-select.d.ts +81 -0
- package/types/ship-ui-core-ship-sidenav.d.ts +36 -0
- package/types/ship-ui-core-ship-sortable.d.ts +72 -0
- package/types/ship-ui-core-ship-spinner.d.ts +10 -0
- package/types/ship-ui-core-ship-stepper.d.ts +13 -0
- package/types/ship-ui-core-ship-table-filter-bar.d.ts +8 -0
- package/types/ship-ui-core-ship-table.d.ts +69 -0
- package/types/ship-ui-core-ship-tabs.d.ts +14 -0
- package/types/ship-ui-core-ship-theme-toggle.d.ts +28 -0
- package/types/ship-ui-core-ship-toggle-card.d.ts +15 -0
- package/types/ship-ui-core-ship-toggle.d.ts +21 -0
- package/types/ship-ui-core-ship-virtual-scroll.d.ts +22 -0
- package/types/ship-ui-core.d.ts +88 -1070
- package/styles/components/ship-accordion.scss +0 -113
- package/styles/components/ship-alert-container.scss +0 -49
- package/styles/components/ship-alert.scss +0 -177
- package/styles/components/ship-blueprint.scss +0 -242
- package/styles/components/ship-button-group.scss +0 -165
- package/styles/components/ship-button.scss +0 -141
- package/styles/components/ship-card.scss +0 -56
- package/styles/components/ship-checkbox.scss +0 -116
- package/styles/components/ship-chip.scss +0 -104
- package/styles/components/ship-color-picker.scss +0 -150
- package/styles/components/ship-datepicker.scss +0 -317
- package/styles/components/ship-dialog.scss +0 -152
- package/styles/components/ship-divider.scss +0 -27
- package/styles/components/ship-event-card.scss +0 -51
- package/styles/components/ship-file-upload.scss +0 -47
- package/styles/components/ship-form-field.scss +0 -408
- package/styles/components/ship-icon.scss +0 -54
- package/styles/components/ship-list.scss +0 -165
- package/styles/components/ship-menu.scss +0 -237
- package/styles/components/ship-popover.scss +0 -205
- package/styles/components/ship-progress-bar.scss +0 -173
- package/styles/components/ship-radio.scss +0 -113
- package/styles/components/ship-range-slider.scss +0 -421
- package/styles/components/ship-select.scss +0 -153
- package/styles/components/ship-sidenav.scss +0 -195
- package/styles/components/ship-sortable.scss +0 -45
- package/styles/components/ship-spinner.scss +0 -53
- package/styles/components/ship-stepper.scss +0 -158
- package/styles/components/ship-table.scss +0 -443
- package/styles/components/ship-tabs.scss +0 -125
- package/styles/components/ship-theme-toggle.scss +0 -41
- package/styles/components/ship-toggle-card.scss +0 -69
- package/styles/components/ship-toggle.scss +0 -255
- package/styles/components/ship-tooltip.scss +0 -151
- package/styles/components/ship-virtual-scroll.scss +0 -12
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, inject, ElementRef, ChangeDetectionStrategy, ViewEncapsulation, Component, viewChild, computed, effect, HostListener, NgModule, signal, Injectable } from '@angular/core';
|
|
3
|
+
import { ShipIcon } from '@ship-ui/core/ship-icon';
|
|
4
|
+
import { shipComponentClasses, generateUniqueId } from '@ship-ui/core';
|
|
5
|
+
|
|
6
|
+
class ShipAlert {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.color = input(null, /* @ts-ignore */
|
|
9
|
+
...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
10
|
+
this.variant = input(null, /* @ts-ignore */
|
|
11
|
+
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
12
|
+
this.hostClasses = shipComponentClasses('alert', {
|
|
13
|
+
color: this.color,
|
|
14
|
+
variant: this.variant,
|
|
15
|
+
});
|
|
16
|
+
this._el = inject(ElementRef); // Used by alert container
|
|
17
|
+
this.alertService = input(null, /* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [{ debugName: "alertService" }] : /* istanbul ignore next */ []));
|
|
19
|
+
this.id = input(null, /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
21
|
+
}
|
|
22
|
+
removeAlert() {
|
|
23
|
+
if (this.id() && this.alertService()) {
|
|
24
|
+
this.alertService()?.removeAlert(this.id());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlert, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
28
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: ShipAlert, isStandalone: true, selector: "sh-alert", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, alertService: { classPropertyName: "alertService", publicName: "alertService", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" }, classAttribute: "sh-sheet" }, ngImport: i0, template: `
|
|
29
|
+
<div class="alert">
|
|
30
|
+
<div #ref class="icon" [style.display]="!ref.children.length ? 'none' : 'block'">
|
|
31
|
+
<ng-content select="[icon]" />
|
|
32
|
+
<ng-content select="sh-icon" />
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="icon">
|
|
36
|
+
@let _alertClasses = hostClasses();
|
|
37
|
+
|
|
38
|
+
@if (_alertClasses.includes('primary')) {
|
|
39
|
+
<sh-icon class="state-icon">info</sh-icon>
|
|
40
|
+
} @else if (_alertClasses.includes('accent')) {
|
|
41
|
+
<sh-icon class="state-icon">info</sh-icon>
|
|
42
|
+
} @else if (_alertClasses.includes('warn')) {
|
|
43
|
+
<sh-icon class="state-icon">warning</sh-icon>
|
|
44
|
+
} @else if (_alertClasses.includes('error')) {
|
|
45
|
+
<sh-icon class="state-icon">warning-octagon</sh-icon>
|
|
46
|
+
} @else if (_alertClasses.includes('success')) {
|
|
47
|
+
<sh-icon class="state-icon">check-circle</sh-icon>
|
|
48
|
+
} @else {
|
|
49
|
+
<sh-icon class="state-icon">question</sh-icon>
|
|
50
|
+
}
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class="title">
|
|
54
|
+
<ng-content select="[title]" />
|
|
55
|
+
<ng-content />
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
@if (id()) {
|
|
59
|
+
<sh-icon class="close-icon" (click)="removeAlert()">plus</sh-icon>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
<div class="actions">
|
|
63
|
+
<ng-content select="button" />
|
|
64
|
+
<ng-content select="[actions]" />
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="content">
|
|
68
|
+
<ng-content select="[content]" />
|
|
69
|
+
<ng-content select="p" />
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
`, isInline: true, styles: ["sh-alert{--alert-ad: .4s;--alert-bs: var(--box-shadow-10);--alert-p: .5rem;max-height:18.75rem;padding-top:0;padding-bottom:0;margin-bottom:0;opacity:1;overflow:hidden;display:block;transition:max-height var(--alert-ad) ease-in-out,transform var(--alert-ad) ease-in-out,opacity var(--alert-ad) ease-in-out,margin-bottom var(--alert-ad) ease-in-out,padding-top var(--alert-ad) ease-in-out,padding-bottom var(--alert-ad) ease-in-out;transform:translateY(0);box-shadow:var(--alert-bs)}sh-alert.simple .content>*{color:var(--sheet-c);opacity:.7}sh-alert.flat,sh-alert.raised{--sheet-c: #fff}sh-alert.flat .content>*,sh-alert.raised .content>*{color:var(--sheet-c);opacity:.8}sh-alert .alert{display:grid;grid-template-columns:auto 1fr 1fr;grid-template-rows:auto auto;grid-template-areas:\"stateIcon title closeIcon\" \". content .\";padding:var(--alert-p);align-items:flex-start;gap:.25rem .5rem}sh-alert .alert .close-icon{display:none}sh-alert .alert:has(.actions:empty){grid-template-columns:auto 1fr;grid-template-areas:\"stateIcon title\" \". content\"}sh-alert .alert:has(.actions:empty) .actions{display:none}sh-alert .alert:has(.actions:empty) .close-icon{display:block}sh-alert .alert:has(.content:empty){grid-template-rows:auto;grid-template-areas:\"stateIcon title closeIcon\"}sh-alert .alert:has(.actions:empty):has(.content:empty){grid-template-columns:auto 1fr;grid-template-areas:\"stateIcon title\"}sh-alert .actions{grid-area:closeIcon;display:flex;align-items:center;justify-content:flex-end;gap:.25rem}sh-alert .icon{grid-area:stateIcon;height:1.25rem;width:1.25rem;display:flex;align-items:center;justify-content:center}sh-alert .icon:first-of-type:not(:empty)+.icon{display:none}sh-alert [icon],sh-alert .state-icon{color:var(--alert-state-ic)}sh-alert .close-icon{grid-area:closeIcon;color:var(--alert-close-ic);transform:rotate(45deg);transform-origin:center}sh-alert .title{grid-area:title;padding-top:.125rem;font-weight:500}sh-alert .content{grid-area:content}sh-alert .content:empty{display:none}sh-alert.is-hidden{max-height:0;padding-top:0;padding-bottom:0;opacity:0;margin-bottom:0;overflow:hidden;transform:translateY(-40px)}sh-alert.is-hidden:before{opacity:0}sh-alert.animate-in{transition:none;max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0;overflow:hidden;transform:translateY(0)}sh-alert.animate-in:before{opacity:0}sh-alert.animate-out{max-height:0;padding:0;opacity:0;overflow:hidden;transform:translateY(-40px)}sh-alert.animate-out:before{opacity:0}sh-alert:has([content]) .alert{--alert-p: .75rem}\n"], dependencies: [{ kind: "component", type: ShipIcon, selector: "sh-icon", inputs: ["color", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
73
|
+
}
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlert, decorators: [{
|
|
75
|
+
type: Component,
|
|
76
|
+
args: [{ selector: 'sh-alert', encapsulation: ViewEncapsulation.None, imports: [ShipIcon], template: `
|
|
77
|
+
<div class="alert">
|
|
78
|
+
<div #ref class="icon" [style.display]="!ref.children.length ? 'none' : 'block'">
|
|
79
|
+
<ng-content select="[icon]" />
|
|
80
|
+
<ng-content select="sh-icon" />
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<div class="icon">
|
|
84
|
+
@let _alertClasses = hostClasses();
|
|
85
|
+
|
|
86
|
+
@if (_alertClasses.includes('primary')) {
|
|
87
|
+
<sh-icon class="state-icon">info</sh-icon>
|
|
88
|
+
} @else if (_alertClasses.includes('accent')) {
|
|
89
|
+
<sh-icon class="state-icon">info</sh-icon>
|
|
90
|
+
} @else if (_alertClasses.includes('warn')) {
|
|
91
|
+
<sh-icon class="state-icon">warning</sh-icon>
|
|
92
|
+
} @else if (_alertClasses.includes('error')) {
|
|
93
|
+
<sh-icon class="state-icon">warning-octagon</sh-icon>
|
|
94
|
+
} @else if (_alertClasses.includes('success')) {
|
|
95
|
+
<sh-icon class="state-icon">check-circle</sh-icon>
|
|
96
|
+
} @else {
|
|
97
|
+
<sh-icon class="state-icon">question</sh-icon>
|
|
98
|
+
}
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<div class="title">
|
|
102
|
+
<ng-content select="[title]" />
|
|
103
|
+
<ng-content />
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
@if (id()) {
|
|
107
|
+
<sh-icon class="close-icon" (click)="removeAlert()">plus</sh-icon>
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
<div class="actions">
|
|
111
|
+
<ng-content select="button" />
|
|
112
|
+
<ng-content select="[actions]" />
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div class="content">
|
|
116
|
+
<ng-content select="[content]" />
|
|
117
|
+
<ng-content select="p" />
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
121
|
+
class: 'sh-sheet',
|
|
122
|
+
'[class]': 'hostClasses()',
|
|
123
|
+
}, styles: ["sh-alert{--alert-ad: .4s;--alert-bs: var(--box-shadow-10);--alert-p: .5rem;max-height:18.75rem;padding-top:0;padding-bottom:0;margin-bottom:0;opacity:1;overflow:hidden;display:block;transition:max-height var(--alert-ad) ease-in-out,transform var(--alert-ad) ease-in-out,opacity var(--alert-ad) ease-in-out,margin-bottom var(--alert-ad) ease-in-out,padding-top var(--alert-ad) ease-in-out,padding-bottom var(--alert-ad) ease-in-out;transform:translateY(0);box-shadow:var(--alert-bs)}sh-alert.simple .content>*{color:var(--sheet-c);opacity:.7}sh-alert.flat,sh-alert.raised{--sheet-c: #fff}sh-alert.flat .content>*,sh-alert.raised .content>*{color:var(--sheet-c);opacity:.8}sh-alert .alert{display:grid;grid-template-columns:auto 1fr 1fr;grid-template-rows:auto auto;grid-template-areas:\"stateIcon title closeIcon\" \". content .\";padding:var(--alert-p);align-items:flex-start;gap:.25rem .5rem}sh-alert .alert .close-icon{display:none}sh-alert .alert:has(.actions:empty){grid-template-columns:auto 1fr;grid-template-areas:\"stateIcon title\" \". content\"}sh-alert .alert:has(.actions:empty) .actions{display:none}sh-alert .alert:has(.actions:empty) .close-icon{display:block}sh-alert .alert:has(.content:empty){grid-template-rows:auto;grid-template-areas:\"stateIcon title closeIcon\"}sh-alert .alert:has(.actions:empty):has(.content:empty){grid-template-columns:auto 1fr;grid-template-areas:\"stateIcon title\"}sh-alert .actions{grid-area:closeIcon;display:flex;align-items:center;justify-content:flex-end;gap:.25rem}sh-alert .icon{grid-area:stateIcon;height:1.25rem;width:1.25rem;display:flex;align-items:center;justify-content:center}sh-alert .icon:first-of-type:not(:empty)+.icon{display:none}sh-alert [icon],sh-alert .state-icon{color:var(--alert-state-ic)}sh-alert .close-icon{grid-area:closeIcon;color:var(--alert-close-ic);transform:rotate(45deg);transform-origin:center}sh-alert .title{grid-area:title;padding-top:.125rem;font-weight:500}sh-alert .content{grid-area:content}sh-alert .content:empty{display:none}sh-alert.is-hidden{max-height:0;padding-top:0;padding-bottom:0;opacity:0;margin-bottom:0;overflow:hidden;transform:translateY(-40px)}sh-alert.is-hidden:before{opacity:0}sh-alert.animate-in{transition:none;max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0;overflow:hidden;transform:translateY(0)}sh-alert.animate-in:before{opacity:0}sh-alert.animate-out{max-height:0;padding:0;opacity:0;overflow:hidden;transform:translateY(-40px)}sh-alert.animate-out:before{opacity:0}sh-alert:has([content]) .alert{--alert-p: .75rem}\n"] }]
|
|
124
|
+
}], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], alertService: [{ type: i0.Input, args: [{ isSignal: true, alias: "alertService", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }] } });
|
|
125
|
+
|
|
126
|
+
class ShipAlertContainer {
|
|
127
|
+
constructor() {
|
|
128
|
+
this.inline = input(null, /* @ts-ignore */
|
|
129
|
+
...(ngDevMode ? [{ debugName: "inline" }] : /* istanbul ignore next */ []));
|
|
130
|
+
this.alerts = viewChild.required('alerts');
|
|
131
|
+
this.scroller = viewChild.required('scroller');
|
|
132
|
+
this.alertService = input.required(/* @ts-ignore */
|
|
133
|
+
...(ngDevMode ? [{ debugName: "alertService" }] : /* istanbul ignore next */ []));
|
|
134
|
+
// alertHistory = this.alertService()?.alertHistory;
|
|
135
|
+
// alertHistoryIsOpen = this.alertService()?.alertHistoryIsOpen;
|
|
136
|
+
// alertHistoryIsHidden = this.alertService()?.alertHistoryIsHidden;
|
|
137
|
+
this.numberOfOpenAlerts = computed(() => {
|
|
138
|
+
return this.alertService()
|
|
139
|
+
.alertHistory()
|
|
140
|
+
.filter((x) => x.isOpen).length;
|
|
141
|
+
}, /* @ts-ignore */
|
|
142
|
+
...(ngDevMode ? [{ debugName: "numberOfOpenAlerts" }] : /* istanbul ignore next */ []));
|
|
143
|
+
this.#e = effect(() => {
|
|
144
|
+
this.alertService().alertHistory();
|
|
145
|
+
this.alertService().alertHistoryIsOpen();
|
|
146
|
+
this.#scrollToBottom();
|
|
147
|
+
}, /* @ts-ignore */
|
|
148
|
+
...(ngDevMode ? [{ debugName: "#e" }] : /* istanbul ignore next */ []));
|
|
149
|
+
}
|
|
150
|
+
#e;
|
|
151
|
+
#scrollToBottom() {
|
|
152
|
+
if (this.scroller() && this.scroller().nativeElement && typeof this.scroller().nativeElement.scrollTo === 'function') {
|
|
153
|
+
this.scroller().nativeElement.scrollTo(0, this.scroller().nativeElement.scrollHeight);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
onMouseOver() {
|
|
157
|
+
if (typeof this.inline === 'string')
|
|
158
|
+
return;
|
|
159
|
+
this.alertService().setHidden(false);
|
|
160
|
+
}
|
|
161
|
+
onMouseOut() {
|
|
162
|
+
if (typeof this.inline === 'string')
|
|
163
|
+
return;
|
|
164
|
+
this.alertService().setHidden(true);
|
|
165
|
+
}
|
|
166
|
+
getElementHeight(i) {
|
|
167
|
+
if (!this.alerts)
|
|
168
|
+
return 0;
|
|
169
|
+
const elementHeights = this.alerts()
|
|
170
|
+
.toArray()
|
|
171
|
+
.map((element) => element._el.nativeElement.querySelector('.ship-alert-item').offsetHeight);
|
|
172
|
+
if (!elementHeights)
|
|
173
|
+
return 0;
|
|
174
|
+
let totalHeight = 0;
|
|
175
|
+
const elementTransformPos = elementHeights.map((height, i) => {
|
|
176
|
+
totalHeight += height;
|
|
177
|
+
return totalHeight - elementHeights[0];
|
|
178
|
+
});
|
|
179
|
+
return elementTransformPos[i];
|
|
180
|
+
}
|
|
181
|
+
transformY(i) {
|
|
182
|
+
return `translateY(calc(-${this.getElementHeight(i - 1)}px + (-10px * ${i})))`;
|
|
183
|
+
}
|
|
184
|
+
transitionDelay(i, allOpen = false) {
|
|
185
|
+
return allOpen
|
|
186
|
+
? this.alertService().alertHistory().length - 1 * 40 + 'ms'
|
|
187
|
+
: (this.numberOfOpenAlerts() - i) * 40 + 'ms';
|
|
188
|
+
}
|
|
189
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertContainer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
190
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: ShipAlertContainer, isStandalone: true, selector: "ship-alert-container", inputs: { inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null }, alertService: { classPropertyName: "alertService", publicName: "alertService", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "mouseover": "onMouseOver()", "mouseout": "onMouseOut()" } }, viewQueries: [{ propertyName: "alerts", first: true, predicate: ["alerts"], descendants: true, isSignal: true }, { propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"scroller\" #scroller>\n <div class=\"container\">\n @for (alert of this.alertService().alertHistory(); track $index) {\n <sh-alert\n #alerts\n [class]=\"alert.type\"\n [id]=\"alert.id\"\n [alertService]=\"alertService()\"\n [style.transition-delay]=\"transitionDelay($index, true)\"\n [class.animate-in]=\"alert.animateIn\"\n [class.animate-out]=\"alert.animateOut\"\n [class.is-hidden]=\"this.alertService().alertHistoryIsHidden() && !alert.isOpen\">\n <div title>{{ alert.title }}</div>\n\n @if (alert.content) {\n <div content>\n {{ alert.content }}\n </div>\n }\n </sh-alert>\n }\n </div>\n</div>\n<div\n class=\"tray\"\n [class.tray-is-hidden]=\"!this.alertService().alertHistoryIsHidden()\"\n (mouseover)=\"this.onMouseOver()\"\n (mouseout)=\"this.onMouseOut()\">\n <sh-icon class=\"small\">info</sh-icon>\n</div>\n", styles: ["sh-alert-container{width:100%;position:relative}sh-alert-container sh-alert{margin-bottom:.5rem}sh-alert-container sh-alert:first-of-type{margin-bottom:0}sh-alert-container sh-alert.alert-is-hidden{margin-bottom:0}sh-alert-container .scroller{width:100%;max-height:50vh;overflow-y:auto;overflow-x:hidden;padding:.5rem 1rem 1rem .5rem}sh-alert-container .container{flex-direction:column-reverse;display:flex}sh-alert-container .tray{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;background-color:var(--base-8);color:var(--base-1);position:absolute;bottom:0;right:0;border-radius:50%;z-index:1000}\n"], dependencies: [{ kind: "component", type: ShipAlert, selector: "sh-alert", inputs: ["color", "variant", "alertService", "id"] }, { kind: "component", type: ShipIcon, selector: "sh-icon", inputs: ["color", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
191
|
+
}
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertContainer, decorators: [{
|
|
193
|
+
type: Component,
|
|
194
|
+
args: [{ selector: 'ship-alert-container', encapsulation: ViewEncapsulation.None, imports: [ShipAlert, ShipIcon], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"scroller\" #scroller>\n <div class=\"container\">\n @for (alert of this.alertService().alertHistory(); track $index) {\n <sh-alert\n #alerts\n [class]=\"alert.type\"\n [id]=\"alert.id\"\n [alertService]=\"alertService()\"\n [style.transition-delay]=\"transitionDelay($index, true)\"\n [class.animate-in]=\"alert.animateIn\"\n [class.animate-out]=\"alert.animateOut\"\n [class.is-hidden]=\"this.alertService().alertHistoryIsHidden() && !alert.isOpen\">\n <div title>{{ alert.title }}</div>\n\n @if (alert.content) {\n <div content>\n {{ alert.content }}\n </div>\n }\n </sh-alert>\n }\n </div>\n</div>\n<div\n class=\"tray\"\n [class.tray-is-hidden]=\"!this.alertService().alertHistoryIsHidden()\"\n (mouseover)=\"this.onMouseOver()\"\n (mouseout)=\"this.onMouseOut()\">\n <sh-icon class=\"small\">info</sh-icon>\n</div>\n", styles: ["sh-alert-container{width:100%;position:relative}sh-alert-container sh-alert{margin-bottom:.5rem}sh-alert-container sh-alert:first-of-type{margin-bottom:0}sh-alert-container sh-alert.alert-is-hidden{margin-bottom:0}sh-alert-container .scroller{width:100%;max-height:50vh;overflow-y:auto;overflow-x:hidden;padding:.5rem 1rem 1rem .5rem}sh-alert-container .container{flex-direction:column-reverse;display:flex}sh-alert-container .tray{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;background-color:var(--base-8);color:var(--base-1);position:absolute;bottom:0;right:0;border-radius:50%;z-index:1000}\n"] }]
|
|
195
|
+
}], propDecorators: { inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], alerts: [{ type: i0.ViewChild, args: ['alerts', { isSignal: true }] }], scroller: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }], alertService: [{ type: i0.Input, args: [{ isSignal: true, alias: "alertService", required: true }] }], onMouseOver: [{
|
|
196
|
+
type: HostListener,
|
|
197
|
+
args: ['mouseover']
|
|
198
|
+
}], onMouseOut: [{
|
|
199
|
+
type: HostListener,
|
|
200
|
+
args: ['mouseout']
|
|
201
|
+
}] } });
|
|
202
|
+
|
|
203
|
+
class ShipAlertModule {
|
|
204
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
205
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertModule, imports: [ShipAlert, ShipAlertContainer], exports: [ShipAlert, ShipAlertContainer] }); }
|
|
206
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertModule, imports: [ShipAlert, ShipAlertContainer] }); }
|
|
207
|
+
}
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertModule, decorators: [{
|
|
209
|
+
type: NgModule,
|
|
210
|
+
args: [{
|
|
211
|
+
imports: [ShipAlert, ShipAlertContainer],
|
|
212
|
+
exports: [ShipAlert, ShipAlertContainer],
|
|
213
|
+
providers: [],
|
|
214
|
+
}]
|
|
215
|
+
}] });
|
|
216
|
+
|
|
217
|
+
class ShipAlertService {
|
|
218
|
+
constructor() {
|
|
219
|
+
this.alertHistory = signal([], /* @ts-ignore */
|
|
220
|
+
...(ngDevMode ? [{ debugName: "alertHistory" }] : /* istanbul ignore next */ []));
|
|
221
|
+
this.alertHistoryIsOpen = signal(false, /* @ts-ignore */
|
|
222
|
+
...(ngDevMode ? [{ debugName: "alertHistoryIsOpen" }] : /* istanbul ignore next */ []));
|
|
223
|
+
this.alertHistoryIsHidden = signal(true, /* @ts-ignore */
|
|
224
|
+
...(ngDevMode ? [{ debugName: "alertHistoryIsHidden" }] : /* istanbul ignore next */ []));
|
|
225
|
+
}
|
|
226
|
+
error(message) {
|
|
227
|
+
this.addAlert({
|
|
228
|
+
type: 'error',
|
|
229
|
+
title: message ?? 'An error occured',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
success(message) {
|
|
233
|
+
this.addAlert({
|
|
234
|
+
type: 'success',
|
|
235
|
+
title: message,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
question(message) {
|
|
239
|
+
this.addAlert({
|
|
240
|
+
type: 'question',
|
|
241
|
+
title: message,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
warning(message) {
|
|
245
|
+
this.addAlert({
|
|
246
|
+
type: 'warn',
|
|
247
|
+
title: message,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
info(message) {
|
|
251
|
+
this.addAlert({
|
|
252
|
+
type: 'primary',
|
|
253
|
+
title: message,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
addAlert(alert) {
|
|
257
|
+
const id = generateUniqueId();
|
|
258
|
+
this.alertHistory.update((history) => [
|
|
259
|
+
{ ...alert, isOpen: true, animateIn: true, animateOut: false, id },
|
|
260
|
+
...history,
|
|
261
|
+
]);
|
|
262
|
+
setTimeout(() => {
|
|
263
|
+
this.alertHistory.update((history) => history.map((item) => ({
|
|
264
|
+
...item,
|
|
265
|
+
animateIn: item.id === id ? false : item.animateIn,
|
|
266
|
+
})));
|
|
267
|
+
}, 40);
|
|
268
|
+
setTimeout(() => {
|
|
269
|
+
this.hideAlert(id);
|
|
270
|
+
}, 2500);
|
|
271
|
+
}
|
|
272
|
+
removeAlert(id) {
|
|
273
|
+
this.alertHistory.update((history) => history.map((item) => ({
|
|
274
|
+
...item,
|
|
275
|
+
animateOut: item.id === id ? false : item.animateOut,
|
|
276
|
+
})));
|
|
277
|
+
setTimeout(() => {
|
|
278
|
+
this.alertHistory.update((history) => history.filter((item) => item.id !== id));
|
|
279
|
+
}, 300);
|
|
280
|
+
}
|
|
281
|
+
hideAlert(id) {
|
|
282
|
+
this.alertHistory.update((history) => history.map((item) => ({
|
|
283
|
+
...item,
|
|
284
|
+
isOpen: item.id === id ? false : item.isOpen,
|
|
285
|
+
})));
|
|
286
|
+
}
|
|
287
|
+
setHidden(isHidden) {
|
|
288
|
+
this.alertHistoryIsHidden.set(isHidden);
|
|
289
|
+
}
|
|
290
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
291
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertService, providedIn: 'root' }); }
|
|
292
|
+
}
|
|
293
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAlertService, decorators: [{
|
|
294
|
+
type: Injectable,
|
|
295
|
+
args: [{
|
|
296
|
+
providedIn: 'root',
|
|
297
|
+
}]
|
|
298
|
+
}] });
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Generated bundle index. Do not edit.
|
|
302
|
+
*/
|
|
303
|
+
|
|
304
|
+
export { ShipAlert, ShipAlertContainer, ShipAlertModule, ShipAlertService };
|
|
305
|
+
//# sourceMappingURL=ship-ui-core-ship-alert.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-ui-core-ship-alert.mjs","sources":["../../../projects/ship-ui/ship-alert/ship-alert.ts","../../../projects/ship-ui/ship-alert/ship-alert-container.ts","../../../projects/ship-ui/ship-alert/ship-alert-container.html","../../../projects/ship-ui/ship-alert/ship-alert.module.ts","../../../projects/ship-ui/ship-alert/ship-alert.service.ts","../../../projects/ship-ui/ship-alert/ship-ui-core-ship-alert.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, inject, input, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { shipComponentClasses } from '@ship-ui/core';\nimport { ShipColor, ShipSheetVariant } from '@ship-ui/core';\nimport { ShipAlertService } from './ship-alert.service';\n\nexport type ShipAlertType = 'error' | 'success' | 'warn' | 'primary' | 'accent' | 'question';\n\n@Component({\n selector: 'sh-alert',\n styleUrl: './ship-alert.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <div class=\"alert\">\n <div #ref class=\"icon\" [style.display]=\"!ref.children.length ? 'none' : 'block'\">\n <ng-content select=\"[icon]\" />\n <ng-content select=\"sh-icon\" />\n </div>\n\n <div class=\"icon\">\n @let _alertClasses = hostClasses();\n\n @if (_alertClasses.includes('primary')) {\n <sh-icon class=\"state-icon\">info</sh-icon>\n } @else if (_alertClasses.includes('accent')) {\n <sh-icon class=\"state-icon\">info</sh-icon>\n } @else if (_alertClasses.includes('warn')) {\n <sh-icon class=\"state-icon\">warning</sh-icon>\n } @else if (_alertClasses.includes('error')) {\n <sh-icon class=\"state-icon\">warning-octagon</sh-icon>\n } @else if (_alertClasses.includes('success')) {\n <sh-icon class=\"state-icon\">check-circle</sh-icon>\n } @else {\n <sh-icon class=\"state-icon\">question</sh-icon>\n }\n </div>\n\n <div class=\"title\">\n <ng-content select=\"[title]\" />\n <ng-content />\n </div>\n\n @if (id()) {\n <sh-icon class=\"close-icon\" (click)=\"removeAlert()\">plus</sh-icon>\n }\n\n <div class=\"actions\">\n <ng-content select=\"button\" />\n <ng-content select=\"[actions]\" />\n </div>\n\n <div class=\"content\">\n <ng-content select=\"[content]\" />\n <ng-content select=\"p\" />\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'sh-sheet',\n '[class]': 'hostClasses()',\n },\n})\nexport class ShipAlert {\n color = input<ShipColor | null>(null);\n variant = input<ShipSheetVariant | null>(null);\n\n hostClasses = shipComponentClasses('alert', {\n color: this.color,\n variant: this.variant,\n });\n\n _el = inject(ElementRef); // Used by alert container\n alertService = input<ShipAlertService | null>(null);\n id = input<string | null>(null);\n\n removeAlert() {\n if (this.id() && this.alertService()) {\n this.alertService()?.removeAlert(this.id() as string);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, QueryList, computed, effect, input, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipAlert } from './ship-alert';\nimport { ShipAlertService } from './ship-alert.service';\n\n@Component({\n selector: 'ship-alert-container',\n styleUrl: './ship-alert-container.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipAlert, ShipIcon],\n templateUrl: './ship-alert-container.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipAlertContainer {\n inline = input<string | null>(null);\n alerts = viewChild.required<QueryList<ShipAlert>>('alerts');\n scroller = viewChild.required<ElementRef<HTMLDivElement>>('scroller');\n alertService = input.required<ShipAlertService>();\n\n // alertHistory = this.alertService()?.alertHistory;\n // alertHistoryIsOpen = this.alertService()?.alertHistoryIsOpen;\n // alertHistoryIsHidden = this.alertService()?.alertHistoryIsHidden;\n\n numberOfOpenAlerts = computed(() => {\n return this.alertService()\n .alertHistory()\n .filter((x) => x.isOpen).length;\n });\n\n readonly #e = effect(() => {\n this.alertService().alertHistory();\n this.alertService().alertHistoryIsOpen();\n this.#scrollToBottom();\n });\n\n #scrollToBottom() {\n if (this.scroller() && this.scroller().nativeElement && typeof this.scroller().nativeElement.scrollTo === 'function') {\n this.scroller().nativeElement.scrollTo(0, this.scroller().nativeElement.scrollHeight);\n }\n }\n\n @HostListener('mouseover')\n onMouseOver() {\n if (typeof this.inline === 'string') return;\n\n this.alertService().setHidden(false);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n if (typeof this.inline === 'string') return;\n\n this.alertService().setHidden(true);\n }\n\n getElementHeight(i: number) {\n if (!this.alerts) return 0;\n\n const elementHeights = this.alerts()\n .toArray()\n .map((element) => element._el.nativeElement.querySelector('.ship-alert-item').offsetHeight);\n\n if (!elementHeights) return 0;\n\n let totalHeight = 0;\n const elementTransformPos = elementHeights.map((height, i) => {\n totalHeight += height;\n return totalHeight - elementHeights[0];\n });\n\n return elementTransformPos[i];\n }\n\n transformY(i: number) {\n return `translateY(calc(-${this.getElementHeight(i - 1)}px + (-10px * ${i})))`;\n }\n\n transitionDelay(i: number, allOpen = false) {\n return allOpen\n ? this.alertService().alertHistory().length - 1 * 40 + 'ms'\n : (this.numberOfOpenAlerts() - i) * 40 + 'ms';\n }\n}\n","<div class=\"scroller\" #scroller>\n <div class=\"container\">\n @for (alert of this.alertService().alertHistory(); track $index) {\n <sh-alert\n #alerts\n [class]=\"alert.type\"\n [id]=\"alert.id\"\n [alertService]=\"alertService()\"\n [style.transition-delay]=\"transitionDelay($index, true)\"\n [class.animate-in]=\"alert.animateIn\"\n [class.animate-out]=\"alert.animateOut\"\n [class.is-hidden]=\"this.alertService().alertHistoryIsHidden() && !alert.isOpen\">\n <div title>{{ alert.title }}</div>\n\n @if (alert.content) {\n <div content>\n {{ alert.content }}\n </div>\n }\n </sh-alert>\n }\n </div>\n</div>\n<div\n class=\"tray\"\n [class.tray-is-hidden]=\"!this.alertService().alertHistoryIsHidden()\"\n (mouseover)=\"this.onMouseOver()\"\n (mouseout)=\"this.onMouseOut()\">\n <sh-icon class=\"small\">info</sh-icon>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ShipAlert } from './ship-alert';\nimport { ShipAlertContainer } from './ship-alert-container';\n\n@NgModule({\n imports: [ShipAlert, ShipAlertContainer],\n exports: [ShipAlert, ShipAlertContainer],\n providers: [],\n})\nexport class ShipAlertModule {}\n","import { Injectable, signal } from '@angular/core';\nimport { generateUniqueId } from '@ship-ui/core';\nimport { ShipAlertType } from './ship-alert';\n\nexport type ShipAlertItem = {\n type: ShipAlertType;\n title: string;\n content?: string;\n};\n\nexport type ShipAlertItemInternal = ShipAlertItem & {\n id: string;\n isOpen: boolean;\n animateOut: boolean;\n animateIn: boolean;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipAlertService {\n alertHistory = signal<ShipAlertItemInternal[]>([]);\n alertHistoryIsOpen = signal<boolean>(false);\n alertHistoryIsHidden = signal<boolean>(true);\n\n error(message: string | null | undefined) {\n this.addAlert({\n type: 'error',\n title: message ?? 'An error occured',\n });\n }\n\n success(message: string) {\n this.addAlert({\n type: 'success',\n title: message,\n });\n }\n\n question(message: string) {\n this.addAlert({\n type: 'question',\n title: message,\n });\n }\n\n warning(message: string) {\n this.addAlert({\n type: 'warn',\n title: message,\n });\n }\n\n info(message: string) {\n this.addAlert({\n type: 'primary',\n title: message,\n });\n }\n\n addAlert(alert: ShipAlertItem) {\n const id = generateUniqueId();\n\n this.alertHistory.update((history) => [\n { ...alert, isOpen: true, animateIn: true, animateOut: false, id },\n ...history,\n ]);\n\n setTimeout(() => {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n animateIn: item.id === id ? false : item.animateIn,\n }))\n );\n }, 40);\n\n setTimeout(() => {\n this.hideAlert(id);\n }, 2500);\n }\n\n removeAlert(id: string) {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n animateOut: item.id === id ? false : item.animateOut,\n }))\n );\n\n setTimeout(() => {\n this.alertHistory.update((history) => history.filter((item) => item.id !== id));\n }, 300);\n }\n\n hideAlert(id: string) {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n isOpen: item.id === id ? false : item.isOpen,\n }))\n );\n }\n\n setHidden(isHidden: boolean) {\n this.alertHistoryIsHidden.set(isHidden);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|