@ship-ui/core 0.22.15 → 0.22.17

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 (69) hide show
  1. package/assets/mcp/components.json +213 -47
  2. package/bin/src/subset.ts +6 -6
  3. package/bin/src/utilities.ts +14 -14
  4. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs +12 -86
  5. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs.map +1 -1
  6. package/fesm2022/ship-ui-core-ship-accordion.mjs +4 -3
  7. package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -1
  8. package/fesm2022/ship-ui-core-ship-alert.mjs +1 -4
  9. package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -1
  10. package/fesm2022/ship-ui-core-ship-blueprint.mjs +17 -11
  11. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -1
  12. package/fesm2022/ship-ui-core-ship-checkbox.mjs +3 -2
  13. package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -1
  14. package/fesm2022/ship-ui-core-ship-color-picker.mjs +66 -62
  15. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -1
  16. package/fesm2022/ship-ui-core-ship-datepicker.mjs +24 -16
  17. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
  18. package/fesm2022/ship-ui-core-ship-dialog.mjs +4 -0
  19. package/fesm2022/ship-ui-core-ship-dialog.mjs.map +1 -1
  20. package/fesm2022/ship-ui-core-ship-editor.mjs +0 -42
  21. package/fesm2022/ship-ui-core-ship-editor.mjs.map +1 -1
  22. package/fesm2022/ship-ui-core-ship-form-field.mjs +0 -1
  23. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -1
  24. package/fesm2022/ship-ui-core-ship-kbd.mjs +0 -6
  25. package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -1
  26. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs +241 -0
  27. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs.map +1 -0
  28. package/fesm2022/ship-ui-core-ship-menu.mjs +7 -10
  29. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -1
  30. package/fesm2022/ship-ui-core-ship-popover.mjs +5 -20
  31. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -1
  32. package/fesm2022/ship-ui-core-ship-radio.mjs +3 -2
  33. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -1
  34. package/fesm2022/ship-ui-core-ship-range-slider.mjs +7 -9
  35. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -1
  36. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
  37. package/fesm2022/ship-ui-core-ship-sidenav.mjs +2 -2
  38. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -1
  39. package/fesm2022/ship-ui-core-ship-sortable.mjs +262 -68
  40. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -1
  41. package/fesm2022/ship-ui-core-ship-spotlight.mjs +0 -11
  42. package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -1
  43. package/fesm2022/ship-ui-core-ship-stepper.mjs +1 -1
  44. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -1
  45. package/fesm2022/ship-ui-core-ship-table.mjs +426 -23
  46. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
  47. package/fesm2022/ship-ui-core-ship-toggle.mjs +3 -2
  48. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -1
  49. package/fesm2022/ship-ui-core-ship-tree.mjs +1 -9
  50. package/fesm2022/ship-ui-core-ship-tree.mjs.map +1 -1
  51. package/fesm2022/ship-ui-core.mjs +37 -53
  52. package/fesm2022/ship-ui-core.mjs.map +1 -1
  53. package/package.json +5 -1
  54. package/types/ship-ui-core-ship-a11y-keybindings.d.ts +0 -55
  55. package/types/ship-ui-core-ship-accordion.d.ts +7 -7
  56. package/types/ship-ui-core-ship-blueprint.d.ts +2 -1
  57. package/types/ship-ui-core-ship-checkbox.d.ts +2 -3
  58. package/types/ship-ui-core-ship-color-picker.d.ts +1 -25
  59. package/types/ship-ui-core-ship-datepicker.d.ts +2 -3
  60. package/types/ship-ui-core-ship-editor.d.ts +10 -10
  61. package/types/ship-ui-core-ship-list-item-swipe.d.ts +25 -0
  62. package/types/ship-ui-core-ship-menu.d.ts +1 -2
  63. package/types/ship-ui-core-ship-radio.d.ts +2 -3
  64. package/types/ship-ui-core-ship-range-slider.d.ts +6 -6
  65. package/types/ship-ui-core-ship-sortable.d.ts +31 -9
  66. package/types/ship-ui-core-ship-table.d.ts +12 -1
  67. package/types/ship-ui-core-ship-toggle.d.ts +2 -3
  68. package/types/ship-ui-core-ship-tree.d.ts +20 -25
  69. package/types/ship-ui-core.d.ts +17 -24
@@ -4,19 +4,13 @@ import { isPlatformBrowser } from '@angular/common';
4
4
 
5
5
  const SHIP_A11Y_KEYBINDINGS_OVERRIDE = new InjectionToken('SHIP_A11Y_KEYBINDINGS_OVERRIDE');
6
6
 
