@ship-ui/core 0.19.5 → 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 +66 -4243
- package/bin/mcp/index.js +6027 -273
- package/bin/ship-fg-scanner +0 -0
- package/bin/ship-fg.mjs +14 -12
- 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 -57
- 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
package/bin/ship-fg-scanner
CHANGED
|
Binary file
|
package/bin/ship-fg.mjs
CHANGED
|
@@ -3236,7 +3236,7 @@ import { parseArgs } from "util";
|
|
|
3236
3236
|
import { spawnSync } from "child_process";
|
|
3237
3237
|
import { watch } from "fs";
|
|
3238
3238
|
import { readFile as readFile2, writeFile, readdir, mkdir } from "fs/promises";
|
|
3239
|
-
import { dirname, join, resolve } from "path";
|
|
3239
|
+
import { dirname as dirname2, join, resolve as resolve2 } from "path";
|
|
3240
3240
|
import { fileURLToPath } from "url";
|
|
3241
3241
|
import { gzipSync } from "zlib";
|
|
3242
3242
|
|
|
@@ -3244,12 +3244,14 @@ import { gzipSync } from "zlib";
|
|
|
3244
3244
|
var import_wawoff2 = __toESM(require_wawoff2(), 1);
|
|
3245
3245
|
import { readFile } from "fs/promises";
|
|
3246
3246
|
import { createRequire as createRequire2 } from "module";
|
|
3247
|
+
import { dirname, resolve } from "path";
|
|
3247
3248
|
var require2 = createRequire2(import.meta.url);
|
|
3248
3249
|
var harfbuzzInst = null;
|
|
3249
3250
|
async function loadAndInitializeHarfbuzz() {
|
|
3250
3251
|
if (harfbuzzInst)
|
|
3251
3252
|
return harfbuzzInst;
|
|
3252
|
-
const
|
|
3253
|
+
const mainEntry = require2.resolve("harfbuzzjs");
|
|
3254
|
+
const wasmPath = resolve(dirname(mainEntry), "harfbuzz-subset.wasm");
|
|
3253
3255
|
const wasmBuffer = await readFile(wasmPath);
|
|
3254
3256
|
const { instance } = await WebAssembly.instantiate(wasmBuffer);
|
|
3255
3257
|
const harfbuzzJsWasm = instance.exports;
|
|
@@ -3323,14 +3325,14 @@ function formatFileSize(bytes, dm = 2) {
|
|
|
3323
3325
|
}
|
|
3324
3326
|
|
|
3325
3327
|
// bin/src/ship-fg.ts
|
|
3326
|
-
var _dirname =
|
|
3328
|
+
var _dirname = dirname2(fileURLToPath(import.meta.url));
|
|
3327
3329
|
var CWD_PATH = process.cwd();
|
|
3328
|
-
var PHOSPHOR_SRC_PATH =
|
|
3330
|
+
var PHOSPHOR_SRC_PATH = resolve2(CWD_PATH, "node_modules", "@phosphor-icons", "web", "src");
|
|
3329
3331
|
var jsScannerFallback = async (PROJECT_SRC, shipUiDir, CWD_PATH2) => {
|
|
3330
3332
|
const uniqueIcons = new Set;
|
|
3331
3333
|
const isValidIcon = (s) => /^[a-z0-9-]+$/.test(s);
|
|
3332
3334
|
try {
|
|
3333
|
-
const pkgPath =
|
|
3335
|
+
const pkgPath = resolve2(shipUiDir, "package.json");
|
|
3334
3336
|
const pkgData = JSON.parse(await readFile2(pkgPath, "utf8"));
|
|
3335
3337
|
if (pkgData.libraryIcons) {
|
|
3336
3338
|
pkgData.libraryIcons.forEach((i) => uniqueIcons.add(i));
|
|
@@ -3341,7 +3343,7 @@ var jsScannerFallback = async (PROJECT_SRC, shipUiDir, CWD_PATH2) => {
|
|
|
3341
3343
|
for (const entry of entries) {
|
|
3342
3344
|
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
3343
3345
|
continue;
|
|
3344
|
-
const fullPath =
|
|
3346
|
+
const fullPath = resolve2(dir, entry.name);
|
|
3345
3347
|
if (entry.isDirectory()) {
|
|
3346
3348
|
await scanDir(fullPath);
|
|
3347
3349
|
} else if (entry.name.endsWith(".html") || entry.name.endsWith(".ts")) {
|
|
@@ -3372,7 +3374,7 @@ var jsScannerFallback = async (PROJECT_SRC, shipUiDir, CWD_PATH2) => {
|
|
|
3372
3374
|
const glyphMaps = new Map;
|
|
3373
3375
|
for (const variant of variants) {
|
|
3374
3376
|
try {
|
|
3375
|
-
const selPath =
|
|
3377
|
+
const selPath = resolve2(CWD_PATH2, "node_modules", "@phosphor-icons", "web", "src", variant, "selection.json");
|
|
3376
3378
|
const parsed = JSON.parse(await readFile2(selPath, "utf8"));
|
|
3377
3379
|
const isDuotone = variant === "duotone";
|
|
3378
3380
|
for (const icon of parsed.icons || []) {
|
|
@@ -3430,8 +3432,8 @@ var watchers = [];
|
|
|
3430
3432
|
var run = async (PROJECT_SRC, PROJECT_PUBLIC, TARGET_FONT_TYPE, values) => {
|
|
3431
3433
|
const startTime = performance.now();
|
|
3432
3434
|
const actualDir = _dirname;
|
|
3433
|
-
const scannerPath =
|
|
3434
|
-
const shipUiDir =
|
|
3435
|
+
const scannerPath = resolve2(actualDir, "./ship-fg-scanner");
|
|
3436
|
+
const shipUiDir = resolve2(actualDir, "../");
|
|
3435
3437
|
let groupedIcons = {};
|
|
3436
3438
|
let missingIconsArray = [];
|
|
3437
3439
|
try {
|
|
@@ -3589,10 +3591,10 @@ function capitalize(str) {
|
|
|
3589
3591
|
var main = async (values) => {
|
|
3590
3592
|
const TARGET_FONT_TYPE = "woff2";
|
|
3591
3593
|
const actualDir = _dirname;
|
|
3592
|
-
const packageJsonPath =
|
|
3594
|
+
const packageJsonPath = resolve2(actualDir, "../package.json");
|
|
3593
3595
|
const PROJECT_SRC = values.src;
|
|
3594
3596
|
const PROJECT_PUBLIC = values.out;
|
|
3595
|
-
const selectionJsonPath =
|
|
3597
|
+
const selectionJsonPath = resolve2(PHOSPHOR_SRC_PATH, "regular", "selection.json");
|
|
3596
3598
|
const selectionData = await readFile2(selectionJsonPath, "utf8");
|
|
3597
3599
|
const GLYPH_MAP = JSON.parse(selectionData).icons.reduce((acc, iconWrapper) => {
|
|
3598
3600
|
const name = iconWrapper.properties.name;
|
|
@@ -3627,7 +3629,7 @@ Watching for file changes. Press Cmd+C to stop.`);
|
|
|
3627
3629
|
if (values.watch) {
|
|
3628
3630
|
const excludeFolders = ["node_modules", ".git", ".vscode", "bin", "assets"].concat([PROJECT_PUBLIC]);
|
|
3629
3631
|
watchers.push(watch(PROJECT_SRC, { recursive: true }, (_, filename) => {
|
|
3630
|
-
if (filename && !excludeFolders.some((folder) =>
|
|
3632
|
+
if (filename && !excludeFolders.some((folder) => resolve2(join(PROJECT_SRC, filename)).includes(folder))) {
|
|
3631
3633
|
debouncedRun(filename);
|
|
3632
3634
|
}
|
|
3633
3635
|
}));
|
package/bin/src/subset.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile } from 'fs/promises';
|
|
2
2
|
import { createRequire } from 'module';
|
|
3
|
+
import { dirname, resolve } from 'path';
|
|
3
4
|
|
|
4
5
|
const require = createRequire(import.meta.url);
|
|
5
6
|
|
|
@@ -11,7 +12,8 @@ let harfbuzzInst: { harfbuzzJsWasm: any; heapu8: Uint8Array } | null = null;
|
|
|
11
12
|
async function loadAndInitializeHarfbuzz() {
|
|
12
13
|
if (harfbuzzInst) return harfbuzzInst;
|
|
13
14
|
|
|
14
|
-
const
|
|
15
|
+
const mainEntry = require.resolve('harfbuzzjs');
|
|
16
|
+
const wasmPath = resolve(dirname(mainEntry), 'harfbuzz-subset.wasm');
|
|
15
17
|
const wasmBuffer = await readFile(wasmPath);
|
|
16
18
|
const { instance } = await WebAssembly.instantiate(wasmBuffer);
|
|
17
19
|
const harfbuzzJsWasm = instance.exports as any;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { effect, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { createFormInputSignal } from '@ship-ui/core';
|
|
4
|
+
|
|
5
|
+
class ShipFormFieldExperimental {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.firstInput = createFormInputSignal();
|
|
8
|
+
this.hello = effect(() => {
|
|
9
|
+
console.log('hello', this.firstInput());
|
|
10
|
+
}, /* @ts-ignore */
|
|
11
|
+
...(ngDevMode ? [{ debugName: "hello" }] : /* istanbul ignore next */ []));
|
|
12
|
+
}
|
|
13
|
+
myClick() {
|
|
14
|
+
this.firstInput.update((x) => x + 'hello');
|
|
15
|
+
}
|
|
16
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipFormFieldExperimental, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: ShipFormFieldExperimental, isStandalone: true, selector: "sh-form-field-experimental", ngImport: i0, template: `
|
|
18
|
+
<ng-content></ng-content>
|
|
19
|
+
|
|
20
|
+
<button (click)="myClick()">hello</button>
|
|
21
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
22
|
+
}
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipFormFieldExperimental, decorators: [{
|
|
24
|
+
type: Component,
|
|
25
|
+
args: [{
|
|
26
|
+
selector: 'sh-form-field-experimental',
|
|
27
|
+
imports: [],
|
|
28
|
+
template: `
|
|
29
|
+
<ng-content></ng-content>
|
|
30
|
+
|
|
31
|
+
<button (click)="myClick()">hello</button>
|
|
32
|
+
`,
|
|
33
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
34
|
+
}]
|
|
35
|
+
}] });
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Generated bundle index. Do not edit.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
export { ShipFormFieldExperimental };
|
|
42
|
+
//# sourceMappingURL=ship-ui-core-sh-form-field-experimental.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-ui-core-sh-form-field-experimental.mjs","sources":["../../../projects/ship-ui/sh-form-field-experimental/sh-form-field-experimental.ts","../../../projects/ship-ui/sh-form-field-experimental/ship-ui-core-sh-form-field-experimental.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, effect } from '@angular/core';\nimport { createFormInputSignal } from '@ship-ui/core';\n\n@Component({\n selector: 'sh-form-field-experimental',\n imports: [],\n template: `\n <ng-content></ng-content>\n\n <button (click)=\"myClick()\">hello</button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipFormFieldExperimental {\n firstInput = createFormInputSignal();\n\n hello = effect(() => {\n console.log('hello', this.firstInput());\n });\n\n myClick() {\n this.firstInput.update((x) => x + 'hello');\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAaa,yBAAyB,CAAA;AAVtC,IAAA,WAAA,GAAA;QAWE,IAAA,CAAA,UAAU,GAAG,qBAAqB,EAAE;AAEpC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,MAAK;YAClB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC,CAAC;kFAAC;AAKH,IAAA;IAHC,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IAC5C;8GATW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAP1B;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAVrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,QAAQ,EAAE;;;;AAIT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;;;ACZD;;AAEG;;;;"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, input, model, effect, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
3
|
+
import { shipComponentClasses, contentProjectionSignal } from '@ship-ui/core';
|
|
4
|
+
|
|
5
|
+
class ShipAccordion {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.selfElement = inject((ElementRef)).nativeElement;
|
|
8
|
+
this.name = input(`sh-accordion-${Math.random().toString(36).substring(2, 9)}`, /* @ts-ignore */
|
|
9
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
10
|
+
this.value = model(null, /* @ts-ignore */
|
|
11
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
12
|
+
this.allowMultiple = input(false, /* @ts-ignore */
|
|
13
|
+
...(ngDevMode ? [{ debugName: "allowMultiple" }] : /* istanbul ignore next */ []));
|
|
14
|
+
this.variant = input(null, /* @ts-ignore */
|
|
15
|
+
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
16
|
+
this.size = input(null, /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
18
|
+
this.hostClasses = shipComponentClasses('accordion', {
|
|
19
|
+
variant: this.variant,
|
|
20
|
+
size: this.size,
|
|
21
|
+
});
|
|
22
|
+
this.items = contentProjectionSignal('details', {
|
|
23
|
+
childList: true,
|
|
24
|
+
subtree: true,
|
|
25
|
+
attributes: true,
|
|
26
|
+
attributeFilter: ['open', 'value'],
|
|
27
|
+
});
|
|
28
|
+
this.selfElement.addEventListener('toggle', this.onToggle.bind(this), true);
|
|
29
|
+
effect(() => {
|
|
30
|
+
const isMultiple = this.allowMultiple();
|
|
31
|
+
const groupName = this.name();
|
|
32
|
+
const valStr = this.value();
|
|
33
|
+
const vals = valStr ? valStr.split(',').filter((v) => v !== '') : [];
|
|
34
|
+
this.items().forEach((details) => {
|
|
35
|
+
if (!isMultiple) {
|
|
36
|
+
details.setAttribute('name', groupName);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
details.removeAttribute('name');
|
|
40
|
+
}
|
|
41
|
+
const summary = details.querySelector('summary');
|
|
42
|
+
if (summary && !summary.querySelector('sh-icon')) {
|
|
43
|
+
const icon = document.createElement('sh-icon');
|
|
44
|
+
icon.textContent = 'caret-down';
|
|
45
|
+
summary.appendChild(icon);
|
|
46
|
+
}
|
|
47
|
+
let contentWrapper = details.querySelector(':scope > .content');
|
|
48
|
+
if (!contentWrapper) {
|
|
49
|
+
const newWrapper = document.createElement('div');
|
|
50
|
+
newWrapper.className = 'content';
|
|
51
|
+
const childrenToMove = Array.from(details.childNodes).filter((node) => {
|
|
52
|
+
if (node.nodeType === Node.ELEMENT_NODE && node.tagName.toLowerCase() === 'summary') {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
childrenToMove.forEach((child) => newWrapper.appendChild(child));
|
|
58
|
+
details.appendChild(newWrapper);
|
|
59
|
+
contentWrapper = newWrapper;
|
|
60
|
+
}
|
|
61
|
+
const itemVal = details.getAttribute('value');
|
|
62
|
+
if (itemVal && vals.includes(itemVal)) {
|
|
63
|
+
// Avoid triggering endless loops by only setting open if it actually changed
|
|
64
|
+
if (!details.open)
|
|
65
|
+
details.open = true;
|
|
66
|
+
}
|
|
67
|
+
else if (itemVal) {
|
|
68
|
+
if (details.open)
|
|
69
|
+
details.open = false;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
onToggle(event) {
|
|
75
|
+
const target = event.target;
|
|
76
|
+
if (target.tagName !== 'DETAILS')
|
|
77
|
+
return;
|
|
78
|
+
if (!this.selfElement.contains(target))
|
|
79
|
+
return;
|
|
80
|
+
const itemVal = target.getAttribute('value');
|
|
81
|
+
if (!itemVal)
|
|
82
|
+
return; // Uncontrolled details element
|
|
83
|
+
const isOpen = target.open;
|
|
84
|
+
if (this.allowMultiple()) {
|
|
85
|
+
let vals = this.value()
|
|
86
|
+
? this.value()
|
|
87
|
+
.split(',')
|
|
88
|
+
.filter((v) => v !== '')
|
|
89
|
+
: [];
|
|
90
|
+
if (isOpen && !vals.includes(itemVal))
|
|
91
|
+
vals.push(itemVal);
|
|
92
|
+
if (!isOpen)
|
|
93
|
+
vals = vals.filter((v) => v !== itemVal);
|
|
94
|
+
this.value.set(vals.join(','));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
if (isOpen) {
|
|
98
|
+
this.value.set(itemVal);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
if (this.value() === itemVal) {
|
|
102
|
+
this.value.set(null);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAccordion, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
108
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: ShipAccordion, isStandalone: true, selector: "sh-accordion", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, allowMultiple: { classPropertyName: "allowMultiple", publicName: "allowMultiple", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.sh-accordion": "true", "class": "hostClasses()" } }, ngImport: i0, template: `
|
|
109
|
+
<ng-content></ng-content>
|
|
110
|
+
`, isInline: true, styles: ["sh-accordion{--acc-pad: 1rem;--acc-f: var(--paragraph-30);--acc-bc: var(--base-4);--acc-s: var(--shape-2);display:flex;flex-direction:column;border:var(--border-10);border-color:var(--acc-bc);border-radius:var(--acc-s);overflow:hidden;background:var(--base-1)}sh-accordion:empty{display:none}sh-accordion.small{--acc-pad: .75rem;--acc-f: var(--paragraph-40)}sh-accordion.type-b{--acc-s: 0;width:100%;height:100%;border:0;overflow:auto}sh-accordion.type-b>details:last-child{border-bottom:var(--border-10)}sh-accordion details{width:100%}sh-accordion details.disabled{opacity:.5;pointer-events:none}sh-accordion details.disabled summary{cursor:not-allowed}sh-accordion details>summary{list-style:none}sh-accordion details>summary::-webkit-details-marker{display:none}sh-accordion details>summary{display:flex;align-items:center;padding:var(--acc-pad);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s;font-weight:500;font-size:var(--acc-f);border-bottom:var(--border-10);border-color:var(--acc-bc)}sh-accordion details>summary:focus-visible{outline:2px solid var(--primary-8);outline-offset:-2px;border-radius:var(--acc-s)}sh-accordion details>summary sh-icon{transition:transform .2s cubic-bezier(.4,0,.2,1);color:var(--mono-11);margin-left:auto}sh-accordion details:last-child>summary{border-bottom:0}sh-accordion details[open]>summary{border-bottom:var(--border-10);border-color:var(--acc-bc)}sh-accordion details[open]>summary sh-icon{transform:rotate(180deg)}sh-accordion details[open]+details{border-top:var(--border-10);border-color:var(--acc-bc)}sh-accordion details>.content{padding:var(--acc-pad);background:var(--base-2)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
111
|
+
}
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipAccordion, decorators: [{
|
|
113
|
+
type: Component,
|
|
114
|
+
args: [{ selector: 'sh-accordion', encapsulation: ViewEncapsulation.None, template: `
|
|
115
|
+
<ng-content></ng-content>
|
|
116
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
117
|
+
'[class.sh-accordion]': 'true',
|
|
118
|
+
'[class]': 'hostClasses()',
|
|
119
|
+
}, styles: ["sh-accordion{--acc-pad: 1rem;--acc-f: var(--paragraph-30);--acc-bc: var(--base-4);--acc-s: var(--shape-2);display:flex;flex-direction:column;border:var(--border-10);border-color:var(--acc-bc);border-radius:var(--acc-s);overflow:hidden;background:var(--base-1)}sh-accordion:empty{display:none}sh-accordion.small{--acc-pad: .75rem;--acc-f: var(--paragraph-40)}sh-accordion.type-b{--acc-s: 0;width:100%;height:100%;border:0;overflow:auto}sh-accordion.type-b>details:last-child{border-bottom:var(--border-10)}sh-accordion details{width:100%}sh-accordion details.disabled{opacity:.5;pointer-events:none}sh-accordion details.disabled summary{cursor:not-allowed}sh-accordion details>summary{list-style:none}sh-accordion details>summary::-webkit-details-marker{display:none}sh-accordion details>summary{display:flex;align-items:center;padding:var(--acc-pad);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .2s;font-weight:500;font-size:var(--acc-f);border-bottom:var(--border-10);border-color:var(--acc-bc)}sh-accordion details>summary:focus-visible{outline:2px solid var(--primary-8);outline-offset:-2px;border-radius:var(--acc-s)}sh-accordion details>summary sh-icon{transition:transform .2s cubic-bezier(.4,0,.2,1);color:var(--mono-11);margin-left:auto}sh-accordion details:last-child>summary{border-bottom:0}sh-accordion details[open]>summary{border-bottom:var(--border-10);border-color:var(--acc-bc)}sh-accordion details[open]>summary sh-icon{transform:rotate(180deg)}sh-accordion details[open]+details{border-top:var(--border-10);border-color:var(--acc-bc)}sh-accordion details>.content{padding:var(--acc-pad);background:var(--base-2)}\n"] }]
|
|
120
|
+
}], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], allowMultiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowMultiple", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Generated bundle index. Do not edit.
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
export { ShipAccordion };
|
|
127
|
+
//# sourceMappingURL=ship-ui-core-ship-accordion.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-ui-core-ship-accordion.mjs","sources":["../../../projects/ship-ui/ship-accordion/ship-accordion.ts","../../../projects/ship-ui/ship-accordion/ship-ui-core-ship-accordion.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n model,\n ViewEncapsulation,\n} from '@angular/core';\nimport { contentProjectionSignal, shipComponentClasses, ShipVariant } from '@ship-ui/core';\n\n@Component({\n selector: 'sh-accordion',\n styleUrl: './ship-accordion.scss',\n encapsulation: ViewEncapsulation.None,\n template: `\n <ng-content></ng-content>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.sh-accordion]': 'true',\n '[class]': 'hostClasses()',\n },\n})\nexport class ShipAccordion {\n private selfElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n readonly name = input<string>(`sh-accordion-${Math.random().toString(36).substring(2, 9)}`);\n readonly value = model<string | null>(null);\n readonly allowMultiple = input<boolean>(false);\n readonly variant = input<ShipVariant | null>(null);\n readonly size = input<string | null>(null);\n\n hostClasses = shipComponentClasses('accordion', {\n variant: this.variant,\n size: this.size,\n });\n\n protected items = contentProjectionSignal<HTMLDetailsElement>('details', {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['open', 'value'],\n });\n\n constructor() {\n this.selfElement.addEventListener('toggle', this.onToggle.bind(this), true);\n\n effect(() => {\n const isMultiple = this.allowMultiple();\n const groupName = this.name();\n const valStr = this.value();\n const vals = valStr ? valStr.split(',').filter((v) => v !== '') : [];\n\n this.items().forEach((details) => {\n if (!isMultiple) {\n details.setAttribute('name', groupName);\n } else {\n details.removeAttribute('name');\n }\n\n const summary = details.querySelector('summary');\n if (summary && !summary.querySelector('sh-icon')) {\n const icon = document.createElement('sh-icon');\n icon.textContent = 'caret-down';\n summary.appendChild(icon);\n }\n\n let contentWrapper = details.querySelector(':scope > .content');\n\n if (!contentWrapper) {\n const newWrapper = document.createElement('div');\n newWrapper.className = 'content';\n const childrenToMove = Array.from(details.childNodes).filter((node) => {\n if (node.nodeType === Node.ELEMENT_NODE && (node as Element).tagName.toLowerCase() === 'summary') {\n return false;\n }\n return true;\n });\n childrenToMove.forEach((child) => newWrapper.appendChild(child));\n details.appendChild(newWrapper);\n contentWrapper = newWrapper;\n }\n\n const itemVal = details.getAttribute('value');\n if (itemVal && vals.includes(itemVal)) {\n // Avoid triggering endless loops by only setting open if it actually changed\n if (!details.open) details.open = true;\n } else if (itemVal) {\n if (details.open) details.open = false;\n }\n });\n });\n }\n\n onToggle(event: Event) {\n const target = event.target as HTMLDetailsElement;\n if (target.tagName !== 'DETAILS') return;\n if (!this.selfElement.contains(target)) return;\n\n const itemVal = target.getAttribute('value');\n if (!itemVal) return; // Uncontrolled details element\n\n const isOpen = target.open;\n\n if (this.allowMultiple()) {\n let vals = this.value()\n ? this.value()!\n .split(',')\n .filter((v) => v !== '')\n : [];\n if (isOpen && !vals.includes(itemVal)) vals.push(itemVal);\n if (!isOpen) vals = vals.filter((v) => v !== itemVal);\n this.value.set(vals.join(','));\n } else {\n if (isOpen) {\n this.value.set(itemVal);\n } else {\n if (this.value() === itemVal) {\n this.value.set(null);\n }\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -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
|