@ship-ui/core 0.22.16 → 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 (66) hide show
  1. package/assets/mcp/components.json +181 -39
  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 +4 -87
  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 +8 -10
  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 +8 -12
  17. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
  18. package/fesm2022/ship-ui-core-ship-editor.mjs +0 -42
  19. package/fesm2022/ship-ui-core-ship-editor.mjs.map +1 -1
  20. package/fesm2022/ship-ui-core-ship-form-field.mjs +0 -1
  21. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -1
  22. package/fesm2022/ship-ui-core-ship-kbd.mjs +0 -6
  23. package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -1
  24. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs +241 -0
  25. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs.map +1 -0
  26. package/fesm2022/ship-ui-core-ship-menu.mjs +7 -10
  27. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -1
  28. package/fesm2022/ship-ui-core-ship-popover.mjs +1 -20
  29. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -1
  30. package/fesm2022/ship-ui-core-ship-radio.mjs +3 -2
  31. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -1
  32. package/fesm2022/ship-ui-core-ship-range-slider.mjs +7 -9
  33. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -1
  34. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
  35. package/fesm2022/ship-ui-core-ship-sidenav.mjs +2 -2
  36. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -1
  37. package/fesm2022/ship-ui-core-ship-sortable.mjs +262 -68
  38. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -1
  39. package/fesm2022/ship-ui-core-ship-spotlight.mjs +0 -11
  40. package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -1
  41. package/fesm2022/ship-ui-core-ship-stepper.mjs +1 -1
  42. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -1
  43. package/fesm2022/ship-ui-core-ship-table.mjs +4 -5
  44. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
  45. package/fesm2022/ship-ui-core-ship-toggle.mjs +3 -2
  46. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -1
  47. package/fesm2022/ship-ui-core-ship-tree.mjs +1 -9
  48. package/fesm2022/ship-ui-core-ship-tree.mjs.map +1 -1
  49. package/fesm2022/ship-ui-core.mjs +37 -53
  50. package/fesm2022/ship-ui-core.mjs.map +1 -1
  51. package/package.json +5 -1
  52. package/types/ship-ui-core-ship-a11y-keybindings.d.ts +0 -55
  53. package/types/ship-ui-core-ship-accordion.d.ts +7 -7
  54. package/types/ship-ui-core-ship-blueprint.d.ts +1 -1
  55. package/types/ship-ui-core-ship-checkbox.d.ts +2 -3
  56. package/types/ship-ui-core-ship-color-picker.d.ts +1 -25
  57. package/types/ship-ui-core-ship-datepicker.d.ts +0 -3
  58. package/types/ship-ui-core-ship-editor.d.ts +10 -10
  59. package/types/ship-ui-core-ship-list-item-swipe.d.ts +25 -0
  60. package/types/ship-ui-core-ship-menu.d.ts +1 -2
  61. package/types/ship-ui-core-ship-radio.d.ts +2 -3
  62. package/types/ship-ui-core-ship-range-slider.d.ts +6 -6
  63. package/types/ship-ui-core-ship-sortable.d.ts +31 -9
  64. package/types/ship-ui-core-ship-toggle.d.ts +2 -3
  65. package/types/ship-ui-core-ship-tree.d.ts +20 -25
  66. 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,48 +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
188
  'table.column-resize-decrease': 'Shift+ArrowLeft',
214
189
  'table.column-resize-increase': 'Shift+ArrowRight',
215
- // Grid Navigation
216
190
  'grid.focus-up': 'ArrowUp, w',
217
191
  'grid.focus-down': 'ArrowDown, s',
218
192
  'grid.focus-left': 'ArrowLeft, a',
219
193
  'grid.focus-right': 'ArrowRight, d',
220
194
  'grid.focus-first': 'Home',
221
195
  'grid.focus-last': 'End',
222
- // Blueprint
223
196
  'blueprint.cancel': 'Escape',
224
- // Editor Toolbar
225
197
  'editor-toolbar.next': 'ArrowRight, ArrowDown',
226
198
  'editor-toolbar.prev': 'ArrowLeft, ArrowUp',
227
199
  'editor-toolbar.home': 'Home',