7
- /**
8
- * Parses a keybinding shortcut string shorthand into a structured ParsedKeybinding object.
9
- * Supporting modifiers: ctrlOrCmd (OS adaptive), ctrl, cmd/meta, alt/option, shift.
10
- */
11
7
  function parseKeybinding(shorthand, isMacPlatform) {
12
8
  const parts = shorthand.split('+').map(p => p.trim().toLowerCase());
13
9
  let ctrlKey = false;
14
10
  let metaKey = false;
15
11
  let altKey = false;
16
12
  let shiftKey = false;
17
- // The last part is the key/code
18
13
  const keyPart = parts[parts.length - 1] || '';
19
- // Parse any preceding parts as modifier keys
20
14
  for (let i = 0; i < parts.length - 1; i++) {
21
15
  const modifier = parts[i];
22
16
  if (modifier === 'ctrlorcmd') {
@@ -43,10 +37,9 @@ function parseKeybinding(shorthand, isMacPlatform) {
43
37
  let key;
44
38
  let code;
45
39
  if (keyPart.startsWith('key') || keyPart.startsWith('digit')) {
46
- code = keyPart; // Matches event.code (case-insensitive)
40
+ code = keyPart;
47
41
  }
48
42
  else {
49
- // Map standard key names to event.key representation
50
43
  if (keyPart === 'enter') {
51
44
  key = 'enter';
52
45
  }
@@ -90,14 +83,11 @@ function parseKeybinding(shorthand, isMacPlatform) {
90
83
  key = 'pagedown';
91
84
  }
92
85
  else {
93
- key = keyPart; // Raw key name
86
+ key = keyPart;
94
87
  }
95
88
  }
96
89
  return { ctrlKey, metaKey, altKey, shiftKey, key, code };
97
90
  }
98
- /**
99
- * Checks if a KeyboardEvent matches a ParsedKeybinding structure.
100
- */
101
91
  function matchKeybinding(event, parsed) {
102
92
  if (event.ctrlKey !== parsed.ctrlKey)
103
93
  return false;
@@ -118,10 +108,6 @@ function matchKeybinding(event, parsed) {
118
108
  }
119
109
  return false;
120
110
  }
121
- /**
122
- * Formats a shorthand shortcut string into an OS-specific user-friendly string for display.
123
- * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, and 'Ctrl+Shift+K' on Windows/Linux.
124
- */
125
111
  function formatShortcut(shorthand, isMacPlatform) {
126
112
  const parts = shorthand.split('+').map(p => p.trim());
127
113
  const formattedParts = [];
@@ -146,15 +132,13 @@ function formatShortcut(shorthand, isMacPlatform) {
146
132
  }
147
133
  }
148
134
  else {
149
- // Key/code part
150
135
  if (lowerPart.startsWith('key')) {
151
- formattedParts.push(part.substring(3).toUpperCase()); // E.g. KeyA -> A
136
+ formattedParts.push(part.substring(3).toUpperCase());
152
137
  }
153
138
  else if (lowerPart.startsWith('digit')) {
154
- formattedParts.push(part.substring(5)); // E.g. Digit1 -> 1
139
+ formattedParts.push(part.substring(5));
155
140
  }
156
141
  else {
157
- // Capitalize first letter of standard keys
158
142
  const capitalized = part.charAt(0).toUpperCase() + part.slice(1);
159
143
  formattedParts.push(capitalized);
160
144
  }
@@ -169,7 +153,6 @@ function formatShortcut(shorthand, isMacPlatform) {
169
153
  }
170
154
 
171
155
  const DEFAULT_KEYBINDINGS = {
172
- // Datepicker
173
156
  'datepicker.prev-month': 'PageUp',
174
157
  'datepicker.next-month': 'PageDown',
175
158
  'datepicker.prev-year': 'Shift+PageUp',
@@ -180,39 +163,37 @@ const DEFAULT_KEYBINDINGS = {
180
163
  'datepicker.day-prev': 'ArrowLeft, a',
181
164
  'datepicker.week-next': 'ArrowDown, s',
182
165
  'datepicker.week-prev': 'ArrowUp, w',
183
- // Selection Group (Tabs, Steppers, Button Groups)
184
166
  'selection-group.next': 'ArrowRight, ArrowDown, d, s',
185
167
  'selection-group.prev': 'ArrowLeft, ArrowUp, a, w',
186
168
  'selection-group.select': 'Enter, space',
187
- // Select
188
169
  'select.next': 'ArrowDown, s',
189
170
  'select.prev': 'ArrowUp, w',
190
171
  'select.select': 'Enter, space',
191
172
  'select.close': 'Escape',
192
- // Menu
193
173
  'menu.next': 'ArrowDown, s',
194
174
  'menu.prev': 'ArrowUp, w',
195
175
  'menu.open-submenu': 'ArrowRight, d',
196
176
  'menu.close-submenu': 'ArrowLeft, a',
197
177
  'menu.select': 'Enter, space',
198
- // Spotlight
199
178
  'spotlight.next': 'ArrowDown, s',
200
179
  'spotlight.prev': 'ArrowUp, w',
201
180
  'spotlight.open': 'ctrlOrCmd+k',
202
- // Dialog & Popover
203
181
  'dialog.close': 'Escape',
204
182
  'popover.close': 'Escape',
205
- // Toggle Card
206
183
  'toggle-card.toggle': 'Enter, space',
207
- // Form Controls
208
184
  'checkbox.toggle': 'Enter, space',
209
185
  'toggle.toggle': 'Enter, space',
210
186
  'radio.select': 'Enter, space',
211
- // Table
212
187
  'table.sort': 'Enter, space',
213
- // Blueprint
188
+ 'table.column-resize-decrease': 'Shift+ArrowLeft',
189
+ 'table.column-resize-increase': 'Shift+ArrowRight',
190
+ 'grid.focus-up': 'ArrowUp, w',
191
+ 'grid.focus-down': 'ArrowDown, s',
192
+ 'grid.focus-left': 'ArrowLeft, a',
193
+ 'grid.focus-right': 'ArrowRight, d',
194
+ 'grid.focus-first': 'Home',
195
+ 'grid.focus-last': 'End',
214
196
  'blueprint.cancel': 'Escape',
215
- // Editor Toolbar
216
197
  'editor-toolbar.next': 'ArrowRight, ArrowDown',
217
198
  'editor-toolbar.prev': 'ArrowLeft, ArrowUp',
218
199
  'editor-toolbar.home': 'Home',
@@ -221,13 +202,8 @@ const DEFAULT_KEYBINDINGS = {
221
202
  class ShipA11yKeybindingsService {
222
203
  #platformId = inject(PLATFORM_ID);
223
204
  #overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });
224
- // Store of action names to active shortcut strings
225
205
  #bindings = new Map();
226
- // Store of action names to default shortcut strings
227
206
  #defaults = new Map();
228
- /**
229
- * Returns true if the platform is running on macOS.
230
- */
231
207
  get isMac() {
232
208
  if (!isPlatformBrowser(this.#platformId))
233
209
  return false;
@@ -239,44 +215,25 @@ class ShipA11yKeybindingsService {
239
215
  this.registerOverrides(this.#overrides);
240
216
  }
241
217
  }
242
- /**
243
- * Registers default shortcuts for actions.
244
- * If an override already exists for a given action, the override takes precedence.
245
- */
246
218
  registerDefaults(defaults) {
247
219
  for (const [action, shortcut] of Object.entries(defaults)) {
248
220
  this.#defaults.set(action, shortcut);
249
- // If we don't have an override/binding for this action, set it as the active binding
250
221
  if (!this.#bindings.has(action)) {
251
222
  this.#bindings.set(action, shortcut);
252
223
  }
253
224
  }
254
225
  }
255
- /**
256
- * Registers overrides for actions. Overwrites any existing or default bindings.
257
- */
258
226
  registerOverrides(overrides) {
259
227
  for (const [action, shortcut] of Object.entries(overrides)) {
260
228
  this.#bindings.set(action, shortcut);
261
229
  }
262
230
  }
263
- /**
264
- * Retrieves the active shortcut string for a registered action.
265
- */
266
231
  getShortcut(action) {
267
232
  return this.#bindings.get(action);
268
233
  }
269
- /**
270
- * Retrieves the default shortcut string for a registered action.
271
- */
272
234
  getDefaultShortcut(action) {
273
235
  return this.#defaults.get(action);
274
236
  }
275
- /**
276
- * Gets a formatted, user-friendly shortcut string for display.
277
- * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, 'Ctrl+Shift+K' on Windows/Linux.
278
- * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d' -> 'ArrowRight, D').
279
- */
280
237
  getDisplayShortcut(action) {
281
238
  const shortcut = this.getShortcut(action);
282
239
  if (!shortcut)
@@ -286,10 +243,6 @@ class ShipA11yKeybindingsService {
286
243
  .map((part) => formatShortcut(part.trim(), this.isMac))
287
244
  .join(', ');
288
245
  }
289
- /**
290
- * Checks if a KeyboardEvent matches the configured keybinding for a given action.
291
- * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d').
292
- */
293
246
  matches(event, action) {
294
247
  const shortcut = this.getShortcut(action);
295
248
  if (!shortcut)
@@ -319,37 +272,19 @@ class ShipA11yKeybindingsDirective {
319
272
  this.#elementRef = inject((ElementRef));
320
273
  this.#renderer = inject(Renderer2);
321
274
  this.#platformId = inject(PLATFORM_ID);
322
- /**
323
- * The registered action name (e.g. 'table.next-page', 'dialog.close').
324
- */
325
275
  this.shA11yKeybinding = input.required(/* @ts-ignore */
326
276
  ...(ngDevMode ? [{ debugName: "shA11yKeybinding" }] : /* istanbul ignore next */ []));
327
- /**
328
- * Defines whether the keybinding listener is 'local' (host element keydown) or 'global' (window keydown).
329
- * Default is 'local'.
330
- */
331
277
  this.mode = input('local', /* @ts-ignore */
332
278
  ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
333
- /**
334
- * Whether to prevent the default action when the keybinding matches.
335
- */
336
279
  this.preventDefault = input(true, /* @ts-ignore */
337
280
  ...(ngDevMode ? [{ debugName: "preventDefault" }] : /* istanbul ignore next */ []));
338
- /**
339
- * Whether to stop event propagation when the keybinding matches.
340
- */
341
281
  this.stopPropagation = input(true, /* @ts-ignore */
342
282
  ...(ngDevMode ? [{ debugName: "stopPropagation" }] : /* istanbul ignore next */ []));
343
- /**
344
- * Event emitted when the keybinding is triggered.
345
- */
346
283
  this.triggered = output();
347
- // Dynamic effect to update aria-keyshortcuts on the host element when binding or service config changes
348
284
  effect(() => {
349
285
  const action = this.shA11yKeybinding();
350
286
  const shortcut = this.#service.getShortcut(action);
351
287
  if (shortcut) {
352
- // Set the standardized shortcut string for screen reader accessibility
353
288
  const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;
354
289
  this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);
355
290
  }
@@ -357,11 +292,9 @@ class ShipA11yKeybindingsDirective {
357
292
  this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');
358
293
  }
359
294
  });
360
- // Dynamic effect for global keydown event subscription when mode is 'global'
361
295
  effect((onCleanup) => {
362
296
  if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {
363
297
  const listener = (event) => {
364
- // Avoid firing global hotkeys when typing in editable elements unless modifiers (Ctrl/Cmd/Alt) are pressed
365
298
  if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {
366
299
  return;
367
300
  }
@@ -374,9 +307,6 @@ class ShipA11yKeybindingsDirective {
374
307
  }
375
308
  });
376
309
  }
377
- /**
378
- * Local keydown listener when mode is 'local'
379
- */
380
310
  onKeyDown(event) {
381
311
  if (this.mode() === 'local') {
382
312
  this.#checkAndTrigger(event);
@@ -392,16 +322,12 @@ class ShipA11yKeybindingsDirective {
392
322
  event.stopPropagation();
393
323
  }
394
324
  this.triggered.emit(event);
395
- // Declaratively invoke click() on host elements that support it (buttons, anchors, inputs, etc.)
396
325
  const hostEl = this.#elementRef.nativeElement;
397
326
  if (typeof hostEl.click === 'function') {
398
327
  hostEl.click();
399
328
  }
400
329
  }
401
330
  }
402
- /**
403
- * Returns true if focus is in a text input or editable element.
404
- */
405
331
  #isFocusInInput() {
406
332
  const activeEl = document.activeElement;
407
333
  if (!activeEl)
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-a11y-keybindings.mjs","sources":["../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings-override.token.ts","../../../projects/ship-ui/ship-a11y-keybindings/keybinding-utils.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.service.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.directive.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-ui-core-ship-a11y-keybindings.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const SHIP_A11Y_KEYBINDINGS_OVERRIDE = new InjectionToken<Record<string, string>>('SHIP_A11Y_KEYBINDINGS_OVERRIDE');\n","export interface ParsedKeybinding {\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n shiftKey: boolean;\n key?: string;\n code?: string;\n}\n\n/**\n * Parses a keybinding shortcut string shorthand into a structured ParsedKeybinding object.\n * Supporting modifiers: ctrlOrCmd (OS adaptive), ctrl, cmd/meta, alt/option, shift.\n */\nexport function parseKeybinding(shorthand: string, isMacPlatform: boolean): ParsedKeybinding {\n const parts = shorthand.split('+').map(p => p.trim().toLowerCase());\n \n let ctrlKey = false;\n let metaKey = false;\n let altKey = false;\n let shiftKey = false;\n \n // The last part is the key/code\n const keyPart = parts[parts.length - 1] || '';\n \n // Parse any preceding parts as modifier keys\n for (let i = 0; i < parts.length - 1; i++) {\n const modifier = parts[i];\n if (modifier === 'ctrlorcmd') {\n if (isMacPlatform) {\n metaKey = true;\n } else {\n ctrlKey = true;\n }\n } else if (modifier === 'ctrl') {\n ctrlKey = true;\n } else if (modifier === 'meta' || modifier === 'cmd') {\n metaKey = true;\n } else if (modifier === 'alt' || modifier === 'option') {\n altKey = true;\n } else if (modifier === 'shift') {\n shiftKey = true;\n }\n }\n \n let key: string | undefined;\n let code: string | undefined;\n \n if (keyPart.startsWith('key') || keyPart.startsWith('digit')) {\n code = keyPart; // Matches event.code (case-insensitive)\n } else {\n // Map standard key names to event.key representation\n if (keyPart === 'enter') {\n key = 'enter';\n } else if (keyPart === 'esc' || keyPart === 'escape') {\n key = 'escape';\n } else if (keyPart === 'space') {\n key = ' ';\n } else if (keyPart === 'tab') {\n key = 'tab';\n } else if (keyPart === 'backspace') {\n key = 'backspace';\n } else if (keyPart === 'delete') {\n key = 'delete';\n } else if (keyPart === 'up' || keyPart === 'arrowup') {\n key = 'arrowup';\n } else if (keyPart === 'down' || keyPart === 'arrowdown') {\n key = 'arrowdown';\n } else if (keyPart === 'left' || keyPart === 'arrowleft') {\n key = 'arrowleft';\n } else if (keyPart === 'right' || keyPart === 'arrowright') {\n key = 'arrowright';\n } else if (keyPart === 'home') {\n key = 'home';\n } else if (keyPart === 'end') {\n key = 'end';\n } else if (keyPart === 'pageup') {\n key = 'pageup';\n } else if (keyPart === 'pagedown') {\n key = 'pagedown';\n } else {\n key = keyPart; // Raw key name\n }\n }\n \n return { ctrlKey, metaKey, altKey, shiftKey, key, code };\n}\n\n/**\n * Checks if a KeyboardEvent matches a ParsedKeybinding structure.\n */\nexport function matchKeybinding(event: KeyboardEvent, parsed: ParsedKeybinding): boolean {\n if (event.ctrlKey !== parsed.ctrlKey) return false;\n if (event.metaKey !== parsed.metaKey) return false;\n if (event.altKey !== parsed.altKey) return false;\n if (event.shiftKey !== parsed.shiftKey) return false;\n \n if (parsed.code) {\n return event.code.toLowerCase() === parsed.code;\n }\n if (parsed.key) {\n if (parsed.key === ' ') {\n return event.key === ' ' || event.key === 'Spacebar';\n }\n return event.key.toLowerCase() === parsed.key;\n }\n \n return false;\n}\n\n/**\n * Formats a shorthand shortcut string into an OS-specific user-friendly string for display.\n * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, and 'Ctrl+Shift+K' on Windows/Linux.\n */\nexport function formatShortcut(shorthand: string, isMacPlatform: boolean): string {\n const parts = shorthand.split('+').map(p => p.trim());\n const formattedParts: string[] = [];\n \n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const lowerPart = part.toLowerCase();\n \n if (i < parts.length - 1) {\n if (lowerPart === 'ctrlorcmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Ctrl');\n } else if (lowerPart === 'ctrl') {\n formattedParts.push(isMacPlatform ? '⌃' : 'Ctrl');\n } else if (lowerPart === 'meta' || lowerPart === 'cmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Win');\n } else if (lowerPart === 'alt' || lowerPart === 'option') {\n formattedParts.push(isMacPlatform ? '⌥' : 'Alt');\n } else if (lowerPart === 'shift') {\n formattedParts.push(isMacPlatform ? '⇧' : 'Shift');\n }\n } else {\n // Key/code part\n if (lowerPart.startsWith('key')) {\n formattedParts.push(part.substring(3).toUpperCase()); // E.g. KeyA -> A\n } else if (lowerPart.startsWith('digit')) {\n formattedParts.push(part.substring(5)); // E.g. Digit1 -> 1\n } else {\n // Capitalize first letter of standard keys\n const capitalized = part.charAt(0).toUpperCase() + part.slice(1);\n formattedParts.push(capitalized);\n }\n }\n }\n \n if (isMacPlatform) {\n return formattedParts.join('');\n } else {\n return formattedParts.join('+');\n }\n}\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SHIP_A11Y_KEYBINDINGS_OVERRIDE } from './ship-a11y-keybindings-override.token';\nimport { parseKeybinding, matchKeybinding, formatShortcut } from './keybinding-utils';\n\nexport const DEFAULT_KEYBINDINGS: Record<string, string> = {\n // Datepicker\n 'datepicker.prev-month': 'PageUp',\n 'datepicker.next-month': 'PageDown',\n 'datepicker.prev-year': 'Shift+PageUp',\n 'datepicker.next-year': 'Shift+PageDown',\n 'datepicker.month-start': 'Home',\n 'datepicker.month-end': 'End',\n 'datepicker.day-next': 'ArrowRight, d',\n 'datepicker.day-prev': 'ArrowLeft, a',\n 'datepicker.week-next': 'ArrowDown, s',\n 'datepicker.week-prev': 'ArrowUp, w',\n\n // Selection Group (Tabs, Steppers, Button Groups)\n 'selection-group.next': 'ArrowRight, ArrowDown, d, s',\n 'selection-group.prev': 'ArrowLeft, ArrowUp, a, w',\n 'selection-group.select': 'Enter, space',\n\n // Select\n 'select.next': 'ArrowDown, s',\n 'select.prev': 'ArrowUp, w',\n 'select.select': 'Enter, space',\n 'select.close': 'Escape',\n\n // Menu\n 'menu.next': 'ArrowDown, s',\n 'menu.prev': 'ArrowUp, w',\n 'menu.open-submenu': 'ArrowRight, d',\n 'menu.close-submenu': 'ArrowLeft, a',\n 'menu.select': 'Enter, space',\n\n // Spotlight\n 'spotlight.next': 'ArrowDown, s',\n 'spotlight.prev': 'ArrowUp, w',\n 'spotlight.open': 'ctrlOrCmd+k',\n\n // Dialog & Popover\n 'dialog.close': 'Escape',\n 'popover.close': 'Escape',\n\n // Toggle Card\n 'toggle-card.toggle': 'Enter, space',\n\n // Form Controls\n 'checkbox.toggle': 'Enter, space',\n 'toggle.toggle': 'Enter, space',\n 'radio.select': 'Enter, space',\n\n // Table\n 'table.sort': 'Enter, space',\n\n // Blueprint\n 'blueprint.cancel': 'Escape',\n\n // Editor Toolbar\n 'editor-toolbar.next': 'ArrowRight, ArrowDown',\n 'editor-toolbar.prev': 'ArrowLeft, ArrowUp',\n 'editor-toolbar.home': 'Home',\n 'editor-toolbar.end': 'End',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipA11yKeybindingsService {\n readonly #platformId = inject(PLATFORM_ID);\n readonly #overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });\n \n // Store of action names to active shortcut strings\n readonly #bindings = new Map<string, string>();\n \n // Store of action names to default shortcut strings\n readonly #defaults = new Map<string, string>();\n\n /**\n * Returns true if the platform is running on macOS.\n */\n get isMac(): boolean {\n if (!isPlatformBrowser(this.#platformId)) return false;\n return navigator.userAgent.toLowerCase().includes('mac');\n }\n\n constructor() {\n this.registerDefaults(DEFAULT_KEYBINDINGS);\n if (this.#overrides) {\n this.registerOverrides(this.#overrides);\n }\n }\n\n /**\n * Registers default shortcuts for actions.\n * If an override already exists for a given action, the override takes precedence.\n */\n registerDefaults(defaults: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(defaults)) {\n this.#defaults.set(action, shortcut);\n \n // If we don't have an override/binding for this action, set it as the active binding\n if (!this.#bindings.has(action)) {\n this.#bindings.set(action, shortcut);\n }\n }\n }\n\n /**\n * Registers overrides for actions. Overwrites any existing or default bindings.\n */\n registerOverrides(overrides: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(overrides)) {\n this.#bindings.set(action, shortcut);\n }\n }\n\n /**\n * Retrieves the active shortcut string for a registered action.\n */\n getShortcut(action: string): string | undefined {\n return this.#bindings.get(action);\n }\n\n /**\n * Retrieves the default shortcut string for a registered action.\n */\n getDefaultShortcut(action: string): string | undefined {\n return this.#defaults.get(action);\n }\n\n /**\n * Gets a formatted, user-friendly shortcut string for display.\n * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, 'Ctrl+Shift+K' on Windows/Linux.\n * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d' -> 'ArrowRight, D').\n */\n getDisplayShortcut(action: string): string | undefined {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return undefined;\n return shortcut\n .split(',')\n .map((part) => formatShortcut(part.trim(), this.isMac))\n .join(', ');\n }\n\n /**\n * Checks if a KeyboardEvent matches the configured keybinding for a given action.\n * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d').\n */\n matches(event: KeyboardEvent, action: string): boolean {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return false;\n \n return shortcut.split(',').some((part) => {\n const parsed = parseKeybinding(part.trim(), this.isMac);\n return matchKeybinding(event, parsed);\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n PLATFORM_ID,\n Renderer2,\n} from '@angular/core';\nimport { ShipA11yKeybindingsService } from './ship-a11y-keybindings.service';\n\n@Directive({\n selector: '[shA11yKeybinding]',\n standalone: true,\n})\nexport class ShipA11yKeybindingsDirective {\n readonly #service = inject(ShipA11yKeybindingsService);\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #renderer = inject(Renderer2);\n readonly #platformId = inject(PLATFORM_ID);\n\n /**\n * The registered action name (e.g. 'table.next-page', 'dialog.close').\n */\n shA11yKeybinding = input.required<string>();\n\n /**\n * Defines whether the keybinding listener is 'local' (host element keydown) or 'global' (window keydown).\n * Default is 'local'.\n */\n mode = input<'global' | 'local'>('local');\n\n /**\n * Whether to prevent the default action when the keybinding matches.\n */\n preventDefault = input<boolean>(true);\n\n /**\n * Whether to stop event propagation when the keybinding matches.\n */\n stopPropagation = input<boolean>(true);\n\n /**\n * Event emitted when the keybinding is triggered.\n */\n triggered = output<KeyboardEvent>();\n\n constructor() {\n // Dynamic effect to update aria-keyshortcuts on the host element when binding or service config changes\n effect(() => {\n const action = this.shA11yKeybinding();\n const shortcut = this.#service.getShortcut(action);\n if (shortcut) {\n // Set the standardized shortcut string for screen reader accessibility\n const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;\n this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);\n } else {\n this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');\n }\n });\n\n // Dynamic effect for global keydown event subscription when mode is 'global'\n effect((onCleanup) => {\n if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {\n const listener = (event: KeyboardEvent) => {\n // Avoid firing global hotkeys when typing in editable elements unless modifiers (Ctrl/Cmd/Alt) are pressed\n if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {\n return;\n }\n this.#checkAndTrigger(event);\n };\n\n window.addEventListener('keydown', listener);\n onCleanup(() => {\n window.removeEventListener('keydown', listener);\n });\n }\n });\n }\n\n /**\n * Local keydown listener when mode is 'local'\n */\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (this.mode() === 'local') {\n this.#checkAndTrigger(event);\n }\n }\n\n #checkAndTrigger(event: KeyboardEvent): void {\n const action = this.shA11yKeybinding();\n if (this.#service.matches(event, action)) {\n if (this.preventDefault()) {\n event.preventDefault();\n }\n if (this.stopPropagation()) {\n event.stopPropagation();\n }\n\n this.triggered.emit(event);\n\n // Declaratively invoke click() on host elements that support it (buttons, anchors, inputs, etc.)\n const hostEl = this.#elementRef.nativeElement;\n if (typeof hostEl.click === 'function') {\n hostEl.click();\n }\n }\n }\n\n /**\n * Returns true if focus is in a text input or editable element.\n */\n #isFocusInInput(): boolean {\n const activeEl = document.activeElement;\n if (!activeEl) return false;\n\n const tagName = activeEl.tagName.toLowerCase();\n const isInput = tagName === 'input' || tagName === 'textarea' || tagName === 'select';\n const isEditable = activeEl.hasAttribute('contenteditable') && activeEl.getAttribute('contenteditable') !== 'false';\n\n return isInput || isEditable;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-ui-core-ship-a11y-keybindings.mjs","sources":["../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings-override.token.ts","../../../projects/ship-ui/ship-a11y-keybindings/keybinding-utils.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.service.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.directive.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-ui-core-ship-a11y-keybindings.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const SHIP_A11Y_KEYBINDINGS_OVERRIDE = new InjectionToken<Record<string, string>>('SHIP_A11Y_KEYBINDINGS_OVERRIDE');\n","export interface ParsedKeybinding {\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n shiftKey: boolean;\n key?: string;\n code?: string;\n}\n\n\n\n\n\nexport function parseKeybinding(shorthand: string, isMacPlatform: boolean): ParsedKeybinding {\n const parts = shorthand.split('+').map(p => p.trim().toLowerCase());\n \n let ctrlKey = false;\n let metaKey = false;\n let altKey = false;\n let shiftKey = false;\n \n \n const keyPart = parts[parts.length - 1] || '';\n \n \n for (let i = 0; i < parts.length - 1; i++) {\n const modifier = parts[i];\n if (modifier === 'ctrlorcmd') {\n if (isMacPlatform) {\n metaKey = true;\n } else {\n ctrlKey = true;\n }\n } else if (modifier === 'ctrl') {\n ctrlKey = true;\n } else if (modifier === 'meta' || modifier === 'cmd') {\n metaKey = true;\n } else if (modifier === 'alt' || modifier === 'option') {\n altKey = true;\n } else if (modifier === 'shift') {\n shiftKey = true;\n }\n }\n \n let key: string | undefined;\n let code: string | undefined;\n \n if (keyPart.startsWith('key') || keyPart.startsWith('digit')) {\n code = keyPart; \n } else {\n \n if (keyPart === 'enter') {\n key = 'enter';\n } else if (keyPart === 'esc' || keyPart === 'escape') {\n key = 'escape';\n } else if (keyPart === 'space') {\n key = ' ';\n } else if (keyPart === 'tab') {\n key = 'tab';\n } else if (keyPart === 'backspace') {\n key = 'backspace';\n } else if (keyPart === 'delete') {\n key = 'delete';\n } else if (keyPart === 'up' || keyPart === 'arrowup') {\n key = 'arrowup';\n } else if (keyPart === 'down' || keyPart === 'arrowdown') {\n key = 'arrowdown';\n } else if (keyPart === 'left' || keyPart === 'arrowleft') {\n key = 'arrowleft';\n } else if (keyPart === 'right' || keyPart === 'arrowright') {\n key = 'arrowright';\n } else if (keyPart === 'home') {\n key = 'home';\n } else if (keyPart === 'end') {\n key = 'end';\n } else if (keyPart === 'pageup') {\n key = 'pageup';\n } else if (keyPart === 'pagedown') {\n key = 'pagedown';\n } else {\n key = keyPart; \n }\n }\n \n return { ctrlKey, metaKey, altKey, shiftKey, key, code };\n}\n\n\n\n\nexport function matchKeybinding(event: KeyboardEvent, parsed: ParsedKeybinding): boolean {\n if (event.ctrlKey !== parsed.ctrlKey) return false;\n if (event.metaKey !== parsed.metaKey) return false;\n if (event.altKey !== parsed.altKey) return false;\n if (event.shiftKey !== parsed.shiftKey) return false;\n \n if (parsed.code) {\n return event.code.toLowerCase() === parsed.code;\n }\n if (parsed.key) {\n if (parsed.key === ' ') {\n return event.key === ' ' || event.key === 'Spacebar';\n }\n return event.key.toLowerCase() === parsed.key;\n }\n \n return false;\n}\n\n\n\n\n\nexport function formatShortcut(shorthand: string, isMacPlatform: boolean): string {\n const parts = shorthand.split('+').map(p => p.trim());\n const formattedParts: string[] = [];\n \n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const lowerPart = part.toLowerCase();\n \n if (i < parts.length - 1) {\n if (lowerPart === 'ctrlorcmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Ctrl');\n } else if (lowerPart === 'ctrl') {\n formattedParts.push(isMacPlatform ? '⌃' : 'Ctrl');\n } else if (lowerPart === 'meta' || lowerPart === 'cmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Win');\n } else if (lowerPart === 'alt' || lowerPart === 'option') {\n formattedParts.push(isMacPlatform ? '⌥' : 'Alt');\n } else if (lowerPart === 'shift') {\n formattedParts.push(isMacPlatform ? '⇧' : 'Shift');\n }\n } else {\n \n if (lowerPart.startsWith('key')) {\n formattedParts.push(part.substring(3).toUpperCase()); \n } else if (lowerPart.startsWith('digit')) {\n formattedParts.push(part.substring(5)); \n } else {\n \n const capitalized = part.charAt(0).toUpperCase() + part.slice(1);\n formattedParts.push(capitalized);\n }\n }\n }\n \n if (isMacPlatform) {\n return formattedParts.join('');\n } else {\n return formattedParts.join('+');\n }\n}\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SHIP_A11Y_KEYBINDINGS_OVERRIDE } from './ship-a11y-keybindings-override.token';\nimport { parseKeybinding, matchKeybinding, formatShortcut } from './keybinding-utils';\n\nexport const DEFAULT_KEYBINDINGS: Record<string, string> = {\n \n 'datepicker.prev-month': 'PageUp',\n 'datepicker.next-month': 'PageDown',\n 'datepicker.prev-year': 'Shift+PageUp',\n 'datepicker.next-year': 'Shift+PageDown',\n 'datepicker.month-start': 'Home',\n 'datepicker.month-end': 'End',\n 'datepicker.day-next': 'ArrowRight, d',\n 'datepicker.day-prev': 'ArrowLeft, a',\n 'datepicker.week-next': 'ArrowDown, s',\n 'datepicker.week-prev': 'ArrowUp, w',\n\n \n 'selection-group.next': 'ArrowRight, ArrowDown, d, s',\n 'selection-group.prev': 'ArrowLeft, ArrowUp, a, w',\n 'selection-group.select': 'Enter, space',\n\n \n 'select.next': 'ArrowDown, s',\n 'select.prev': 'ArrowUp, w',\n 'select.select': 'Enter, space',\n 'select.close': 'Escape',\n\n \n 'menu.next': 'ArrowDown, s',\n 'menu.prev': 'ArrowUp, w',\n 'menu.open-submenu': 'ArrowRight, d',\n 'menu.close-submenu': 'ArrowLeft, a',\n 'menu.select': 'Enter, space',\n\n \n 'spotlight.next': 'ArrowDown, s',\n 'spotlight.prev': 'ArrowUp, w',\n 'spotlight.open': 'ctrlOrCmd+k',\n\n \n 'dialog.close': 'Escape',\n 'popover.close': 'Escape',\n\n \n 'toggle-card.toggle': 'Enter, space',\n\n \n 'checkbox.toggle': 'Enter, space',\n 'toggle.toggle': 'Enter, space',\n 'radio.select': 'Enter, space',\n\n \n 'table.sort': 'Enter, space',\n 'table.column-resize-decrease': 'Shift+ArrowLeft',\n 'table.column-resize-increase': 'Shift+ArrowRight',\n\n \n 'grid.focus-up': 'ArrowUp, w',\n 'grid.focus-down': 'ArrowDown, s',\n 'grid.focus-left': 'ArrowLeft, a',\n 'grid.focus-right': 'ArrowRight, d',\n 'grid.focus-first': 'Home',\n 'grid.focus-last': 'End',\n\n \n 'blueprint.cancel': 'Escape',\n\n \n 'editor-toolbar.next': 'ArrowRight, ArrowDown',\n 'editor-toolbar.prev': 'ArrowLeft, ArrowUp',\n 'editor-toolbar.home': 'Home',\n 'editor-toolbar.end': 'End',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipA11yKeybindingsService {\n #platformId = inject(PLATFORM_ID);\n #overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });\n \n \n #bindings = new Map<string, string>();\n \n \n #defaults = new Map<string, string>();\n\n \n\n\n get isMac(): boolean {\n if (!isPlatformBrowser(this.#platformId)) return false;\n return navigator.userAgent.toLowerCase().includes('mac');\n }\n\n constructor() {\n this.registerDefaults(DEFAULT_KEYBINDINGS);\n if (this.#overrides) {\n this.registerOverrides(this.#overrides);\n }\n }\n\n \n\n\n\n registerDefaults(defaults: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(defaults)) {\n this.#defaults.set(action, shortcut);\n \n \n if (!this.#bindings.has(action)) {\n this.#bindings.set(action, shortcut);\n }\n }\n }\n\n \n\n\n registerOverrides(overrides: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(overrides)) {\n this.#bindings.set(action, shortcut);\n }\n }\n\n \n\n\n getShortcut(action: string): string | undefined {\n return this.#bindings.get(action);\n }\n\n \n\n\n getDefaultShortcut(action: string): string | undefined {\n return this.#defaults.get(action);\n }\n\n \n\n\n\n\n getDisplayShortcut(action: string): string | undefined {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return undefined;\n return shortcut\n .split(',')\n .map((part) => formatShortcut(part.trim(), this.isMac))\n .join(', ');\n }\n\n \n\n\n\n matches(event: KeyboardEvent, action: string): boolean {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return false;\n \n return shortcut.split(',').some((part) => {\n const parsed = parseKeybinding(part.trim(), this.isMac);\n return matchKeybinding(event, parsed);\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n PLATFORM_ID,\n Renderer2,\n} from '@angular/core';\nimport { ShipA11yKeybindingsService } from './ship-a11y-keybindings.service';\n\n@Directive({\n selector: '[shA11yKeybinding]',\n standalone: true,\n})\nexport class ShipA11yKeybindingsDirective {\n #service = inject(ShipA11yKeybindingsService);\n #elementRef = inject(ElementRef<HTMLElement>);\n #renderer = inject(Renderer2);\n #platformId = inject(PLATFORM_ID);\n\n \n\n\n shA11yKeybinding = input.required<string>();\n\n \n\n\n\n mode = input<'global' | 'local'>('local');\n\n \n\n\n preventDefault = input<boolean>(true);\n\n \n\n\n stopPropagation = input<boolean>(true);\n\n \n\n\n triggered = output<KeyboardEvent>();\n\n constructor() {\n \n effect(() => {\n const action = this.shA11yKeybinding();\n const shortcut = this.#service.getShortcut(action);\n if (shortcut) {\n \n const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;\n this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);\n } else {\n this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');\n }\n });\n\n \n effect((onCleanup) => {\n if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {\n const listener = (event: KeyboardEvent) => {\n \n if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {\n return;\n }\n this.#checkAndTrigger(event);\n };\n\n window.addEventListener('keydown', listener);\n onCleanup(() => {\n window.removeEventListener('keydown', listener);\n });\n }\n });\n }\n\n \n\n\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (this.mode() === 'local') {\n this.#checkAndTrigger(event);\n }\n }\n\n #checkAndTrigger(event: KeyboardEvent): void {\n const action = this.shA11yKeybinding();\n if (this.#service.matches(event, action)) {\n if (this.preventDefault()) {\n event.preventDefault();\n }\n if (this.stopPropagation()) {\n event.stopPropagation();\n }\n\n this.triggered.emit(event);\n\n \n const hostEl = this.#elementRef.nativeElement;\n if (typeof hostEl.click === 'function') {\n hostEl.click();\n }\n }\n }\n\n \n\n\n #isFocusInInput(): boolean {\n const activeEl = document.activeElement;\n if (!activeEl) return false;\n\n const tagName = activeEl.tagName.toLowerCase();\n const isInput = tagName === 'input' || tagName === 'textarea' || tagName === 'select';\n const isEditable = activeEl.hasAttribute('contenteditable') && activeEl.getAttribute('contenteditable') !== 'false';\n\n return isInput || isEditable;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -3,8 +3,9 @@ import { inject, ElementRef, input, model, effect, ChangeDetectionStrategy, View
3
3
  import { shipComponentClasses, contentProjectionSignal } from '@ship-ui/core';
4
4
 
5
5
  class ShipAccordion {
6
+ #selfElement;
6
7
  constructor() {
7
- this.selfElement = inject((ElementRef)).nativeElement;
8
+ this.#selfElement = inject((ElementRef)).nativeElement;
8
9
  this.name = input(`sh-accordion-${Math.random().toString(36).substring(2, 9)}`, /* @ts-ignore */
9
10
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
10
11
  this.value = model(null, /* @ts-ignore */
@@ -25,7 +26,7 @@ class ShipAccordion {
25
26
  attributes: true,
26
27
  attributeFilter: ['open', 'value'],
27
28
  });
28
- this.selfElement.addEventListener('toggle', this.onToggle.bind(this), true);
29
+ this.#selfElement.addEventListener('toggle', this.onToggle.bind(this), true);
29
30
  effect(() => {
30
31
  const isMultiple = this.allowMultiple();
31
32
  const groupName = this.name();
@@ -76,7 +77,7 @@ class ShipAccordion {
76
77
  const target = event.target;
77
78
  if (target.tagName !== 'DETAILS')
78
79
  return;
79
- if (!this.selfElement.contains(target))
80
+ if (!this.#selfElement.contains(target))
80
81
  return;
81
82
  const itemVal = target.getAttribute('value');
82
83
  if (!itemVal)
@@ -1 +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 icon.setAttribute('aria-hidden', 'true');\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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"}
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 #selfElement = inject(ElementRef<HTMLElement>).nativeElement;\n\n name = input<string>(`sh-accordion-${Math.random().toString(36).substring(2, 9)}`);\n value = model<string | null>(null);\n allowMultiple = input<boolean>(false);\n variant = input<ShipVariant | null>(null);\n size = input<string | null>(null);\n\n hostClasses = shipComponentClasses('accordion', {\n variant: this.variant,\n size: this.size,\n });\n\n 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 icon.setAttribute('aria-hidden', 'true');\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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"}
@@ -13,7 +13,7 @@ class ShipAlert {
13
13
  color: this.color,
14
14
  variant: this.variant,
15
15
  });
16
- this._el = inject(ElementRef); // Used by alert container
16
+ this._el = inject(ElementRef);
17
17
  this.alertService = input(null, /* @ts-ignore */
18
18
  ...(ngDevMode ? [{ debugName: "alertService" }] : /* istanbul ignore next */ []));
19
19
  this.id = input(null, /* @ts-ignore */
@@ -132,9 +132,6 @@ class ShipAlertContainer {
132
132
  this.scroller = viewChild.required('scroller');
133
133
  this.alertService = input.required(/* @ts-ignore */
134
134
  ...(ngDevMode ? [{ debugName: "alertService" }] : /* istanbul ignore next */ []));
135
- // alertHistory = this.alertService()?.alertHistory;
136
- // alertHistoryIsOpen = this.alertService()?.alertHistoryIsOpen;
137
- // alertHistoryIsHidden = this.alertService()?.alertHistoryIsHidden;
138
135
  this.numberOfOpenAlerts = computed(() => {
139
136
  return this.alertService()
140
137
  .alertHistory()
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-alert.mjs","sources":["../../../projects/ship-ui/ship-alert/ship-alert.ts","../../../projects/ship-ui/ship-alert/ship-alert-container.ts","../../../projects/ship-ui/ship-alert/ship-alert-container.html","../../../projects/ship-ui/ship-alert/ship-alert.module.ts","../../../projects/ship-ui/ship-alert/ship-alert.service.ts","../../../projects/ship-ui/ship-alert/ship-ui-core-ship-alert.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, inject, input, ViewEncapsulation } from '@angular/core';\nimport { ShipColor, shipComponentClasses, ShipSheetVariant } from '@ship-ui/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipAlertService } from './ship-alert.service';\n\nexport type ShipAlertType = 'error' | 'success' | 'warn' | 'primary' | 'accent' | 'question';\n\n@Component({\n selector: 'sh-alert',\n styleUrl: './ship-alert.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <div class=\"alert\">\n <div #ref class=\"icon\" [style.display]=\"!ref.children.length ? 'none' : 'block'\">\n <ng-content select=\"[icon]\" />\n <ng-content select=\"sh-icon\" />\n </div>\n\n <div class=\"icon\">\n @let _alertClasses = hostClasses();\n\n @if (_alertClasses.includes('primary')) {\n <sh-icon class=\"state-icon\">info</sh-icon>\n } @else if (_alertClasses.includes('accent')) {\n <sh-icon class=\"state-icon\">info</sh-icon>\n } @else if (_alertClasses.includes('warn')) {\n <sh-icon class=\"state-icon\">warning</sh-icon>\n } @else if (_alertClasses.includes('error')) {\n <sh-icon class=\"state-icon\">warning-octagon</sh-icon>\n } @else if (_alertClasses.includes('success')) {\n <sh-icon class=\"state-icon\">check-circle</sh-icon>\n } @else {\n <sh-icon class=\"state-icon\">question</sh-icon>\n }\n </div>\n\n <div class=\"title\">\n <ng-content select=\"[title]\" />\n <ng-content />\n </div>\n\n @if (id()) {\n <sh-icon class=\"close-icon\" (click)=\"removeAlert()\">plus</sh-icon>\n }\n\n <div class=\"actions\">\n <ng-content select=\"button\" />\n <ng-content select=\"[actions]\" />\n </div>\n\n <div class=\"content\">\n <ng-content select=\"[content]\" />\n <ng-content select=\"p\" />\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'sh-sheet',\n '[class]': 'hostClasses()',\n '[attr.role]': 'color() === \"warn\" || color() === \"error\" ? \"alert\" : \"status\"',\n },\n})\nexport class ShipAlert {\n color = input<ShipColor | null>(null);\n variant = input<ShipSheetVariant | null>(null);\n\n hostClasses = shipComponentClasses('alert', {\n color: this.color,\n variant: this.variant,\n });\n\n _el = inject(ElementRef); // Used by alert container\n alertService = input<ShipAlertService | null>(null);\n id = input<string | null>(null);\n\n removeAlert() {\n if (this.id() && this.alertService()) {\n this.alertService()?.removeAlert(this.id() as string);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, QueryList, computed, effect, input, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipAlert } from './ship-alert';\nimport { ShipAlertService } from './ship-alert.service';\n\n@Component({\n selector: 'ship-alert-container',\n styleUrl: './ship-alert-container.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipAlert, ShipIcon],\n templateUrl: './ship-alert-container.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipAlertContainer {\n inline = input<string | null>(null);\n alerts = viewChild.required<QueryList<ShipAlert>>('alerts');\n scroller = viewChild.required<ElementRef<HTMLDivElement>>('scroller');\n alertService = input.required<ShipAlertService>();\n\n // alertHistory = this.alertService()?.alertHistory;\n // alertHistoryIsOpen = this.alertService()?.alertHistoryIsOpen;\n // alertHistoryIsHidden = this.alertService()?.alertHistoryIsHidden;\n\n numberOfOpenAlerts = computed(() => {\n return this.alertService()\n .alertHistory()\n .filter((x) => x.isOpen).length;\n });\n\n readonly #e = effect(() => {\n this.alertService().alertHistory();\n this.alertService().alertHistoryIsOpen();\n this.#scrollToBottom();\n });\n\n #scrollToBottom() {\n if (this.scroller() && this.scroller().nativeElement && typeof this.scroller().nativeElement.scrollTo === 'function') {\n this.scroller().nativeElement.scrollTo(0, this.scroller().nativeElement.scrollHeight);\n }\n }\n\n @HostListener('mouseover')\n onMouseOver() {\n if (typeof this.inline === 'string') return;\n\n this.alertService().setHidden(false);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n if (typeof this.inline === 'string') return;\n\n this.alertService().setHidden(true);\n }\n\n getElementHeight(i: number) {\n if (!this.alerts) return 0;\n\n const elementHeights = this.alerts()\n .toArray()\n .map((element) => element._el.nativeElement.querySelector('.ship-alert-item').offsetHeight);\n\n if (!elementHeights) return 0;\n\n let totalHeight = 0;\n const elementTransformPos = elementHeights.map((height, i) => {\n totalHeight += height;\n return totalHeight - elementHeights[0];\n });\n\n return elementTransformPos[i];\n }\n\n transformY(i: number) {\n return `translateY(calc(-${this.getElementHeight(i - 1)}px + (-10px * ${i})))`;\n }\n\n transitionDelay(i: number, allOpen = false) {\n return allOpen\n ? this.alertService().alertHistory().length - 1 * 40 + 'ms'\n : (this.numberOfOpenAlerts() - i) * 40 + 'ms';\n }\n}\n","<div class=\"scroller\" #scroller>\n <div class=\"container\">\n @for (alert of this.alertService().alertHistory(); track $index) {\n <sh-alert\n #alerts\n [class]=\"alert.type\"\n [id]=\"alert.id\"\n [alertService]=\"alertService()\"\n [style.transition-delay]=\"transitionDelay($index, true)\"\n [class.animate-in]=\"alert.animateIn\"\n [class.animate-out]=\"alert.animateOut\"\n [class.is-hidden]=\"this.alertService().alertHistoryIsHidden() && !alert.isOpen\">\n <div title>{{ alert.title }}</div>\n\n @if (alert.content) {\n <div content>\n {{ alert.content }}\n </div>\n }\n </sh-alert>\n }\n </div>\n</div>\n<div\n class=\"tray\"\n [class.tray-is-hidden]=\"!this.alertService().alertHistoryIsHidden()\"\n (mouseover)=\"this.onMouseOver()\"\n (mouseout)=\"this.onMouseOut()\">\n <sh-icon class=\"small\">info</sh-icon>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ShipAlert } from './ship-alert';\nimport { ShipAlertContainer } from './ship-alert-container';\n\n@NgModule({\n imports: [ShipAlert, ShipAlertContainer],\n exports: [ShipAlert, ShipAlertContainer],\n providers: [],\n})\nexport class ShipAlertModule {}\n","import { Injectable, signal } from '@angular/core';\nimport { generateUniqueId } from '@ship-ui/core';\nimport { ShipAlertType } from './ship-alert';\n\nexport type ShipAlertItem = {\n type: ShipAlertType;\n title: string;\n content?: string;\n};\n\nexport type ShipAlertItemInternal = ShipAlertItem & {\n id: string;\n isOpen: boolean;\n animateOut: boolean;\n animateIn: boolean;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipAlertService {\n alertHistory = signal<ShipAlertItemInternal[]>([]);\n alertHistoryIsOpen = signal<boolean>(false);\n alertHistoryIsHidden = signal<boolean>(true);\n\n error(message: string | null | undefined) {\n this.addAlert({\n type: 'error',\n title: message ?? 'An error occured',\n });\n }\n\n success(message: string) {\n this.addAlert({\n type: 'success',\n title: message,\n });\n }\n\n question(message: string) {\n this.addAlert({\n type: 'question',\n title: message,\n });\n }\n\n warning(message: string) {\n this.addAlert({\n type: 'warn',\n title: message,\n });\n }\n\n info(message: string) {\n this.addAlert({\n type: 'primary',\n title: message,\n });\n }\n\n addAlert(alert: ShipAlertItem) {\n const id = generateUniqueId();\n\n this.alertHistory.update((history) => [\n { ...alert, isOpen: true, animateIn: true, animateOut: false, id },\n ...history,\n ]);\n\n setTimeout(() => {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n animateIn: item.id === id ? false : item.animateIn,\n }))\n );\n }, 40);\n\n setTimeout(() => {\n this.hideAlert(id);\n }, 2500);\n }\n\n removeAlert(id: string) {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n animateOut: item.id === id ? false : item.animateOut,\n }))\n );\n\n setTimeout(() => {\n this.alertHistory.update((history) => history.filter((item) => item.id !== id));\n }, 300);\n }\n\n hideAlert(id: string) {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n isOpen: item.id === id ? false : item.isOpen,\n }))\n );\n }\n\n setHidden(isHidden: boolean) {\n this.alertHistoryIsHidden.set(isHidden);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-ui-core-ship-alert.mjs","sources":["../../../projects/ship-ui/ship-alert/ship-alert.ts","../../../projects/ship-ui/ship-alert/ship-alert-container.ts","../../../projects/ship-ui/ship-alert/ship-alert-container.html","../../../projects/ship-ui/ship-alert/ship-alert.module.ts","../../../projects/ship-ui/ship-alert/ship-alert.service.ts","../../../projects/ship-ui/ship-alert/ship-ui-core-ship-alert.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, inject, input, ViewEncapsulation } from '@angular/core';\nimport { ShipColor, shipComponentClasses, ShipSheetVariant } from '@ship-ui/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipAlertService } from './ship-alert.service';\n\nexport type ShipAlertType = 'error' | 'success' | 'warn' | 'primary' | 'accent' | 'question';\n\n@Component({\n selector: 'sh-alert',\n styleUrl: './ship-alert.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <div class=\"alert\">\n <div #ref class=\"icon\" [style.display]=\"!ref.children.length ? 'none' : 'block'\">\n <ng-content select=\"[icon]\" />\n <ng-content select=\"sh-icon\" />\n </div>\n\n <div class=\"icon\">\n @let _alertClasses = hostClasses();\n\n @if (_alertClasses.includes('primary')) {\n <sh-icon class=\"state-icon\">info</sh-icon>\n } @else if (_alertClasses.includes('accent')) {\n <sh-icon class=\"state-icon\">info</sh-icon>\n } @else if (_alertClasses.includes('warn')) {\n <sh-icon class=\"state-icon\">warning</sh-icon>\n } @else if (_alertClasses.includes('error')) {\n <sh-icon class=\"state-icon\">warning-octagon</sh-icon>\n } @else if (_alertClasses.includes('success')) {\n <sh-icon class=\"state-icon\">check-circle</sh-icon>\n } @else {\n <sh-icon class=\"state-icon\">question</sh-icon>\n }\n </div>\n\n <div class=\"title\">\n <ng-content select=\"[title]\" />\n <ng-content />\n </div>\n\n @if (id()) {\n <sh-icon class=\"close-icon\" (click)=\"removeAlert()\">plus</sh-icon>\n }\n\n <div class=\"actions\">\n <ng-content select=\"button\" />\n <ng-content select=\"[actions]\" />\n </div>\n\n <div class=\"content\">\n <ng-content select=\"[content]\" />\n <ng-content select=\"p\" />\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'sh-sheet',\n '[class]': 'hostClasses()',\n '[attr.role]': 'color() === \"warn\" || color() === \"error\" ? \"alert\" : \"status\"',\n },\n})\nexport class ShipAlert {\n color = input<ShipColor | null>(null);\n variant = input<ShipSheetVariant | null>(null);\n\n hostClasses = shipComponentClasses('alert', {\n color: this.color,\n variant: this.variant,\n });\n\n _el = inject(ElementRef); \n alertService = input<ShipAlertService | null>(null);\n id = input<string | null>(null);\n\n removeAlert() {\n if (this.id() && this.alertService()) {\n this.alertService()?.removeAlert(this.id() as string);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, QueryList, computed, effect, input, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipAlert } from './ship-alert';\nimport { ShipAlertService } from './ship-alert.service';\n\n@Component({\n selector: 'ship-alert-container',\n styleUrl: './ship-alert-container.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipAlert, ShipIcon],\n templateUrl: './ship-alert-container.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipAlertContainer {\n inline = input<string | null>(null);\n alerts = viewChild.required<QueryList<ShipAlert>>('alerts');\n scroller = viewChild.required<ElementRef<HTMLDivElement>>('scroller');\n alertService = input.required<ShipAlertService>();\n\n \n \n \n\n numberOfOpenAlerts = computed(() => {\n return this.alertService()\n .alertHistory()\n .filter((x) => x.isOpen).length;\n });\n\n #e = effect(() => {\n this.alertService().alertHistory();\n this.alertService().alertHistoryIsOpen();\n this.#scrollToBottom();\n });\n\n #scrollToBottom() {\n if (this.scroller() && this.scroller().nativeElement && typeof this.scroller().nativeElement.scrollTo === 'function') {\n this.scroller().nativeElement.scrollTo(0, this.scroller().nativeElement.scrollHeight);\n }\n }\n\n @HostListener('mouseover')\n onMouseOver() {\n if (typeof this.inline === 'string') return;\n\n this.alertService().setHidden(false);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n if (typeof this.inline === 'string') return;\n\n this.alertService().setHidden(true);\n }\n\n getElementHeight(i: number) {\n if (!this.alerts) return 0;\n\n const elementHeights = this.alerts()\n .toArray()\n .map((element) => element._el.nativeElement.querySelector('.ship-alert-item').offsetHeight);\n\n if (!elementHeights) return 0;\n\n let totalHeight = 0;\n const elementTransformPos = elementHeights.map((height, i) => {\n totalHeight += height;\n return totalHeight - elementHeights[0];\n });\n\n return elementTransformPos[i];\n }\n\n transformY(i: number) {\n return `translateY(calc(-${this.getElementHeight(i - 1)}px + (-10px * ${i})))`;\n }\n\n transitionDelay(i: number, allOpen = false) {\n return allOpen\n ? this.alertService().alertHistory().length - 1 * 40 + 'ms'\n : (this.numberOfOpenAlerts() - i) * 40 + 'ms';\n }\n}\n","<div class=\"scroller\" #scroller>\n <div class=\"container\">\n @for (alert of this.alertService().alertHistory(); track $index) {\n <sh-alert\n #alerts\n [class]=\"alert.type\"\n [id]=\"alert.id\"\n [alertService]=\"alertService()\"\n [style.transition-delay]=\"transitionDelay($index, true)\"\n [class.animate-in]=\"alert.animateIn\"\n [class.animate-out]=\"alert.animateOut\"\n [class.is-hidden]=\"this.alertService().alertHistoryIsHidden() && !alert.isOpen\">\n <div title>{{ alert.title }}</div>\n\n @if (alert.content) {\n <div content>\n {{ alert.content }}\n </div>\n }\n </sh-alert>\n }\n </div>\n</div>\n<div\n class=\"tray\"\n [class.tray-is-hidden]=\"!this.alertService().alertHistoryIsHidden()\"\n (mouseover)=\"this.onMouseOver()\"\n (mouseout)=\"this.onMouseOut()\">\n <sh-icon class=\"small\">info</sh-icon>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ShipAlert } from './ship-alert';\nimport { ShipAlertContainer } from './ship-alert-container';\n\n@NgModule({\n imports: [ShipAlert, ShipAlertContainer],\n exports: [ShipAlert, ShipAlertContainer],\n providers: [],\n})\nexport class ShipAlertModule {}\n","import { Injectable, signal } from '@angular/core';\nimport { generateUniqueId } from '@ship-ui/core';\nimport { ShipAlertType } from './ship-alert';\n\nexport type ShipAlertItem = {\n type: ShipAlertType;\n title: string;\n content?: string;\n};\n\nexport type ShipAlertItemInternal = ShipAlertItem & {\n id: string;\n isOpen: boolean;\n animateOut: boolean;\n animateIn: boolean;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipAlertService {\n alertHistory = signal<ShipAlertItemInternal[]>([]);\n alertHistoryIsOpen = signal<boolean>(false);\n alertHistoryIsHidden = signal<boolean>(true);\n\n error(message: string | null | undefined) {\n this.addAlert({\n type: 'error',\n title: message ?? 'An error occured',\n });\n }\n\n success(message: string) {\n this.addAlert({\n type: 'success',\n title: message,\n });\n }\n\n question(message: string) {\n this.addAlert({\n type: 'question',\n title: message,\n });\n }\n\n warning(message: string) {\n this.addAlert({\n type: 'warn',\n title: message,\n });\n }\n\n info(message: string) {\n this.addAlert({\n type: 'primary',\n title: message,\n });\n }\n\n addAlert(alert: ShipAlertItem) {\n const id = generateUniqueId();\n\n this.alertHistory.update((history) => [\n { ...alert, isOpen: true, animateIn: true, animateOut: false, id },\n ...history,\n ]);\n\n setTimeout(() => {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n animateIn: item.id === id ? false : item.animateIn,\n }))\n );\n }, 40);\n\n setTimeout(() => {\n this.hideAlert(id);\n }, 2500);\n }\n\n removeAlert(id: string) {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n animateOut: item.id === id ? false : item.animateOut,\n }))\n );\n\n setTimeout(() => {\n this.alertHistory.update((history) => history.filter((item) => item.id !== id));\n }, 300);\n }\n\n hideAlert(id: string) {\n this.alertHistory.update((history) =>\n history.map((item) => ({\n ...item,\n isOpen: item.id === id ? false : item.isOpen,\n }))\n );\n }\n\n setHidden(isHidden: boolean) {\n this.alertHistoryIsHidden.set(isHidden);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}