@ship-ui/core 0.19.5 → 0.22.2

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.
Files changed (153) hide show
  1. package/README.md +3 -0
  2. package/assets/mcp/components.json +66 -4243
  3. package/bin/mcp/index.js +6027 -273
  4. package/bin/ship-fg-scanner +0 -0
  5. package/bin/ship-fg.mjs +14 -12
  6. package/bin/src/subset.ts +3 -1
  7. package/fesm2022/ship-ui-core-sh-form-field-experimental.mjs +42 -0
  8. package/fesm2022/ship-ui-core-sh-form-field-experimental.mjs.map +1 -0
  9. package/fesm2022/ship-ui-core-ship-accordion.mjs +127 -0
  10. package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -0
  11. package/fesm2022/ship-ui-core-ship-alert.mjs +305 -0
  12. package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -0
  13. package/fesm2022/ship-ui-core-ship-blueprint.mjs +1156 -0
  14. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -0
  15. package/fesm2022/ship-ui-core-ship-button-group.mjs +41 -0
  16. package/fesm2022/ship-ui-core-ship-button-group.mjs.map +1 -0
  17. package/fesm2022/ship-ui-core-ship-button.mjs +38 -0
  18. package/fesm2022/ship-ui-core-ship-button.mjs.map +1 -0
  19. package/fesm2022/ship-ui-core-ship-card.mjs +35 -0
  20. package/fesm2022/ship-ui-core-ship-card.mjs.map +1 -0
  21. package/fesm2022/ship-ui-core-ship-checkbox.mjs +113 -0
  22. package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -0
  23. package/fesm2022/ship-ui-core-ship-chip.mjs +44 -0
  24. package/fesm2022/ship-ui-core-ship-chip.mjs.map +1 -0
  25. package/fesm2022/ship-ui-core-ship-color-picker.mjs +947 -0
  26. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -0
  27. package/fesm2022/ship-ui-core-ship-datepicker.mjs +951 -0
  28. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -0
  29. package/fesm2022/ship-ui-core-ship-dialog.mjs +263 -0
  30. package/fesm2022/ship-ui-core-ship-dialog.mjs.map +1 -0
  31. package/fesm2022/ship-ui-core-ship-divider.mjs +22 -0
  32. package/fesm2022/ship-ui-core-ship-divider.mjs.map +1 -0
  33. package/fesm2022/ship-ui-core-ship-event-card.mjs +50 -0
  34. package/fesm2022/ship-ui-core-ship-event-card.mjs.map +1 -0
  35. package/fesm2022/ship-ui-core-ship-file-upload.mjs +112 -0
  36. package/fesm2022/ship-ui-core-ship-file-upload.mjs.map +1 -0
  37. package/fesm2022/ship-ui-core-ship-form-field.mjs +310 -0
  38. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -0
  39. package/fesm2022/ship-ui-core-ship-icon.mjs +81 -0
  40. package/fesm2022/ship-ui-core-ship-icon.mjs.map +1 -0
  41. package/fesm2022/ship-ui-core-ship-list.mjs +22 -0
  42. package/fesm2022/ship-ui-core-ship-list.mjs.map +1 -0
  43. package/fesm2022/ship-ui-core-ship-menu.mjs +545 -0
  44. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -0
  45. package/fesm2022/ship-ui-core-ship-popover.mjs +286 -0
  46. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -0
  47. package/fesm2022/ship-ui-core-ship-progress-bar.mjs +37 -0
  48. package/fesm2022/ship-ui-core-ship-progress-bar.mjs.map +1 -0
  49. package/fesm2022/ship-ui-core-ship-radio.mjs +102 -0
  50. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -0
  51. package/fesm2022/ship-ui-core-ship-range-slider.mjs +277 -0
  52. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -0
  53. package/fesm2022/ship-ui-core-ship-select.mjs +971 -0
  54. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -0
  55. package/fesm2022/ship-ui-core-ship-sidenav.mjs +248 -0
  56. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -0
  57. package/fesm2022/ship-ui-core-ship-sortable.mjs +485 -0
  58. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -0
  59. package/fesm2022/ship-ui-core-ship-spinner.mjs +28 -0
  60. package/fesm2022/ship-ui-core-ship-spinner.mjs.map +1 -0
  61. package/fesm2022/ship-ui-core-ship-stepper.mjs +76 -0
  62. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -0
  63. package/fesm2022/ship-ui-core-ship-table-filter-bar.mjs +28 -0
  64. package/fesm2022/ship-ui-core-ship-table-filter-bar.mjs.map +1 -0
  65. package/fesm2022/ship-ui-core-ship-table.mjs +442 -0
  66. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -0
  67. package/fesm2022/ship-ui-core-ship-tabs.mjs +38 -0
  68. package/fesm2022/ship-ui-core-ship-tabs.mjs.map +1 -0
  69. package/fesm2022/ship-ui-core-ship-theme-toggle.mjs +119 -0
  70. package/fesm2022/ship-ui-core-ship-theme-toggle.mjs.map +1 -0
  71. package/fesm2022/ship-ui-core-ship-toggle-card.mjs +75 -0
  72. package/fesm2022/ship-ui-core-ship-toggle-card.mjs.map +1 -0
  73. package/fesm2022/ship-ui-core-ship-toggle.mjs +105 -0
  74. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -0
  75. package/fesm2022/ship-ui-core-ship-virtual-scroll.mjs +186 -0
  76. package/fesm2022/ship-ui-core-ship-virtual-scroll.mjs.map +1 -0
  77. package/fesm2022/ship-ui-core.mjs +880 -8782
  78. package/fesm2022/ship-ui-core.mjs.map +1 -1
  79. package/package.json +147 -3
  80. package/styles/core.scss +43 -0
  81. package/styles/helpers.scss +2 -0
  82. package/styles/index.scss +12 -123
  83. package/types/ship-ui-core-sh-form-field-experimental.d.ts +11 -0
  84. package/types/ship-ui-core-ship-accordion.d.ts +19 -0
  85. package/types/ship-ui-core-ship-alert.d.ts +68 -0
  86. package/types/ship-ui-core-ship-blueprint.d.ts +112 -0
  87. package/types/ship-ui-core-ship-button-group.d.ts +15 -0
  88. package/types/ship-ui-core-ship-button.d.ts +13 -0
  89. package/types/ship-ui-core-ship-card.d.ts +11 -0
  90. package/types/ship-ui-core-ship-checkbox.d.ts +22 -0
  91. package/types/ship-ui-core-ship-chip.d.ts +15 -0
  92. package/types/ship-ui-core-ship-color-picker.d.ts +105 -0
  93. package/types/ship-ui-core-ship-datepicker.d.ts +96 -0
  94. package/types/ship-ui-core-ship-dialog.d.ts +76 -0
  95. package/types/ship-ui-core-ship-divider.d.ts +8 -0
  96. package/types/ship-ui-core-ship-event-card.d.ts +11 -0
  97. package/types/ship-ui-core-ship-file-upload.d.ts +20 -0
  98. package/types/ship-ui-core-ship-form-field.d.ts +32 -0
  99. package/types/ship-ui-core-ship-icon.d.ts +18 -0
  100. package/types/ship-ui-core-ship-list.d.ts +8 -0
  101. package/types/ship-ui-core-ship-menu.d.ts +49 -0
  102. package/types/ship-ui-core-ship-popover.d.ts +40 -0
  103. package/types/ship-ui-core-ship-progress-bar.d.ts +14 -0
  104. package/types/ship-ui-core-ship-radio.d.ts +22 -0
  105. package/types/ship-ui-core-ship-range-slider.d.ts +31 -0
  106. package/types/ship-ui-core-ship-select.d.ts +81 -0
  107. package/types/ship-ui-core-ship-sidenav.d.ts +36 -0
  108. package/types/ship-ui-core-ship-sortable.d.ts +72 -0
  109. package/types/ship-ui-core-ship-spinner.d.ts +10 -0
  110. package/types/ship-ui-core-ship-stepper.d.ts +13 -0
  111. package/types/ship-ui-core-ship-table-filter-bar.d.ts +8 -0
  112. package/types/ship-ui-core-ship-table.d.ts +69 -0
  113. package/types/ship-ui-core-ship-tabs.d.ts +14 -0
  114. package/types/ship-ui-core-ship-theme-toggle.d.ts +28 -0
  115. package/types/ship-ui-core-ship-toggle-card.d.ts +15 -0
  116. package/types/ship-ui-core-ship-toggle.d.ts +21 -0
  117. package/types/ship-ui-core-ship-virtual-scroll.d.ts +22 -0
  118. package/types/ship-ui-core.d.ts +88 -1070
  119. package/styles/components/ship-accordion.scss +0 -113
  120. package/styles/components/ship-alert-container.scss +0 -49
  121. package/styles/components/ship-alert.scss +0 -177
  122. package/styles/components/ship-blueprint.scss +0 -242
  123. package/styles/components/ship-button-group.scss +0 -165
  124. package/styles/components/ship-button.scss +0 -141
  125. package/styles/components/ship-card.scss +0 -57
  126. package/styles/components/ship-checkbox.scss +0 -116
  127. package/styles/components/ship-chip.scss +0 -104
  128. package/styles/components/ship-color-picker.scss +0 -150
  129. package/styles/components/ship-datepicker.scss +0 -317
  130. package/styles/components/ship-dialog.scss +0 -152
  131. package/styles/components/ship-divider.scss +0 -27
  132. package/styles/components/ship-event-card.scss +0 -51
  133. package/styles/components/ship-file-upload.scss +0 -47
  134. package/styles/components/ship-form-field.scss +0 -408
  135. package/styles/components/ship-icon.scss +0 -54
  136. package/styles/components/ship-list.scss +0 -165
  137. package/styles/components/ship-menu.scss +0 -237
  138. package/styles/components/ship-popover.scss +0 -205
  139. package/styles/components/ship-progress-bar.scss +0 -173
  140. package/styles/components/ship-radio.scss +0 -113
  141. package/styles/components/ship-range-slider.scss +0 -421
  142. package/styles/components/ship-select.scss +0 -153
  143. package/styles/components/ship-sidenav.scss +0 -195
  144. package/styles/components/ship-sortable.scss +0 -45
  145. package/styles/components/ship-spinner.scss +0 -53
  146. package/styles/components/ship-stepper.scss +0 -158
  147. package/styles/components/ship-table.scss +0 -443
  148. package/styles/components/ship-tabs.scss +0 -125
  149. package/styles/components/ship-theme-toggle.scss +0 -41
  150. package/styles/components/ship-toggle-card.scss +0 -69
  151. package/styles/components/ship-toggle.scss +0 -255
  152. package/styles/components/ship-tooltip.scss +0 -151
  153. package/styles/components/ship-virtual-scroll.scss +0 -12
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 wasmPath = require2.resolve("harfbuzzjs/hb-subset.wasm");
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 = dirname(fileURLToPath(import.meta.url));
3328
+ var _dirname = dirname2(fileURLToPath(import.meta.url));
3327
3329
  var CWD_PATH = process.cwd();
3328
- var PHOSPHOR_SRC_PATH = resolve(CWD_PATH, "node_modules", "@phosphor-icons", "web", "src");
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 = resolve(shipUiDir, "package.json");
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 = resolve(dir, entry.name);
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 = resolve(CWD_PATH2, "node_modules", "@phosphor-icons", "web", "src", variant, "selection.json");
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 = resolve(actualDir, "./ship-fg-scanner");
3434
- const shipUiDir = resolve(actualDir, "../");
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 = resolve(actualDir, "../package.json");
3594
+ const packageJsonPath = resolve2(actualDir, "../package.json");
3593
3595
  const PROJECT_SRC = values.src;
3594
3596
  const PROJECT_PUBLIC = values.out;
3595
- const selectionJsonPath = resolve(PHOSPHOR_SRC_PATH, "regular", "selection.json");
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) => resolve(join(PROJECT_SRC, filename)).includes(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 wasmPath = require.resolve('harfbuzzjs/hb-subset.wasm');
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