@@ -230,13 +202,8 @@ const DEFAULT_KEYBINDINGS = {
230
202
  class ShipA11yKeybindingsService {
231
203
  #platformId = inject(PLATFORM_ID);
232
204
  #overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });
233
- // Store of action names to active shortcut strings
234
205
  #bindings = new Map();
235
- // Store of action names to default shortcut strings
236
206
  #defaults = new Map();
237
- /**
238
- * Returns true if the platform is running on macOS.
239
- */
240
207
  get isMac() {
241
208
  if (!isPlatformBrowser(this.#platformId))
242
209
  return false;
@@ -248,44 +215,25 @@ class ShipA11yKeybindingsService {
248
215
  this.registerOverrides(this.#overrides);
249
216
  }
250
217
  }
251
- /**
252
- * Registers default shortcuts for actions.
253
- * If an override already exists for a given action, the override takes precedence.
254
- */
255
218
  registerDefaults(defaults) {
256
219
  for (const [action, shortcut] of Object.entries(defaults)) {
257
220
  this.#defaults.set(action, shortcut);
258
- // If we don't have an override/binding for this action, set it as the active binding
259
221
  if (!this.#bindings.has(action)) {
260
222
  this.#bindings.set(action, shortcut);
261
223
  }
262
224
  }
263
225
  }
264
- /**
265
- * Registers overrides for actions. Overwrites any existing or default bindings.
266
- */
267
226
  registerOverrides(overrides) {
268
227
  for (const [action, shortcut] of Object.entries(overrides)) {
269
228
  this.#bindings.set(action, shortcut);
270
229
  }
271
230
  }
272
- /**
273
- * Retrieves the active shortcut string for a registered action.
274
- */
275
231
  getShortcut(action) {
276
232
  return this.#bindings.get(action);
277
233
  }
278
- /**
279
- * Retrieves the default shortcut string for a registered action.
280
- */
281
234
  getDefaultShortcut(action) {
282
235
  return this.#defaults.get(action);
283
236
  }
284
- /**
285
- * Gets a formatted, user-friendly shortcut string for display.
286
- * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, 'Ctrl+Shift+K' on Windows/Linux.
287
- * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d' -> 'ArrowRight, D').
288
- */
289
237
  getDisplayShortcut(action) {
290
238
  const shortcut = this.getShortcut(action);
291
239
  if (!shortcut)
@@ -295,10 +243,6 @@ class ShipA11yKeybindingsService {
295
243
  .map((part) => formatShortcut(part.trim(), this.isMac))
296
244
  .join(', ');
297
245
  }
298
- /**
299
- * Checks if a KeyboardEvent matches the configured keybinding for a given action.
300
- * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d').
301
- */
302
246
  matches(event, action) {
303
247
  const shortcut = this.getShortcut(action);
304
248
  if (!shortcut)
@@ -328,37 +272,19 @@ class ShipA11yKeybindingsDirective {
328
272
  this.#elementRef = inject((ElementRef));
329
273
  this.#renderer = inject(Renderer2);
330
274
  this.#platformId = inject(PLATFORM_ID);
331
- /**
332
- * The registered action name (e.g. 'table.next-page', 'dialog.close').
333
- */
334
275
  this.shA11yKeybinding = input.required(/* @ts-ignore */
335
276
  ...(ngDevMode ? [{ debugName: "shA11yKeybinding" }] : /* istanbul ignore next */ []));
336
- /**
337
- * Defines whether the keybinding listener is 'local' (host element keydown) or 'global' (window keydown).
338
- * Default is 'local'.
339
- */
340
277
  this.mode = input('local', /* @ts-ignore */
341
278
  ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
342
- /**
343
- * Whether to prevent the default action when the keybinding matches.
344
- */
345
279
  this.preventDefault = input(true, /* @ts-ignore */
346
280
  ...(ngDevMode ? [{ debugName: "preventDefault" }] : /* istanbul ignore next */ []));
347
- /**
348
- * Whether to stop event propagation when the keybinding matches.
349
- */
350
281
  this.stopPropagation = input(true, /* @ts-ignore */
351
282
  ...(ngDevMode ? [{ debugName: "stopPropagation" }] : /* istanbul ignore next */ []));
352
- /**
353
- * Event emitted when the keybinding is triggered.
354
- */
355
283
  this.triggered = output();
356
- // Dynamic effect to update aria-keyshortcuts on the host element when binding or service config changes
357
284
  effect(() => {
358
285
  const action = this.shA11yKeybinding();
359
286
  const shortcut = this.#service.getShortcut(action);
360
287
  if (shortcut) {
361
- // Set the standardized shortcut string for screen reader accessibility
362
288
  const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;
363
289
  this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);
364
290
  }
@@ -366,11 +292,9 @@ class ShipA11yKeybindingsDirective {
366
292
  this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');
367
293
  }
368
294
  });
369
- // Dynamic effect for global keydown event subscription when mode is 'global'
370
295
  effect((onCleanup) => {
371
296
  if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {
372
297
  const listener = (event) => {
373
- // Avoid firing global hotkeys when typing in editable elements unless modifiers (Ctrl/Cmd/Alt) are pressed
374
298
  if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {
375
299
  return;
376
300
  }
@@ -383,9 +307,6 @@ class ShipA11yKeybindingsDirective {
383
307
  }
384
308
  });
385
309
  }
386
- /**
387
- * Local keydown listener when mode is 'local'
388
- */
389
310
  onKeyDown(event) {
390
311
  if (this.mode() === 'local') {
391
312
  this.#checkAndTrigger(event);
@@ -401,16 +322,12 @@ class ShipA11yKeybindingsDirective {
401
322
  event.stopPropagation();
402
323
  }
403
324
  this.triggered.emit(event);
404
- // Declaratively invoke click() on host elements that support it (buttons, anchors, inputs, etc.)
405
325
  const hostEl = this.#elementRef.nativeElement;
406
326
  if (typeof hostEl.click === 'function') {
407
327
  hostEl.click();
408
328
  }
409
329
  }
410
330
  }
411
- /**
412
- * Returns true if focus is in a text input or editable element.
413
- */
414
331
  #isFocusInInput() {
415
332
  const activeEl = document.activeElement;
416
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 'table.column-resize-decrease': 'Shift+ArrowLeft',\n 'table.column-resize-increase': 'Shift+ArrowRight',\n\n // Grid Navigation\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 // 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":";;;;MAEa,8BAA8B,GAAG,IAAI,cAAc,CAAyB,gCAAgC;;ACOzH;;;AAGG;AACG,SAAU,eAAe,CAAC,SAAiB,EAAE,aAAsB,EAAA;IACvE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEnE,IAAI,OAAO,GAAG,KAAK;IACnB,IAAI,OAAO,GAAG,KAAK;IACnB,IAAI,MAAM,GAAG,KAAK;IAClB,IAAI,QAAQ,GAAG,KAAK;;AAGpB,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;;AAG7C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACzC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,QAAQ,KAAK,WAAW,EAAE;YAC5B,IAAI,aAAa,EAAE;gBACjB,OAAO,GAAG,IAAI;YAChB;iBAAO;gBACL,OAAO,GAAG,IAAI;YAChB;QACF;AAAO,aAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;YAC9B,OAAO,GAAG,IAAI;QAChB;aAAO,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,KAAK,EAAE;YACpD,OAAO,GAAG,IAAI;QAChB;aAAO,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,EAAE;YACtD,MAAM,GAAG,IAAI;QACf;AAAO,aAAA,IAAI,QAAQ,KAAK,OAAO,EAAE;YAC/B,QAAQ,GAAG,IAAI;QACjB;IACF;AAEA,IAAA,IAAI,GAAuB;AAC3B,IAAA,IAAI,IAAwB;AAE5B,IAAA,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC5D,QAAA,IAAI,GAAG,OAAO,CAAC;IACjB;SAAO;;AAEL,QAAA,IAAI,OAAO,KAAK,OAAO,EAAE;YACvB,GAAG,GAAG,OAAO;QACf;aAAO,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,QAAQ,EAAE;YACpD,GAAG,GAAG,QAAQ;QAChB;AAAO,aAAA,IAAI,OAAO,KAAK,OAAO,EAAE;YAC9B,GAAG,GAAG,GAAG;QACX;AAAO,aAAA,IAAI,OAAO,KAAK,KAAK,EAAE;YAC5B,GAAG,GAAG,KAAK;QACb;AAAO,aAAA,IAAI,OAAO,KAAK,WAAW,EAAE;YAClC,GAAG,GAAG,WAAW;QACnB;AAAO,aAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;YAC/B,GAAG,GAAG,QAAQ;QAChB;aAAO,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE;YACpD,GAAG,GAAG,SAAS;QACjB;aAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,WAAW,EAAE;YACxD,GAAG,GAAG,WAAW;QACnB;aAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,WAAW,EAAE;YACxD,GAAG,GAAG,WAAW;QACnB;aAAO,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,YAAY,EAAE;YAC1D,GAAG,GAAG,YAAY;QACpB;AAAO,aAAA,IAAI,OAAO,KAAK,MAAM,EAAE;YAC7B,GAAG,GAAG,MAAM;QACd;AAAO,aAAA,IAAI,OAAO,KAAK,KAAK,EAAE;YAC5B,GAAG,GAAG,KAAK;QACb;AAAO,aAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;YAC/B,GAAG,GAAG,QAAQ;QAChB;AAAO,aAAA,IAAI,OAAO,KAAK,UAAU,EAAE;YACjC,GAAG,GAAG,UAAU;QAClB;aAAO;AACL,YAAA,GAAG,GAAG,OAAO,CAAC;QAChB;IACF;AAEA,IAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE;AAC1D;AAEA;;AAEG;AACG,SAAU,eAAe,CAAC,KAAoB,EAAE,MAAwB,EAAA;AAC5E,IAAA,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;AAAE,QAAA,OAAO,KAAK;AAClD,IAAA,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;AAAE,QAAA,OAAO,KAAK;AAClD,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK;AAChD,IAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;AAAE,QAAA,OAAO,KAAK;AAEpD,IAAA,IAAI,MAAM,CAAC,IAAI,EAAE;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI;IACjD;AACA,IAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,QAAA,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE;YACtB,OAAO,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU;QACtD;QACA,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,GAAG;IAC/C;AAEA,IAAA,OAAO,KAAK;AACd;AAEA;;;AAGG;AACG,SAAU,cAAc,CAAC,SAAiB,EAAE,aAAsB,EAAA;IACtE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,cAAc,GAAa,EAAE;AAEnC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;QAEpC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,YAAA,IAAI,SAAS,KAAK,WAAW,EAAE;AAC7B,gBAAA,cAAc,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC;YACnD;AAAO,iBAAA,IAAI,SAAS,KAAK,MAAM,EAAE;AAC/B,gBAAA,cAAc,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC;YACnD;iBAAO,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;AACtD,gBAAA,cAAc,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,KAAK,CAAC;YAClD;iBAAO,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,QAAQ,EAAE;AACxD,gBAAA,cAAc,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,KAAK,CAAC;YAClD;AAAO,iBAAA,IAAI,SAAS,KAAK,OAAO,EAAE;AAChC,gBAAA,cAAc,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,OAAO,CAAC;YACpD;QACF;aAAO;;AAEL,YAAA,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC/B,gBAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD;AAAO,iBAAA,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACxC,gBAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC;iBAAO;;AAEL,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAChE,gBAAA,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YAClC;QACF;IACF;IAEA,IAAI,aAAa,EAAE;AACjB,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAChC;SAAO;AACL,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC;AACF;;ACnJO,MAAM,mBAAmB,GAA2B;;AAEzD,IAAA,uBAAuB,EAAE,QAAQ;AACjC,IAAA,uBAAuB,EAAE,UAAU;AACnC,IAAA,sBAAsB,EAAE,cAAc;AACtC,IAAA,sBAAsB,EAAE,gBAAgB;AACxC,IAAA,wBAAwB,EAAE,MAAM;AAChC,IAAA,sBAAsB,EAAE,KAAK;AAC7B,IAAA,qBAAqB,EAAE,eAAe;AACtC,IAAA,qBAAqB,EAAE,cAAc;AACrC,IAAA,sBAAsB,EAAE,cAAc;AACtC,IAAA,sBAAsB,EAAE,YAAY;;AAGpC,IAAA,sBAAsB,EAAE,6BAA6B;AACrD,IAAA,sBAAsB,EAAE,0BAA0B;AAClD,IAAA,wBAAwB,EAAE,cAAc;;AAGxC,IAAA,aAAa,EAAE,cAAc;AAC7B,IAAA,aAAa,EAAE,YAAY;AAC3B,IAAA,eAAe,EAAE,cAAc;AAC/B,IAAA,cAAc,EAAE,QAAQ;;AAGxB,IAAA,WAAW,EAAE,cAAc;AAC3B,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,mBAAmB,EAAE,eAAe;AACpC,IAAA,oBAAoB,EAAE,cAAc;AACpC,IAAA,aAAa,EAAE,cAAc;;AAG7B,IAAA,gBAAgB,EAAE,cAAc;AAChC,IAAA,gBAAgB,EAAE,YAAY;AAC9B,IAAA,gBAAgB,EAAE,aAAa;;AAG/B,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,eAAe,EAAE,QAAQ;;AAGzB,IAAA,oBAAoB,EAAE,cAAc;;AAGpC,IAAA,iBAAiB,EAAE,cAAc;AACjC,IAAA,eAAe,EAAE,cAAc;AAC/B,IAAA,cAAc,EAAE,cAAc;;AAG9B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,8BAA8B,EAAE,iBAAiB;AACjD,IAAA,8BAA8B,EAAE,kBAAkB;;AAGlD,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,iBAAiB,EAAE,cAAc;AACjC,IAAA,iBAAiB,EAAE,cAAc;AACjC,IAAA,kBAAkB,EAAE,eAAe;AACnC,IAAA,kBAAkB,EAAE,MAAM;AAC1B,IAAA,iBAAiB,EAAE,KAAK;;AAGxB,IAAA,kBAAkB,EAAE,QAAQ;;AAG5B,IAAA,qBAAqB,EAAE,uBAAuB;AAC9C,IAAA,qBAAqB,EAAE,oBAAoB;AAC3C,IAAA,qBAAqB,EAAE,MAAM;AAC7B,IAAA,oBAAoB,EAAE,KAAK;;MAMhB,0BAA0B,CAAA;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACjC,UAAU,GAAG,MAAM,CAAC,8BAA8B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAGvE,IAAA,SAAS,GAAG,IAAI,GAAG,EAAkB;;AAGrC,IAAA,SAAS,GAAG,IAAI,GAAG,EAAkB;AAE9C;;AAEG;AACH,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;AAAE,YAAA,OAAO,KAAK;QACtD,OAAO,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC1D;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;QACzC;IACF;AAEA;;;AAGG;AACH,IAAA,gBAAgB,CAAC,QAAgC,EAAA;AAC/C,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;;YAGpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtC;QACF;IACF;AAEA;;AAEG;AACH,IAAA,iBAAiB,CAAC,SAAiC,EAAA;AACjD,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;QACtC;IACF;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,MAAc,EAAA;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;IACnC;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,MAAc,EAAA;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;IACnC;AAEA;;;;AAIG;AACH,IAAA,kBAAkB,CAAC,MAAc,EAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACzC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,SAAS;AAC/B,QAAA,OAAO;aACJ,KAAK,CAAC,GAAG;AACT,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;aACrD,IAAI,CAAC,IAAI,CAAC;IACf;AAEA;;;AAGG;IACH,OAAO,CAAC,KAAoB,EAAE,MAAc,EAAA;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACzC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;AAE3B,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AACvC,YAAA,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;AACvD,YAAA,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC;AACvC,QAAA,CAAC,CAAC;IACJ;8GAzFW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cAFzB,MAAM,EAAA,CAAA,CAAA;;2FAEP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAHtC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MC5DY,4BAA4B,CAAA;AAC9B,IAAA,QAAQ;AACR,IAAA,WAAW;AACX,IAAA,SAAS;AACT,IAAA,WAAW;AA4BpB,IAAA,WAAA,GAAA;AA/BS,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAC7C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAE1C;;AAEG;QACH,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAC,QAAQ;6FAAU;AAE3C;;;AAGG;QACH,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,OAAO;iFAAC;AAEzC;;AAEG;QACH,IAAA,CAAA,cAAc,GAAG,KAAK,CAAU,IAAI;2FAAC;AAErC;;AAEG;QACH,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,IAAI;4FAAC;AAEtC;;AAEG;QACH,IAAA,CAAA,SAAS,GAAG,MAAM,EAAiB;;QAIjC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;YAClD,IAAI,QAAQ,EAAE;;AAEZ,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,QAAQ;AACtE,gBAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,mBAAmB,EAAE,SAAS,CAAC;YAC7F;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,mBAAmB,CAAC;YACrF;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACnB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACnE,gBAAA,MAAM,QAAQ,GAAG,CAAC,KAAoB,KAAI;;oBAExC,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;wBAC/E;oBACF;AACA,oBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC9B,gBAAA,CAAC;AAED,gBAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC;gBAC5C,SAAS,CAAC,MAAK;AACb,oBAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC;AACjD,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AAEH,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;AAC3B,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC9B;IACF;AAEA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;AACxC,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;gBACzB,KAAK,CAAC,cAAc,EAAE;YACxB;AACA,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;gBAC1B,KAAK,CAAC,eAAe,EAAE;YACzB;AAEA,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;;AAG1B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;AAC7C,YAAA,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE;gBACtC,MAAM,CAAC,KAAK,EAAE;YAChB;QACF;IACF;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa;AACvC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;QAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE;AAC9C,QAAA,MAAM,OAAO,GAAG,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ;AACrF,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,OAAO;QAEnH,OAAO,OAAO,IAAI,UAAU;IAC9B;8GA3GW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAqEE,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;ACtFrC;;AAEG;;;;"}
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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"}