@ship-ui/core 0.22.15 → 0.22.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/mcp/components.json +213 -47
- package/bin/src/subset.ts +6 -6
- package/bin/src/utilities.ts +14 -14
- package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs +12 -86
- 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 +17 -11
- 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 +24 -16
- package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
- package/fesm2022/ship-ui-core-ship-dialog.mjs +4 -0
- package/fesm2022/ship-ui-core-ship-dialog.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 +5 -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 +426 -23
- 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 +2 -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 +2 -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-table.d.ts +12 -1
- 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,39 +163,37 @@ const DEFAULT_KEYBINDINGS = {
|
|
|
180
163
|
'datepicker.day-prev': 'ArrowLeft, a',
|
|
181
164
|
'datepicker.week-next': 'ArrowDown, s',
|
|
182
165
|
'datepicker.week-prev': 'ArrowUp, w',
|
|
183
|
-
// Selection Group (Tabs, Steppers, Button Groups)
|
|
184
166
|
'selection-group.next': 'ArrowRight, ArrowDown, d, s',
|
|
185
167
|
'selection-group.prev': 'ArrowLeft, ArrowUp, a, w',
|
|
186
168
|
'selection-group.select': 'Enter, space',
|
|
187
|
-
// Select
|
|
188
169
|
'select.next': 'ArrowDown, s',
|
|
189
170
|
'select.prev': 'ArrowUp, w',
|
|
190
171
|
'select.select': 'Enter, space',
|
|
191
172
|
'select.close': 'Escape',
|
|
192
|
-
// Menu
|
|
193
173
|
'menu.next': 'ArrowDown, s',
|
|
194
174
|
'menu.prev': 'ArrowUp, w',
|
|
195
175
|
'menu.open-submenu': 'ArrowRight, d',
|
|
196
176
|
'menu.close-submenu': 'ArrowLeft, a',
|
|
197
177
|
'menu.select': 'Enter, space',
|
|
198
|
-
// Spotlight
|
|
199
178
|
'spotlight.next': 'ArrowDown, s',
|
|
200
179
|
'spotlight.prev': 'ArrowUp, w',
|
|
201
180
|
'spotlight.open': 'ctrlOrCmd+k',
|
|
202
|
-
// Dialog & Popover
|
|
203
181
|
'dialog.close': 'Escape',
|
|
204
182
|
'popover.close': 'Escape',
|
|
205
|
-
// Toggle Card
|
|
206
183
|
'toggle-card.toggle': 'Enter, space',
|
|
207
|
-
// Form Controls
|
|
208
184
|
'checkbox.toggle': 'Enter, space',
|
|
209
185
|
'toggle.toggle': 'Enter, space',
|
|
210
186
|
'radio.select': 'Enter, space',
|
|
211
|
-
// Table
|
|
212
187
|
'table.sort': 'Enter, space',
|
|
213
|
-
|
|
188
|
+
'table.column-resize-decrease': 'Shift+ArrowLeft',
|
|
189
|
+
'table.column-resize-increase': 'Shift+ArrowRight',
|
|
190
|
+
'grid.focus-up': 'ArrowUp, w',
|
|
191
|
+
'grid.focus-down': 'ArrowDown, s',
|
|
192
|
+
'grid.focus-left': 'ArrowLeft, a',
|
|
193
|
+
'grid.focus-right': 'ArrowRight, d',
|
|
194
|
+
'grid.focus-first': 'Home',
|
|
195
|
+
'grid.focus-last': 'End',
|
|
214
196
|
'blueprint.cancel': 'Escape',
|
|
215
|
-
// Editor Toolbar
|
|
216
197
|
'editor-toolbar.next': 'ArrowRight, ArrowDown',
|
|
217
198
|
'editor-toolbar.prev': 'ArrowLeft, ArrowUp',
|
|
218
199
|
'editor-toolbar.home': 'Home',
|
|
@@ -221,13 +202,8 @@ const DEFAULT_KEYBINDINGS = {
|
|
|
221
202
|
class ShipA11yKeybindingsService {
|
|
222
203
|
#platformId = inject(PLATFORM_ID);
|
|
223
204
|
#overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });
|
|
224
|
-
// Store of action names to active shortcut strings
|
|
225
205
|
#bindings = new Map();
|
|
226
|
-
// Store of action names to default shortcut strings
|
|
227
206
|
#defaults = new Map();
|
|
228
|
-
/**
|
|
229
|
-
* Returns true if the platform is running on macOS.
|
|
230
|
-
*/
|
|
231
207
|
get isMac() {
|
|
232
208
|
if (!isPlatformBrowser(this.#platformId))
|
|
233
209
|
return false;
|
|
@@ -239,44 +215,25 @@ class ShipA11yKeybindingsService {
|
|
|
239
215
|
this.registerOverrides(this.#overrides);
|
|
240
216
|
}
|
|
241
217
|
}
|
|
242
|
-
/**
|
|
243
|
-
* Registers default shortcuts for actions.
|
|
244
|
-
* If an override already exists for a given action, the override takes precedence.
|
|
245
|
-
*/
|
|
246
218
|
registerDefaults(defaults) {
|
|
247
219
|
for (const [action, shortcut] of Object.entries(defaults)) {
|
|
248
220
|
this.#defaults.set(action, shortcut);
|
|
249
|
-
// If we don't have an override/binding for this action, set it as the active binding
|
|
250
221
|
if (!this.#bindings.has(action)) {
|
|
251
222
|
this.#bindings.set(action, shortcut);
|
|
252
223
|
}
|
|
253
224
|
}
|
|
254
225
|
}
|
|
255
|
-
/**
|
|
256
|
-
* Registers overrides for actions. Overwrites any existing or default bindings.
|
|
257
|
-
*/
|
|
258
226
|
registerOverrides(overrides) {
|
|
259
227
|
for (const [action, shortcut] of Object.entries(overrides)) {
|
|
260
228
|
this.#bindings.set(action, shortcut);
|
|
261
229
|
}
|
|
262
230
|
}
|
|
263
|
-
/**
|
|
264
|
-
* Retrieves the active shortcut string for a registered action.
|
|
265
|
-
*/
|
|
266
231
|
getShortcut(action) {
|
|
267
232
|
return this.#bindings.get(action);
|
|
268
233
|
}
|
|
269
|
-
/**
|
|
270
|
-
* Retrieves the default shortcut string for a registered action.
|
|
271
|
-
*/
|
|
272
234
|
getDefaultShortcut(action) {
|
|
273
235
|
return this.#defaults.get(action);
|
|
274
236
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Gets a formatted, user-friendly shortcut string for display.
|
|
277
|
-
* E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, 'Ctrl+Shift+K' on Windows/Linux.
|
|
278
|
-
* Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d' -> 'ArrowRight, D').
|
|
279
|
-
*/
|
|
280
237
|
getDisplayShortcut(action) {
|
|
281
238
|
const shortcut = this.getShortcut(action);
|
|
282
239
|
if (!shortcut)
|
|
@@ -286,10 +243,6 @@ class ShipA11yKeybindingsService {
|
|
|
286
243
|
.map((part) => formatShortcut(part.trim(), this.isMac))
|
|
287
244
|
.join(', ');
|
|
288
245
|
}
|
|
289
|
-
/**
|
|
290
|
-
* Checks if a KeyboardEvent matches the configured keybinding for a given action.
|
|
291
|
-
* Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d').
|
|
292
|
-
*/
|
|
293
246
|
matches(event, action) {
|
|
294
247
|
const shortcut = this.getShortcut(action);
|
|
295
248
|
if (!shortcut)
|
|
@@ -319,37 +272,19 @@ class ShipA11yKeybindingsDirective {
|
|
|
319
272
|
this.#elementRef = inject((ElementRef));
|
|
320
273
|
this.#renderer = inject(Renderer2);
|
|
321
274
|
this.#platformId = inject(PLATFORM_ID);
|
|
322
|
-
/**
|
|
323
|
-
* The registered action name (e.g. 'table.next-page', 'dialog.close').
|
|
324
|
-
*/
|
|
325
275
|
this.shA11yKeybinding = input.required(/* @ts-ignore */
|
|
326
276
|
...(ngDevMode ? [{ debugName: "shA11yKeybinding" }] : /* istanbul ignore next */ []));
|
|
327
|
-
/**
|
|
328
|
-
* Defines whether the keybinding listener is 'local' (host element keydown) or 'global' (window keydown).
|
|
329
|
-
* Default is 'local'.
|
|
330
|
-
*/
|
|
331
277
|
this.mode = input('local', /* @ts-ignore */
|
|
332
278
|
...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
333
|
-
/**
|
|
334
|
-
* Whether to prevent the default action when the keybinding matches.
|
|
335
|
-
*/
|
|
336
279
|
this.preventDefault = input(true, /* @ts-ignore */
|
|
337
280
|
...(ngDevMode ? [{ debugName: "preventDefault" }] : /* istanbul ignore next */ []));
|
|
338
|
-
/**
|
|
339
|
-
* Whether to stop event propagation when the keybinding matches.
|
|
340
|
-
*/
|
|
341
281
|
this.stopPropagation = input(true, /* @ts-ignore */
|
|
342
282
|
...(ngDevMode ? [{ debugName: "stopPropagation" }] : /* istanbul ignore next */ []));
|
|
343
|
-
/**
|
|
344
|
-
* Event emitted when the keybinding is triggered.
|
|
345
|
-
*/
|
|
346
283
|
this.triggered = output();
|
|
347
|
-
// Dynamic effect to update aria-keyshortcuts on the host element when binding or service config changes
|
|
348
284
|
effect(() => {
|
|
349
285
|
const action = this.shA11yKeybinding();
|
|
350
286
|
const shortcut = this.#service.getShortcut(action);
|
|
351
287
|
if (shortcut) {
|
|
352
|
-
// Set the standardized shortcut string for screen reader accessibility
|
|
353
288
|
const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;
|
|
354
289
|
this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);
|
|
355
290
|
}
|
|
@@ -357,11 +292,9 @@ class ShipA11yKeybindingsDirective {
|
|
|
357
292
|
this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');
|
|
358
293
|
}
|
|
359
294
|
});
|
|
360
|
-
// Dynamic effect for global keydown event subscription when mode is 'global'
|
|
361
295
|
effect((onCleanup) => {
|
|
362
296
|
if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {
|
|
363
297
|
const listener = (event) => {
|
|
364
|
-
// Avoid firing global hotkeys when typing in editable elements unless modifiers (Ctrl/Cmd/Alt) are pressed
|
|
365
298
|
if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {
|
|
366
299
|
return;
|
|
367
300
|
}
|
|
@@ -374,9 +307,6 @@ class ShipA11yKeybindingsDirective {
|
|
|
374
307
|
}
|
|
375
308
|
});
|
|
376
309
|
}
|
|
377
|
-
/**
|
|
378
|
-
* Local keydown listener when mode is 'local'
|
|
379
|
-
*/
|
|
380
310
|
onKeyDown(event) {
|
|
381
311
|
if (this.mode() === 'local') {
|
|
382
312
|
this.#checkAndTrigger(event);
|
|
@@ -392,16 +322,12 @@ class ShipA11yKeybindingsDirective {
|
|
|
392
322
|
event.stopPropagation();
|
|
393
323
|
}
|
|
394
324
|
this.triggered.emit(event);
|
|
395
|
-
// Declaratively invoke click() on host elements that support it (buttons, anchors, inputs, etc.)
|
|
396
325
|
const hostEl = this.#elementRef.nativeElement;
|
|
397
326
|
if (typeof hostEl.click === 'function') {
|
|
398
327
|
hostEl.click();
|
|
399
328
|
}
|
|
400
329
|
}
|
|
401
330
|
}
|
|
402
|
-
/**
|
|
403
|
-
* Returns true if focus is in a text input or editable element.
|
|
404
|
-
*/
|
|
405
331
|
#isFocusInInput() {
|
|
406
332
|
const activeEl = document.activeElement;
|
|
407
333
|
if (!activeEl)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ship-ui-core-ship-a11y-keybindings.mjs","sources":["../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings-override.token.ts","../../../projects/ship-ui/ship-a11y-keybindings/keybinding-utils.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.service.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.directive.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-ui-core-ship-a11y-keybindings.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const SHIP_A11Y_KEYBINDINGS_OVERRIDE = new InjectionToken<Record<string, string>>('SHIP_A11Y_KEYBINDINGS_OVERRIDE');\n","export interface ParsedKeybinding {\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n shiftKey: boolean;\n key?: string;\n code?: string;\n}\n\n/**\n * Parses a keybinding shortcut string shorthand into a structured ParsedKeybinding object.\n * Supporting modifiers: ctrlOrCmd (OS adaptive), ctrl, cmd/meta, alt/option, shift.\n */\nexport function parseKeybinding(shorthand: string, isMacPlatform: boolean): ParsedKeybinding {\n const parts = shorthand.split('+').map(p => p.trim().toLowerCase());\n \n let ctrlKey = false;\n let metaKey = false;\n let altKey = false;\n let shiftKey = false;\n \n // The last part is the key/code\n const keyPart = parts[parts.length - 1] || '';\n \n // Parse any preceding parts as modifier keys\n for (let i = 0; i < parts.length - 1; i++) {\n const modifier = parts[i];\n if (modifier === 'ctrlorcmd') {\n if (isMacPlatform) {\n metaKey = true;\n } else {\n ctrlKey = true;\n }\n } else if (modifier === 'ctrl') {\n ctrlKey = true;\n } else if (modifier === 'meta' || modifier === 'cmd') {\n metaKey = true;\n } else if (modifier === 'alt' || modifier === 'option') {\n altKey = true;\n } else if (modifier === 'shift') {\n shiftKey = true;\n }\n }\n \n let key: string | undefined;\n let code: string | undefined;\n \n if (keyPart.startsWith('key') || keyPart.startsWith('digit')) {\n code = keyPart; // Matches event.code (case-insensitive)\n } else {\n // Map standard key names to event.key representation\n if (keyPart === 'enter') {\n key = 'enter';\n } else if (keyPart === 'esc' || keyPart === 'escape') {\n key = 'escape';\n } else if (keyPart === 'space') {\n key = ' ';\n } else if (keyPart === 'tab') {\n key = 'tab';\n } else if (keyPart === 'backspace') {\n key = 'backspace';\n } else if (keyPart === 'delete') {\n key = 'delete';\n } else if (keyPart === 'up' || keyPart === 'arrowup') {\n key = 'arrowup';\n } else if (keyPart === 'down' || keyPart === 'arrowdown') {\n key = 'arrowdown';\n } else if (keyPart === 'left' || keyPart === 'arrowleft') {\n key = 'arrowleft';\n } else if (keyPart === 'right' || keyPart === 'arrowright') {\n key = 'arrowright';\n } else if (keyPart === 'home') {\n key = 'home';\n } else if (keyPart === 'end') {\n key = 'end';\n } else if (keyPart === 'pageup') {\n key = 'pageup';\n } else if (keyPart === 'pagedown') {\n key = 'pagedown';\n } else {\n key = keyPart; // Raw key name\n }\n }\n \n return { ctrlKey, metaKey, altKey, shiftKey, key, code };\n}\n\n/**\n * Checks if a KeyboardEvent matches a ParsedKeybinding structure.\n */\nexport function matchKeybinding(event: KeyboardEvent, parsed: ParsedKeybinding): boolean {\n if (event.ctrlKey !== parsed.ctrlKey) return false;\n if (event.metaKey !== parsed.metaKey) return false;\n if (event.altKey !== parsed.altKey) return false;\n if (event.shiftKey !== parsed.shiftKey) return false;\n \n if (parsed.code) {\n return event.code.toLowerCase() === parsed.code;\n }\n if (parsed.key) {\n if (parsed.key === ' ') {\n return event.key === ' ' || event.key === 'Spacebar';\n }\n return event.key.toLowerCase() === parsed.key;\n }\n \n return false;\n}\n\n/**\n * Formats a shorthand shortcut string into an OS-specific user-friendly string for display.\n * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, and 'Ctrl+Shift+K' on Windows/Linux.\n */\nexport function formatShortcut(shorthand: string, isMacPlatform: boolean): string {\n const parts = shorthand.split('+').map(p => p.trim());\n const formattedParts: string[] = [];\n \n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const lowerPart = part.toLowerCase();\n \n if (i < parts.length - 1) {\n if (lowerPart === 'ctrlorcmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Ctrl');\n } else if (lowerPart === 'ctrl') {\n formattedParts.push(isMacPlatform ? '⌃' : 'Ctrl');\n } else if (lowerPart === 'meta' || lowerPart === 'cmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Win');\n } else if (lowerPart === 'alt' || lowerPart === 'option') {\n formattedParts.push(isMacPlatform ? '⌥' : 'Alt');\n } else if (lowerPart === 'shift') {\n formattedParts.push(isMacPlatform ? '⇧' : 'Shift');\n }\n } else {\n // Key/code part\n if (lowerPart.startsWith('key')) {\n formattedParts.push(part.substring(3).toUpperCase()); // E.g. KeyA -> A\n } else if (lowerPart.startsWith('digit')) {\n formattedParts.push(part.substring(5)); // E.g. Digit1 -> 1\n } else {\n // Capitalize first letter of standard keys\n const capitalized = part.charAt(0).toUpperCase() + part.slice(1);\n formattedParts.push(capitalized);\n }\n }\n }\n \n if (isMacPlatform) {\n return formattedParts.join('');\n } else {\n return formattedParts.join('+');\n }\n}\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SHIP_A11Y_KEYBINDINGS_OVERRIDE } from './ship-a11y-keybindings-override.token';\nimport { parseKeybinding, matchKeybinding, formatShortcut } from './keybinding-utils';\n\nexport const DEFAULT_KEYBINDINGS: Record<string, string> = {\n // Datepicker\n 'datepicker.prev-month': 'PageUp',\n 'datepicker.next-month': 'PageDown',\n 'datepicker.prev-year': 'Shift+PageUp',\n 'datepicker.next-year': 'Shift+PageDown',\n 'datepicker.month-start': 'Home',\n 'datepicker.month-end': 'End',\n 'datepicker.day-next': 'ArrowRight, d',\n 'datepicker.day-prev': 'ArrowLeft, a',\n 'datepicker.week-next': 'ArrowDown, s',\n 'datepicker.week-prev': 'ArrowUp, w',\n\n // Selection Group (Tabs, Steppers, Button Groups)\n 'selection-group.next': 'ArrowRight, ArrowDown, d, s',\n 'selection-group.prev': 'ArrowLeft, ArrowUp, a, w',\n 'selection-group.select': 'Enter, space',\n\n // Select\n 'select.next': 'ArrowDown, s',\n 'select.prev': 'ArrowUp, w',\n 'select.select': 'Enter, space',\n 'select.close': 'Escape',\n\n // Menu\n 'menu.next': 'ArrowDown, s',\n 'menu.prev': 'ArrowUp, w',\n 'menu.open-submenu': 'ArrowRight, d',\n 'menu.close-submenu': 'ArrowLeft, a',\n 'menu.select': 'Enter, space',\n\n // Spotlight\n 'spotlight.next': 'ArrowDown, s',\n 'spotlight.prev': 'ArrowUp, w',\n 'spotlight.open': 'ctrlOrCmd+k',\n\n // Dialog & Popover\n 'dialog.close': 'Escape',\n 'popover.close': 'Escape',\n\n // Toggle Card\n 'toggle-card.toggle': 'Enter, space',\n\n // Form Controls\n 'checkbox.toggle': 'Enter, space',\n 'toggle.toggle': 'Enter, space',\n 'radio.select': 'Enter, space',\n\n // Table\n 'table.sort': 'Enter, space',\n\n // Blueprint\n 'blueprint.cancel': 'Escape',\n\n // Editor Toolbar\n 'editor-toolbar.next': 'ArrowRight, ArrowDown',\n 'editor-toolbar.prev': 'ArrowLeft, ArrowUp',\n 'editor-toolbar.home': 'Home',\n 'editor-toolbar.end': 'End',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipA11yKeybindingsService {\n readonly #platformId = inject(PLATFORM_ID);\n readonly #overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });\n \n // Store of action names to active shortcut strings\n readonly #bindings = new Map<string, string>();\n \n // Store of action names to default shortcut strings\n readonly #defaults = new Map<string, string>();\n\n /**\n * Returns true if the platform is running on macOS.\n */\n get isMac(): boolean {\n if (!isPlatformBrowser(this.#platformId)) return false;\n return navigator.userAgent.toLowerCase().includes('mac');\n }\n\n constructor() {\n this.registerDefaults(DEFAULT_KEYBINDINGS);\n if (this.#overrides) {\n this.registerOverrides(this.#overrides);\n }\n }\n\n /**\n * Registers default shortcuts for actions.\n * If an override already exists for a given action, the override takes precedence.\n */\n registerDefaults(defaults: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(defaults)) {\n this.#defaults.set(action, shortcut);\n \n // If we don't have an override/binding for this action, set it as the active binding\n if (!this.#bindings.has(action)) {\n this.#bindings.set(action, shortcut);\n }\n }\n }\n\n /**\n * Registers overrides for actions. Overwrites any existing or default bindings.\n */\n registerOverrides(overrides: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(overrides)) {\n this.#bindings.set(action, shortcut);\n }\n }\n\n /**\n * Retrieves the active shortcut string for a registered action.\n */\n getShortcut(action: string): string | undefined {\n return this.#bindings.get(action);\n }\n\n /**\n * Retrieves the default shortcut string for a registered action.\n */\n getDefaultShortcut(action: string): string | undefined {\n return this.#defaults.get(action);\n }\n\n /**\n * Gets a formatted, user-friendly shortcut string for display.\n * E.g. 'ctrlOrCmd+Shift+KeyK' -> '⌘⇧K' on macOS, 'Ctrl+Shift+K' on Windows/Linux.\n * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d' -> 'ArrowRight, D').\n */\n getDisplayShortcut(action: string): string | undefined {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return undefined;\n return shortcut\n .split(',')\n .map((part) => formatShortcut(part.trim(), this.isMac))\n .join(', ');\n }\n\n /**\n * Checks if a KeyboardEvent matches the configured keybinding for a given action.\n * Supports comma-separated multiple shortcuts (e.g. 'ArrowRight, d').\n */\n matches(event: KeyboardEvent, action: string): boolean {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return false;\n \n return shortcut.split(',').some((part) => {\n const parsed = parseKeybinding(part.trim(), this.isMac);\n return matchKeybinding(event, parsed);\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n PLATFORM_ID,\n Renderer2,\n} from '@angular/core';\nimport { ShipA11yKeybindingsService } from './ship-a11y-keybindings.service';\n\n@Directive({\n selector: '[shA11yKeybinding]',\n standalone: true,\n})\nexport class ShipA11yKeybindingsDirective {\n readonly #service = inject(ShipA11yKeybindingsService);\n readonly #elementRef = inject(ElementRef<HTMLElement>);\n readonly #renderer = inject(Renderer2);\n readonly #platformId = inject(PLATFORM_ID);\n\n /**\n * The registered action name (e.g. 'table.next-page', 'dialog.close').\n */\n shA11yKeybinding = input.required<string>();\n\n /**\n * Defines whether the keybinding listener is 'local' (host element keydown) or 'global' (window keydown).\n * Default is 'local'.\n */\n mode = input<'global' | 'local'>('local');\n\n /**\n * Whether to prevent the default action when the keybinding matches.\n */\n preventDefault = input<boolean>(true);\n\n /**\n * Whether to stop event propagation when the keybinding matches.\n */\n stopPropagation = input<boolean>(true);\n\n /**\n * Event emitted when the keybinding is triggered.\n */\n triggered = output<KeyboardEvent>();\n\n constructor() {\n // Dynamic effect to update aria-keyshortcuts on the host element when binding or service config changes\n effect(() => {\n const action = this.shA11yKeybinding();\n const shortcut = this.#service.getShortcut(action);\n if (shortcut) {\n // Set the standardized shortcut string for screen reader accessibility\n const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;\n this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);\n } else {\n this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');\n }\n });\n\n // Dynamic effect for global keydown event subscription when mode is 'global'\n effect((onCleanup) => {\n if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {\n const listener = (event: KeyboardEvent) => {\n // Avoid firing global hotkeys when typing in editable elements unless modifiers (Ctrl/Cmd/Alt) are pressed\n if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {\n return;\n }\n this.#checkAndTrigger(event);\n };\n\n window.addEventListener('keydown', listener);\n onCleanup(() => {\n window.removeEventListener('keydown', listener);\n });\n }\n });\n }\n\n /**\n * Local keydown listener when mode is 'local'\n */\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (this.mode() === 'local') {\n this.#checkAndTrigger(event);\n }\n }\n\n #checkAndTrigger(event: KeyboardEvent): void {\n const action = this.shA11yKeybinding();\n if (this.#service.matches(event, action)) {\n if (this.preventDefault()) {\n event.preventDefault();\n }\n if (this.stopPropagation()) {\n event.stopPropagation();\n }\n\n this.triggered.emit(event);\n\n // Declaratively invoke click() on host elements that support it (buttons, anchors, inputs, etc.)\n const hostEl = this.#elementRef.nativeElement;\n if (typeof hostEl.click === 'function') {\n hostEl.click();\n }\n }\n }\n\n /**\n * Returns true if focus is in a text input or editable element.\n */\n #isFocusInInput(): boolean {\n const activeEl = document.activeElement;\n if (!activeEl) return false;\n\n const tagName = activeEl.tagName.toLowerCase();\n const isInput = tagName === 'input' || tagName === 'textarea' || tagName === 'select';\n const isEditable = activeEl.hasAttribute('contenteditable') && activeEl.getAttribute('contenteditable') !== 'false';\n\n return isInput || isEditable;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ship-ui-core-ship-a11y-keybindings.mjs","sources":["../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings-override.token.ts","../../../projects/ship-ui/ship-a11y-keybindings/keybinding-utils.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.service.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-a11y-keybindings.directive.ts","../../../projects/ship-ui/ship-a11y-keybindings/ship-ui-core-ship-a11y-keybindings.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const SHIP_A11Y_KEYBINDINGS_OVERRIDE = new InjectionToken<Record<string, string>>('SHIP_A11Y_KEYBINDINGS_OVERRIDE');\n","export interface ParsedKeybinding {\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n shiftKey: boolean;\n key?: string;\n code?: string;\n}\n\n\n\n\n\nexport function parseKeybinding(shorthand: string, isMacPlatform: boolean): ParsedKeybinding {\n const parts = shorthand.split('+').map(p => p.trim().toLowerCase());\n \n let ctrlKey = false;\n let metaKey = false;\n let altKey = false;\n let shiftKey = false;\n \n \n const keyPart = parts[parts.length - 1] || '';\n \n \n for (let i = 0; i < parts.length - 1; i++) {\n const modifier = parts[i];\n if (modifier === 'ctrlorcmd') {\n if (isMacPlatform) {\n metaKey = true;\n } else {\n ctrlKey = true;\n }\n } else if (modifier === 'ctrl') {\n ctrlKey = true;\n } else if (modifier === 'meta' || modifier === 'cmd') {\n metaKey = true;\n } else if (modifier === 'alt' || modifier === 'option') {\n altKey = true;\n } else if (modifier === 'shift') {\n shiftKey = true;\n }\n }\n \n let key: string | undefined;\n let code: string | undefined;\n \n if (keyPart.startsWith('key') || keyPart.startsWith('digit')) {\n code = keyPart; \n } else {\n \n if (keyPart === 'enter') {\n key = 'enter';\n } else if (keyPart === 'esc' || keyPart === 'escape') {\n key = 'escape';\n } else if (keyPart === 'space') {\n key = ' ';\n } else if (keyPart === 'tab') {\n key = 'tab';\n } else if (keyPart === 'backspace') {\n key = 'backspace';\n } else if (keyPart === 'delete') {\n key = 'delete';\n } else if (keyPart === 'up' || keyPart === 'arrowup') {\n key = 'arrowup';\n } else if (keyPart === 'down' || keyPart === 'arrowdown') {\n key = 'arrowdown';\n } else if (keyPart === 'left' || keyPart === 'arrowleft') {\n key = 'arrowleft';\n } else if (keyPart === 'right' || keyPart === 'arrowright') {\n key = 'arrowright';\n } else if (keyPart === 'home') {\n key = 'home';\n } else if (keyPart === 'end') {\n key = 'end';\n } else if (keyPart === 'pageup') {\n key = 'pageup';\n } else if (keyPart === 'pagedown') {\n key = 'pagedown';\n } else {\n key = keyPart; \n }\n }\n \n return { ctrlKey, metaKey, altKey, shiftKey, key, code };\n}\n\n\n\n\nexport function matchKeybinding(event: KeyboardEvent, parsed: ParsedKeybinding): boolean {\n if (event.ctrlKey !== parsed.ctrlKey) return false;\n if (event.metaKey !== parsed.metaKey) return false;\n if (event.altKey !== parsed.altKey) return false;\n if (event.shiftKey !== parsed.shiftKey) return false;\n \n if (parsed.code) {\n return event.code.toLowerCase() === parsed.code;\n }\n if (parsed.key) {\n if (parsed.key === ' ') {\n return event.key === ' ' || event.key === 'Spacebar';\n }\n return event.key.toLowerCase() === parsed.key;\n }\n \n return false;\n}\n\n\n\n\n\nexport function formatShortcut(shorthand: string, isMacPlatform: boolean): string {\n const parts = shorthand.split('+').map(p => p.trim());\n const formattedParts: string[] = [];\n \n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const lowerPart = part.toLowerCase();\n \n if (i < parts.length - 1) {\n if (lowerPart === 'ctrlorcmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Ctrl');\n } else if (lowerPart === 'ctrl') {\n formattedParts.push(isMacPlatform ? '⌃' : 'Ctrl');\n } else if (lowerPart === 'meta' || lowerPart === 'cmd') {\n formattedParts.push(isMacPlatform ? '⌘' : 'Win');\n } else if (lowerPart === 'alt' || lowerPart === 'option') {\n formattedParts.push(isMacPlatform ? '⌥' : 'Alt');\n } else if (lowerPart === 'shift') {\n formattedParts.push(isMacPlatform ? '⇧' : 'Shift');\n }\n } else {\n \n if (lowerPart.startsWith('key')) {\n formattedParts.push(part.substring(3).toUpperCase()); \n } else if (lowerPart.startsWith('digit')) {\n formattedParts.push(part.substring(5)); \n } else {\n \n const capitalized = part.charAt(0).toUpperCase() + part.slice(1);\n formattedParts.push(capitalized);\n }\n }\n }\n \n if (isMacPlatform) {\n return formattedParts.join('');\n } else {\n return formattedParts.join('+');\n }\n}\n","import { inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SHIP_A11Y_KEYBINDINGS_OVERRIDE } from './ship-a11y-keybindings-override.token';\nimport { parseKeybinding, matchKeybinding, formatShortcut } from './keybinding-utils';\n\nexport const DEFAULT_KEYBINDINGS: Record<string, string> = {\n \n 'datepicker.prev-month': 'PageUp',\n 'datepicker.next-month': 'PageDown',\n 'datepicker.prev-year': 'Shift+PageUp',\n 'datepicker.next-year': 'Shift+PageDown',\n 'datepicker.month-start': 'Home',\n 'datepicker.month-end': 'End',\n 'datepicker.day-next': 'ArrowRight, d',\n 'datepicker.day-prev': 'ArrowLeft, a',\n 'datepicker.week-next': 'ArrowDown, s',\n 'datepicker.week-prev': 'ArrowUp, w',\n\n \n 'selection-group.next': 'ArrowRight, ArrowDown, d, s',\n 'selection-group.prev': 'ArrowLeft, ArrowUp, a, w',\n 'selection-group.select': 'Enter, space',\n\n \n 'select.next': 'ArrowDown, s',\n 'select.prev': 'ArrowUp, w',\n 'select.select': 'Enter, space',\n 'select.close': 'Escape',\n\n \n 'menu.next': 'ArrowDown, s',\n 'menu.prev': 'ArrowUp, w',\n 'menu.open-submenu': 'ArrowRight, d',\n 'menu.close-submenu': 'ArrowLeft, a',\n 'menu.select': 'Enter, space',\n\n \n 'spotlight.next': 'ArrowDown, s',\n 'spotlight.prev': 'ArrowUp, w',\n 'spotlight.open': 'ctrlOrCmd+k',\n\n \n 'dialog.close': 'Escape',\n 'popover.close': 'Escape',\n\n \n 'toggle-card.toggle': 'Enter, space',\n\n \n 'checkbox.toggle': 'Enter, space',\n 'toggle.toggle': 'Enter, space',\n 'radio.select': 'Enter, space',\n\n \n 'table.sort': 'Enter, space',\n 'table.column-resize-decrease': 'Shift+ArrowLeft',\n 'table.column-resize-increase': 'Shift+ArrowRight',\n\n \n 'grid.focus-up': 'ArrowUp, w',\n 'grid.focus-down': 'ArrowDown, s',\n 'grid.focus-left': 'ArrowLeft, a',\n 'grid.focus-right': 'ArrowRight, d',\n 'grid.focus-first': 'Home',\n 'grid.focus-last': 'End',\n\n \n 'blueprint.cancel': 'Escape',\n\n \n 'editor-toolbar.next': 'ArrowRight, ArrowDown',\n 'editor-toolbar.prev': 'ArrowLeft, ArrowUp',\n 'editor-toolbar.home': 'Home',\n 'editor-toolbar.end': 'End',\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ShipA11yKeybindingsService {\n #platformId = inject(PLATFORM_ID);\n #overrides = inject(SHIP_A11Y_KEYBINDINGS_OVERRIDE, { optional: true });\n \n \n #bindings = new Map<string, string>();\n \n \n #defaults = new Map<string, string>();\n\n \n\n\n get isMac(): boolean {\n if (!isPlatformBrowser(this.#platformId)) return false;\n return navigator.userAgent.toLowerCase().includes('mac');\n }\n\n constructor() {\n this.registerDefaults(DEFAULT_KEYBINDINGS);\n if (this.#overrides) {\n this.registerOverrides(this.#overrides);\n }\n }\n\n \n\n\n\n registerDefaults(defaults: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(defaults)) {\n this.#defaults.set(action, shortcut);\n \n \n if (!this.#bindings.has(action)) {\n this.#bindings.set(action, shortcut);\n }\n }\n }\n\n \n\n\n registerOverrides(overrides: Record<string, string>): void {\n for (const [action, shortcut] of Object.entries(overrides)) {\n this.#bindings.set(action, shortcut);\n }\n }\n\n \n\n\n getShortcut(action: string): string | undefined {\n return this.#bindings.get(action);\n }\n\n \n\n\n getDefaultShortcut(action: string): string | undefined {\n return this.#defaults.get(action);\n }\n\n \n\n\n\n\n getDisplayShortcut(action: string): string | undefined {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return undefined;\n return shortcut\n .split(',')\n .map((part) => formatShortcut(part.trim(), this.isMac))\n .join(', ');\n }\n\n \n\n\n\n matches(event: KeyboardEvent, action: string): boolean {\n const shortcut = this.getShortcut(action);\n if (!shortcut) return false;\n \n return shortcut.split(',').some((part) => {\n const parsed = parseKeybinding(part.trim(), this.isMac);\n return matchKeybinding(event, parsed);\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n PLATFORM_ID,\n Renderer2,\n} from '@angular/core';\nimport { ShipA11yKeybindingsService } from './ship-a11y-keybindings.service';\n\n@Directive({\n selector: '[shA11yKeybinding]',\n standalone: true,\n})\nexport class ShipA11yKeybindingsDirective {\n #service = inject(ShipA11yKeybindingsService);\n #elementRef = inject(ElementRef<HTMLElement>);\n #renderer = inject(Renderer2);\n #platformId = inject(PLATFORM_ID);\n\n \n\n\n shA11yKeybinding = input.required<string>();\n\n \n\n\n\n mode = input<'global' | 'local'>('local');\n\n \n\n\n preventDefault = input<boolean>(true);\n\n \n\n\n stopPropagation = input<boolean>(true);\n\n \n\n\n triggered = output<KeyboardEvent>();\n\n constructor() {\n \n effect(() => {\n const action = this.shA11yKeybinding();\n const shortcut = this.#service.getShortcut(action);\n if (shortcut) {\n \n const ariaValue = this.#service.getDisplayShortcut(action) || shortcut;\n this.#renderer.setAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts', ariaValue);\n } else {\n this.#renderer.removeAttribute(this.#elementRef.nativeElement, 'aria-keyshortcuts');\n }\n });\n\n \n effect((onCleanup) => {\n if (this.mode() === 'global' && isPlatformBrowser(this.#platformId)) {\n const listener = (event: KeyboardEvent) => {\n \n if (this.#isFocusInInput() && !event.ctrlKey && !event.metaKey && !event.altKey) {\n return;\n }\n this.#checkAndTrigger(event);\n };\n\n window.addEventListener('keydown', listener);\n onCleanup(() => {\n window.removeEventListener('keydown', listener);\n });\n }\n });\n }\n\n \n\n\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (this.mode() === 'local') {\n this.#checkAndTrigger(event);\n }\n }\n\n #checkAndTrigger(event: KeyboardEvent): void {\n const action = this.shA11yKeybinding();\n if (this.#service.matches(event, action)) {\n if (this.preventDefault()) {\n event.preventDefault();\n }\n if (this.stopPropagation()) {\n event.stopPropagation();\n }\n\n this.triggered.emit(event);\n\n \n const hostEl = this.#elementRef.nativeElement;\n if (typeof hostEl.click === 'function') {\n hostEl.click();\n }\n }\n }\n\n \n\n\n #isFocusInInput(): boolean {\n const activeEl = document.activeElement;\n if (!activeEl) return false;\n\n const tagName = activeEl.tagName.toLowerCase();\n const isInput = tagName === 'input' || tagName === 'textarea' || tagName === 'select';\n const isEditable = activeEl.hasAttribute('contenteditable') && activeEl.getAttribute('contenteditable') !== 'false';\n\n return isInput || isEditable;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@ import { inject, ElementRef, input, model, effect, ChangeDetectionStrategy, View
|
|
|
3
3
|
import { shipComponentClasses, contentProjectionSignal } from '@ship-ui/core';
|
|
4
4
|
|
|
5
5
|
class ShipAccordion {
|
|
6
|
+
#selfElement;
|
|
6
7
|
constructor() {
|
|
7
|
-
this
|
|
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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"}
|