@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.
- package/assets/mcp/components.json +181 -39
- package/bin/src/subset.ts +6 -6
- package/bin/src/utilities.ts +14 -14
- package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs +4 -87
- package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-accordion.mjs +4 -3
- package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-alert.mjs +1 -4
- package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-blueprint.mjs +8 -10
- package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-checkbox.mjs +3 -2
- package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-color-picker.mjs +66 -62
- package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-datepicker.mjs +8 -12
- package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-editor.mjs +0 -42
- package/fesm2022/ship-ui-core-ship-editor.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-form-field.mjs +0 -1
- package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-kbd.mjs +0 -6
- package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs +241 -0
- package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs.map +1 -0
- package/fesm2022/ship-ui-core-ship-menu.mjs +7 -10
- package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-popover.mjs +1 -20
- package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-radio.mjs +3 -2
- package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-range-slider.mjs +7 -9
- package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-sidenav.mjs +2 -2
- package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-sortable.mjs +262 -68
- package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-spotlight.mjs +0 -11
- package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-stepper.mjs +1 -1
- package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-table.mjs +4 -5
- package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-toggle.mjs +3 -2
- package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-tree.mjs +1 -9
- package/fesm2022/ship-ui-core-ship-tree.mjs.map +1 -1
- package/fesm2022/ship-ui-core.mjs +37 -53
- package/fesm2022/ship-ui-core.mjs.map +1 -1
- package/package.json +5 -1
- package/types/ship-ui-core-ship-a11y-keybindings.d.ts +0 -55
- package/types/ship-ui-core-ship-accordion.d.ts +7 -7
- package/types/ship-ui-core-ship-blueprint.d.ts +1 -1
- package/types/ship-ui-core-ship-checkbox.d.ts +2 -3
- package/types/ship-ui-core-ship-color-picker.d.ts +1 -25
- package/types/ship-ui-core-ship-datepicker.d.ts +0 -3
- package/types/ship-ui-core-ship-editor.d.ts +10 -10
- package/types/ship-ui-core-ship-list-item-swipe.d.ts +25 -0
- package/types/ship-ui-core-ship-menu.d.ts +1 -2
- package/types/ship-ui-core-ship-radio.d.ts +2 -3
- package/types/ship-ui-core-ship-range-slider.d.ts +6 -6
- package/types/ship-ui-core-ship-sortable.d.ts +31 -9
- package/types/ship-ui-core-ship-toggle.d.ts +2 -3
- package/types/ship-ui-core-ship-tree.d.ts +20 -25
- 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;
|
|
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;
|
|
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());
|
|
136
|
+
formattedParts.push(part.substring(3).toUpperCase());
|
|
152
137
|
}
|
|
153
138
|
else if (lowerPart.startsWith('digit')) {
|
|
154
|
-
formattedParts.push(part.substring(5));
|
|
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":"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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
|
|
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
|
|
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
|
|
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
|
|
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);
|
|
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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"}
|