@tailng-ui/primitives 0.1.0 → 0.12.0
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/README.md +97 -11
- package/package.json +9 -3
- package/src/index.d.ts +5 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +5 -0
- package/src/index.js.map +1 -1
- package/src/lib/feedback/empty/tng-empty.d.ts.map +1 -1
- package/src/lib/feedback/empty/tng-empty.js +5 -0
- package/src/lib/feedback/empty/tng-empty.js.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.js +4 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.js.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.js +3 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.js.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.d.ts +1 -0
- package/src/lib/feedback/skeleton/tng-skeleton.d.ts.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.js +5 -0
- package/src/lib/feedback/skeleton/tng-skeleton.js.map +1 -1
- package/src/lib/feedback/toast/tng-toast.d.ts.map +1 -1
- package/src/lib/feedback/toast/tng-toast.js +2 -0
- package/src/lib/feedback/toast/tng-toast.js.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.d.ts.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.js +1 -0
- package/src/lib/form/checkbox/tng-checkbox.js.map +1 -1
- package/src/lib/form/chips/tng-chips.d.ts +53 -1
- package/src/lib/form/chips/tng-chips.d.ts.map +1 -1
- package/src/lib/form/chips/tng-chips.js +284 -1
- package/src/lib/form/chips/tng-chips.js.map +1 -1
- package/src/lib/form/combobox/tng-combobox.d.ts.map +1 -1
- package/src/lib/form/combobox/tng-combobox.js +1 -0
- package/src/lib/form/combobox/tng-combobox.js.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.d.ts +22 -0
- package/src/lib/form/input-otp/tng-input-otp.d.ts.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.js +106 -1
- package/src/lib/form/input-otp/tng-input-otp.js.map +1 -1
- package/src/lib/form/label/tng-label.d.ts +2 -0
- package/src/lib/form/label/tng-label.d.ts.map +1 -1
- package/src/lib/form/label/tng-label.js +10 -0
- package/src/lib/form/label/tng-label.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts +1 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js +26 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.d.ts.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.js +1 -0
- package/src/lib/form/multiselect/tng-multiselect.js.map +1 -1
- package/src/lib/form/radio/tng-radio.d.ts +26 -0
- package/src/lib/form/radio/tng-radio.d.ts.map +1 -1
- package/src/lib/form/radio/tng-radio.js +130 -1
- package/src/lib/form/radio/tng-radio.js.map +1 -1
- package/src/lib/form/slider/tng-slider.d.ts.map +1 -1
- package/src/lib/form/slider/tng-slider.js +1 -0
- package/src/lib/form/slider/tng-slider.js.map +1 -1
- package/src/lib/form/switch/tng-switch.d.ts.map +1 -1
- package/src/lib/form/switch/tng-switch.js +1 -0
- package/src/lib/form/switch/tng-switch.js.map +1 -1
- package/src/lib/form/textarea/tng-textarea.d.ts +6 -14
- package/src/lib/form/textarea/tng-textarea.d.ts.map +1 -1
- package/src/lib/form/textarea/tng-textarea.js +42 -85
- package/src/lib/form/textarea/tng-textarea.js.map +1 -1
- package/src/lib/form/toggle/tng-toggle.d.ts.map +1 -1
- package/src/lib/form/toggle/tng-toggle.js +1 -0
- package/src/lib/form/toggle/tng-toggle.js.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.d.ts.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.js +1 -0
- package/src/lib/form/toggle-group/tng-toggle-group.js.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.d.ts +9 -0
- package/src/lib/layout/accordion/tng-accordion.d.ts.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.js +113 -0
- package/src/lib/layout/accordion/tng-accordion.js.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js +1 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js.map +1 -1
- package/src/lib/layout/card/tng-card.d.ts.map +1 -1
- package/src/lib/layout/card/tng-card.js +10 -0
- package/src/lib/layout/card/tng-card.js.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.d.ts.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.js +3 -0
- package/src/lib/layout/collapsible/tng-collapsible.js.map +1 -1
- package/src/lib/layout/grid/tng-grid.d.ts.map +1 -1
- package/src/lib/layout/grid/tng-grid.js +1 -0
- package/src/lib/layout/grid/tng-grid.js.map +1 -1
- package/src/lib/layout/separator/tng-separator.d.ts.map +1 -1
- package/src/lib/layout/separator/tng-separator.js +1 -0
- package/src/lib/layout/separator/tng-separator.js.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.d.ts.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.js +1 -0
- package/src/lib/layout/stepper/tng-stepper.js.map +1 -1
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts +20 -0
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts.map +1 -0
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js +106 -0
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js.map +1 -0
- package/src/lib/layout/tree/index.d.ts +5 -0
- package/src/lib/layout/tree/index.d.ts.map +1 -0
- package/src/lib/layout/tree/index.js +5 -0
- package/src/lib/layout/tree/index.js.map +1 -0
- package/src/lib/layout/tree/tng-tree-group.d.ts +10 -0
- package/src/lib/layout/tree/tng-tree-group.d.ts.map +1 -0
- package/src/lib/layout/tree/tng-tree-group.js +29 -0
- package/src/lib/layout/tree/tng-tree-group.js.map +1 -0
- package/src/lib/layout/tree/tng-tree-indicator.d.ts +8 -0
- package/src/lib/layout/tree/tng-tree-indicator.d.ts.map +1 -0
- package/src/lib/layout/tree/tng-tree-indicator.js +36 -0
- package/src/lib/layout/tree/tng-tree-indicator.js.map +1 -0
- package/src/lib/layout/tree/tng-tree-item.d.ts +36 -0
- package/src/lib/layout/tree/tng-tree-item.d.ts.map +1 -0
- package/src/lib/layout/tree/tng-tree-item.js +139 -0
- package/src/lib/layout/tree/tng-tree-item.js.map +1 -0
- package/src/lib/layout/tree/tng-tree.d.ts +64 -1
- package/src/lib/layout/tree/tng-tree.d.ts.map +1 -1
- package/src/lib/layout/tree/tng-tree.js +536 -1
- package/src/lib/layout/tree/tng-tree.js.map +1 -1
- package/src/lib/layout/tree/tng-tree.transforms.d.ts +10 -0
- package/src/lib/layout/tree/tng-tree.transforms.d.ts.map +1 -0
- package/src/lib/layout/tree/tng-tree.transforms.js +46 -0
- package/src/lib/layout/tree/tng-tree.transforms.js.map +1 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.js +5 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.js.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js +1 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.js +1 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.js.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.d.ts.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.js +1 -0
- package/src/lib/navigation/toolbar/tng-toolbar.js.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.d.ts +158 -0
- package/src/lib/overlay/dialog/tng-dialog.d.ts.map +1 -0
- package/src/lib/overlay/dialog/tng-dialog.js +854 -0
- package/src/lib/overlay/dialog/tng-dialog.js.map +1 -0
- package/src/lib/overlay/popover/tng-popover.d.ts +121 -0
- package/src/lib/overlay/popover/tng-popover.d.ts.map +1 -0
- package/src/lib/overlay/popover/tng-popover.js +614 -0
- package/src/lib/overlay/popover/tng-popover.js.map +1 -0
- package/src/lib/overlay/tng-overlay-runtime.d.ts +11 -0
- package/src/lib/overlay/tng-overlay-runtime.d.ts.map +1 -0
- package/src/lib/overlay/tng-overlay-runtime.js +6 -0
- package/src/lib/overlay/tng-overlay-runtime.js.map +1 -0
- package/src/lib/overlay/tooltip/tng-tooltip.d.ts +92 -3
- package/src/lib/overlay/tooltip/tng-tooltip.d.ts.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.js +477 -3
- package/src/lib/overlay/tooltip/tng-tooltip.js.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.d.ts.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.js +3 -0
- package/src/lib/utility/avatar/tng-avatar.js.map +1 -1
- package/src/lib/utility/badge/tng-badge.d.ts +6 -0
- package/src/lib/utility/badge/tng-badge.d.ts.map +1 -1
- package/src/lib/utility/badge/tng-badge.js +66 -0
- package/src/lib/utility/badge/tng-badge.js.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.d.ts.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.js +5 -0
- package/src/lib/utility/code-block/tng-code-block.js.map +1 -1
- package/src/lib/utility/copy/tng-copy.d.ts +21 -10
- package/src/lib/utility/copy/tng-copy.d.ts.map +1 -1
- package/src/lib/utility/copy/tng-copy.js +118 -88
- package/src/lib/utility/copy/tng-copy.js.map +1 -1
- package/src/lib/utility/press/tng-press.d.ts.map +1 -1
- package/src/lib/utility/press/tng-press.js +1 -0
- package/src/lib/utility/press/tng-press.js.map +1 -1
- package/src/lib/utility/tag/tng-tag.d.ts +37 -0
- package/src/lib/utility/tag/tng-tag.d.ts.map +1 -1
- package/src/lib/utility/tag/tng-tag.js +198 -1
- package/src/lib/utility/tag/tng-tag.js.map +1 -1
|
@@ -196,35 +196,39 @@ function resolveExplicitText(value) {
|
|
|
196
196
|
return { error: toCopyError(error), value: null };
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
|
-
function
|
|
199
|
+
function parseHotkey(hotkey) {
|
|
200
200
|
const tokens = hotkey
|
|
201
201
|
.split('+')
|
|
202
|
-
.map((
|
|
203
|
-
.filter(
|
|
204
|
-
if (tokens.length === 0)
|
|
205
|
-
return
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
if (
|
|
202
|
+
.map((t) => t.trim().toLowerCase())
|
|
203
|
+
.filter(Boolean);
|
|
204
|
+
if (tokens.length === 0)
|
|
205
|
+
return null;
|
|
206
|
+
const key = tokens[tokens.length - 1];
|
|
207
|
+
const mods = new Set(tokens.slice(0, -1));
|
|
208
|
+
const isMac = /mac|iphone|ipad|ipod/i.test(globalThis.navigator?.platform ?? '');
|
|
209
|
+
const modCtrl = mods.has('ctrl') || (mods.has('mod') && !isMac);
|
|
210
|
+
const modMeta = mods.has('meta') || (mods.has('mod') && isMac);
|
|
211
|
+
return {
|
|
212
|
+
ctrl: modCtrl,
|
|
213
|
+
meta: modMeta,
|
|
214
|
+
alt: mods.has('alt'),
|
|
215
|
+
shift: mods.has('shift'),
|
|
216
|
+
key,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
export function eventMatchesHotkey(event, hotkey) {
|
|
220
|
+
const parsed = parseHotkey(hotkey);
|
|
221
|
+
if (!parsed)
|
|
222
222
|
return false;
|
|
223
|
-
|
|
224
|
-
|
|
223
|
+
const checks = [
|
|
224
|
+
[event.ctrlKey, parsed.ctrl],
|
|
225
|
+
[event.metaKey, parsed.meta],
|
|
226
|
+
[event.altKey, parsed.alt],
|
|
227
|
+
[event.shiftKey, parsed.shift],
|
|
228
|
+
];
|
|
229
|
+
if (checks.some(([actual, expected]) => actual !== expected))
|
|
225
230
|
return false;
|
|
226
|
-
|
|
227
|
-
return normalizeKey(event.key) === normalizeKey(keyToken);
|
|
231
|
+
return normalizeKey(event.key) === normalizeKey(parsed.key);
|
|
228
232
|
}
|
|
229
233
|
function coerceTngCopySuccessDuration(value) {
|
|
230
234
|
const numericValue = typeof value === 'number' ? value : Number(value);
|
|
@@ -233,23 +237,21 @@ function coerceTngCopySuccessDuration(value) {
|
|
|
233
237
|
}
|
|
234
238
|
return toRoundedPositiveNumber(numericValue);
|
|
235
239
|
}
|
|
236
|
-
function coerceTngCopyAnnounce(value) {
|
|
237
|
-
if (value ===
|
|
240
|
+
export function coerceTngCopyAnnounce(value) {
|
|
241
|
+
if (value === true || value === false)
|
|
242
|
+
return value;
|
|
243
|
+
if (value === null || value === undefined)
|
|
238
244
|
return 'auto';
|
|
239
|
-
|
|
240
|
-
if (
|
|
245
|
+
const v = String(value).trim().toLowerCase();
|
|
246
|
+
if (v === '' || v === 'true')
|
|
241
247
|
return true;
|
|
242
|
-
|
|
243
|
-
if (value === false || value === 'false') {
|
|
248
|
+
if (v === 'false')
|
|
244
249
|
return false;
|
|
245
|
-
}
|
|
246
250
|
return 'auto';
|
|
247
251
|
}
|
|
248
|
-
function coerceTngCopyFormat(value) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
return 'text/plain';
|
|
252
|
+
export function coerceTngCopyFormat(value) {
|
|
253
|
+
const v = value === null || value === undefined ? '' : String(value).trim().toLowerCase();
|
|
254
|
+
return v === 'text/html' ? 'text/html' : 'text/plain';
|
|
253
255
|
}
|
|
254
256
|
export function normalizeTngCopyIgnoreSelectors(value) {
|
|
255
257
|
if (value === undefined || value === null) {
|
|
@@ -269,34 +271,44 @@ export function resolveTngCopyPayload(directText, sourceText) {
|
|
|
269
271
|
}
|
|
270
272
|
return null;
|
|
271
273
|
}
|
|
272
|
-
|
|
274
|
+
function canWriteHtml(clipboardApi) {
|
|
275
|
+
return (typeof clipboardApi.write === 'function' &&
|
|
276
|
+
typeof ClipboardItem !== 'undefined' &&
|
|
277
|
+
typeof Blob !== 'undefined');
|
|
278
|
+
}
|
|
279
|
+
async function tryWriteTngClipboard(params) {
|
|
280
|
+
const { format, text, plainText } = params;
|
|
273
281
|
const clipboardApi = globalThis.navigator?.clipboard;
|
|
282
|
+
if (clipboardApi === undefined) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
if (format === 'text/html' && canWriteHtml(clipboardApi)) {
|
|
286
|
+
const clipboardItem = new ClipboardItem({
|
|
287
|
+
'text/html': new Blob([text], { type: 'text/html' }),
|
|
288
|
+
'text/plain': new Blob([plainText], { type: 'text/plain' }),
|
|
289
|
+
});
|
|
290
|
+
await clipboardApi.write([clipboardItem]);
|
|
291
|
+
return 'clipboard';
|
|
292
|
+
}
|
|
293
|
+
if (typeof clipboardApi.writeText === 'function') {
|
|
294
|
+
await clipboardApi.writeText(plainText);
|
|
295
|
+
return 'clipboard';
|
|
296
|
+
}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
export async function writeTngClipboardText(text, ownerDocument, format = 'text/plain') {
|
|
274
300
|
const plainText = format === 'text/html' ? toPlainTextFromHtml(text, ownerDocument) : text;
|
|
275
301
|
let clipboardError = null;
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
typeof ClipboardItem !== 'undefined' &&
|
|
281
|
-
typeof Blob !== 'undefined') {
|
|
282
|
-
const clipboardItem = new ClipboardItem({
|
|
283
|
-
'text/html': new Blob([text], { type: 'text/html' }),
|
|
284
|
-
'text/plain': new Blob([plainText], { type: 'text/plain' }),
|
|
285
|
-
});
|
|
286
|
-
await clipboardApi.write([clipboardItem]);
|
|
287
|
-
return 'clipboard';
|
|
288
|
-
}
|
|
289
|
-
if (typeof clipboardApi.writeText === 'function') {
|
|
290
|
-
await clipboardApi.writeText(plainText);
|
|
291
|
-
return 'clipboard';
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
catch (error) {
|
|
295
|
-
clipboardError = error;
|
|
302
|
+
try {
|
|
303
|
+
const result = await tryWriteTngClipboard({ format, text, plainText });
|
|
304
|
+
if (result !== null) {
|
|
305
|
+
return result;
|
|
296
306
|
}
|
|
297
307
|
}
|
|
298
|
-
|
|
299
|
-
|
|
308
|
+
catch (error) {
|
|
309
|
+
clipboardError = error;
|
|
310
|
+
}
|
|
311
|
+
if (copyWithExecCommand(plainText, ownerDocument)) {
|
|
300
312
|
return 'execCommand';
|
|
301
313
|
}
|
|
302
314
|
if (clipboardError !== null) {
|
|
@@ -308,13 +320,17 @@ let TngCopy = class TngCopy {
|
|
|
308
320
|
tngCopy = output();
|
|
309
321
|
tngCopyButtonText = input(undefined);
|
|
310
322
|
tngCopyButtonTarget = input(null);
|
|
311
|
-
tngCopyButtonFormat = input('text/plain', {
|
|
323
|
+
tngCopyButtonFormat = input('text/plain', {
|
|
324
|
+
transform: coerceTngCopyFormat,
|
|
325
|
+
});
|
|
312
326
|
tngCopyButtonSuccessDurationMs = input(defaultTngCopySuccessDurationMs, { transform: coerceTngCopySuccessDuration });
|
|
313
327
|
tngCopyButtonDisabled = input(false, {
|
|
314
328
|
transform: booleanAttribute,
|
|
315
329
|
});
|
|
316
330
|
tngCopyButtonHotkey = input(null);
|
|
317
|
-
tngCopyButtonAnnounce = input('auto', {
|
|
331
|
+
tngCopyButtonAnnounce = input('auto', {
|
|
332
|
+
transform: coerceTngCopyAnnounce,
|
|
333
|
+
});
|
|
318
334
|
tngCopyButtonSuccessMessage = input(defaultTngCopySuccessAnnouncement);
|
|
319
335
|
tngCopyButtonErrorMessage = input(defaultTngCopyErrorAnnouncement);
|
|
320
336
|
tngCopyDisabled = input(false, {
|
|
@@ -457,6 +473,25 @@ let TngCopy = class TngCopy {
|
|
|
457
473
|
this.tngCopyError.emit({ error });
|
|
458
474
|
this.announce(this.tngCopyButtonErrorMessage(), trigger);
|
|
459
475
|
}
|
|
476
|
+
async doCopy(text, trigger) {
|
|
477
|
+
try {
|
|
478
|
+
const method = await writeTngClipboardText(text, this.hostElement.ownerDocument, this.tngCopyButtonFormat());
|
|
479
|
+
this.status.set('success');
|
|
480
|
+
this.lastCopiedText.set(text);
|
|
481
|
+
this.tngCopied.emit(text);
|
|
482
|
+
this.tngCopySuccess.emit({ text, method });
|
|
483
|
+
this.announce(this.tngCopyButtonSuccessMessage(), trigger);
|
|
484
|
+
this.scheduleSuccessReset();
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
catch (error) {
|
|
488
|
+
this.emitError(toCopyError(error), trigger);
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
this.copying = false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
460
495
|
async tryCopy(trigger) {
|
|
461
496
|
if (this.copying) {
|
|
462
497
|
return false;
|
|
@@ -480,43 +515,37 @@ let TngCopy = class TngCopy {
|
|
|
480
515
|
return false;
|
|
481
516
|
}
|
|
482
517
|
this.tngCopy.emit({ text: resolvedPayload.text, trigger });
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
this.status.set('success');
|
|
486
|
-
this.lastCopiedText.set(resolvedPayload.text);
|
|
487
|
-
this.tngCopied.emit(resolvedPayload.text);
|
|
488
|
-
this.tngCopySuccess.emit({ text: resolvedPayload.text, method });
|
|
489
|
-
this.announce(this.tngCopyButtonSuccessMessage(), trigger);
|
|
490
|
-
this.scheduleSuccessReset();
|
|
491
|
-
return true;
|
|
492
|
-
}
|
|
493
|
-
catch (error) {
|
|
494
|
-
this.emitError(toCopyError(error), trigger);
|
|
495
|
-
return false;
|
|
496
|
-
}
|
|
497
|
-
finally {
|
|
498
|
-
this.copying = false;
|
|
499
|
-
}
|
|
518
|
+
const result = await this.doCopy(resolvedPayload.text, trigger);
|
|
519
|
+
return result;
|
|
500
520
|
}
|
|
501
|
-
|
|
502
|
-
const explicitTextResult = resolveExplicitText(this.tngCopyButtonText());
|
|
503
|
-
if (explicitTextResult.error !== null) {
|
|
504
|
-
return { error: explicitTextResult.error, text: null };
|
|
505
|
-
}
|
|
506
|
-
const fallbackText = this.tngCopyText();
|
|
507
|
-
const directText = explicitTextResult.value !== undefined ? explicitTextResult.value : fallbackText;
|
|
521
|
+
findSourceText() {
|
|
508
522
|
const configuredTarget = this.tngCopyButtonTarget() ?? this.tngCopyFrom();
|
|
509
523
|
const hasConfiguredTarget = configuredTarget !== undefined &&
|
|
510
524
|
configuredTarget !== null &&
|
|
511
525
|
!(typeof configuredTarget === 'string' && configuredTarget.trim().length === 0);
|
|
512
526
|
const sourceElement = resolveSourceElement(configuredTarget, this.hostElement.ownerDocument);
|
|
513
527
|
if (hasConfiguredTarget && sourceElement === null) {
|
|
514
|
-
|
|
528
|
+
throw new Error('Copy target was not found.');
|
|
515
529
|
}
|
|
516
530
|
const sourceText = sourceElement === null
|
|
517
531
|
? null
|
|
518
532
|
: extractTextFromSourceElement(sourceElement, this.tngCopyIgnoreSelectors());
|
|
519
|
-
return
|
|
533
|
+
return sourceText;
|
|
534
|
+
}
|
|
535
|
+
resolvePayload() {
|
|
536
|
+
const explicitTextResult = resolveExplicitText(this.tngCopyButtonText());
|
|
537
|
+
if (explicitTextResult.error !== null) {
|
|
538
|
+
return { error: explicitTextResult.error, text: null };
|
|
539
|
+
}
|
|
540
|
+
const fallbackText = this.tngCopyText();
|
|
541
|
+
const directText = explicitTextResult.value !== undefined ? explicitTextResult.value : fallbackText;
|
|
542
|
+
try {
|
|
543
|
+
const sourceText = this.findSourceText();
|
|
544
|
+
return { error: null, text: resolveTngCopyPayload(directText, sourceText) };
|
|
545
|
+
}
|
|
546
|
+
catch (error) {
|
|
547
|
+
return { error: toCopyError(error), text: null };
|
|
548
|
+
}
|
|
520
549
|
}
|
|
521
550
|
};
|
|
522
551
|
__decorate([
|
|
@@ -538,6 +567,7 @@ TngCopy = __decorate([
|
|
|
538
567
|
Directive({
|
|
539
568
|
selector: '[tngCopy], [tngCopyButton]',
|
|
540
569
|
exportAs: 'tngCopy',
|
|
570
|
+
standalone: true,
|
|
541
571
|
})
|
|
542
572
|
], TngCopy);
|
|
543
573
|
export { TngCopy };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-copy.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/copy/tng-copy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n booleanAttribute,\n effect,\n inject,\n input,\n output,\n signal,\n type Signal,\n} from '@angular/core';\nimport type { ElementRef as NgElementRef } from '@angular/core';\n\ntype TngCopyElementRef = Readonly<NgElementRef<HTMLElement>>;\ntype TngCopySourceElement = Readonly<HTMLElement>;\n\nexport type TngCopyFromTarget =\n | TngCopyElementRef\n | TngCopySourceElement\n | string\n | null\n | undefined;\nexport type TngCopyIgnoreSelectorsInput = readonly string[] | string | null | undefined;\nexport type TngCopyButtonTextInput = string | (() => string) | Signal<string> | null | undefined;\nexport type TngCopyButtonTrigger = 'keyboard' | 'pointer' | 'programmatic';\nexport type TngCopyButtonStatus = 'copying' | 'error' | 'idle' | 'success';\nexport type TngCopyFormat = 'text/html' | 'text/plain';\nexport type TngCopyMethod = 'clipboard' | 'execCommand';\nexport type TngCopyAnnounce = boolean | 'auto';\n\nexport interface TngCopyEvent {\n text: string;\n trigger: TngCopyButtonTrigger;\n}\n\nexport interface TngCopySuccessEvent {\n method: TngCopyMethod;\n text: string;\n}\n\nexport interface TngCopyErrorEvent {\n error: unknown;\n}\n\nexport const defaultTngCopyIgnoreSelectors: readonly string[] = Object.freeze([\n '[data-copy-ignore]',\n '.line-no',\n '.line-number',\n '.line-numbers',\n]);\nexport const defaultTngCopySuccessDurationMs = 1500;\nexport const defaultTngCopySuccessAnnouncement = 'Copied to clipboard';\nexport const defaultTngCopyErrorAnnouncement = 'Copy failed';\n\nfunction hasNonEmptyText(value: string): boolean {\n return value.trim().length > 0;\n}\n\nfunction dedupeSelectors(selectors: readonly string[]): readonly string[] {\n return [...new Set(selectors)];\n}\n\nfunction normalizeSelectorFromArray(value: readonly string[]): readonly string[] {\n return dedupeSelectors(\n value.map((selector) => selector.trim()).filter((selector) => selector.length > 0),\n );\n}\n\nfunction normalizeSelectorFromString(value: string): readonly string[] {\n return dedupeSelectors(\n value\n .split(',')\n .map((selector) => selector.trim())\n .filter((selector) => selector.length > 0),\n );\n}\n\nfunction toCopyError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new Error('Copy failed.');\n}\n\nfunction isHtmlElement(value: unknown): value is HTMLElement {\n return typeof HTMLElement !== 'undefined' && value instanceof HTMLElement;\n}\n\nfunction isDocument(value: unknown): value is Document {\n return typeof Document !== 'undefined' && value instanceof Document;\n}\n\nfunction isElementRefTarget(value: unknown): value is TngCopyElementRef {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n if (!('nativeElement' in value)) {\n return false;\n }\n\n const candidate = value as { nativeElement: unknown };\n return isHtmlElement(candidate.nativeElement);\n}\n\nfunction resolveSourceElement(source: unknown, ownerDocument: unknown): HTMLElement | null {\n if (!isDocument(ownerDocument)) {\n return null;\n }\n\n if (source === null || source === undefined) {\n return null;\n }\n\n if (typeof source === 'string') {\n const normalizedSelector = source.trim();\n if (normalizedSelector.length === 0) {\n return null;\n }\n\n return ownerDocument.querySelector<HTMLElement>(normalizedSelector);\n }\n\n if (isHtmlElement(source)) {\n return source;\n }\n\n if (isElementRefTarget(source)) {\n return source.nativeElement;\n }\n\n return null;\n}\n\nfunction removeIgnoredNodes(root: unknown, ignoreSelectors: readonly string[]): void {\n if (!isHtmlElement(root)) {\n return;\n }\n\n for (const selector of ignoreSelectors) {\n try {\n const ignoredNodes: readonly Element[] = Array.from(root.querySelectorAll(selector));\n for (const node of ignoredNodes) {\n node.remove();\n }\n } catch {\n continue;\n }\n }\n}\n\nfunction isTextInputElement(\n sourceElement: unknown,\n): sourceElement is HTMLInputElement | HTMLTextAreaElement {\n const isInputElement =\n typeof HTMLInputElement !== 'undefined' && sourceElement instanceof HTMLInputElement;\n if (isInputElement) {\n return true;\n }\n\n return typeof HTMLTextAreaElement !== 'undefined' && sourceElement instanceof HTMLTextAreaElement;\n}\n\nfunction extractTextFromSourceElement(\n sourceElement: unknown,\n ignoreSelectors: readonly string[],\n): string {\n if (!isHtmlElement(sourceElement)) {\n return '';\n }\n\n if (isTextInputElement(sourceElement)) {\n return sourceElement.value;\n }\n\n if (ignoreSelectors.length === 0) {\n return sourceElement.textContent ?? '';\n }\n\n const clone = sourceElement.cloneNode(true) as HTMLElement;\n removeIgnoredNodes(clone, ignoreSelectors);\n return clone.textContent ?? '';\n}\n\nfunction copyWithExecCommand(text: string, ownerDocument: unknown): boolean {\n if (!isDocument(ownerDocument)) {\n return false;\n }\n\n if (typeof ownerDocument.execCommand !== 'function') {\n return false;\n }\n\n const body = ownerDocument.body;\n if (body === null) {\n return false;\n }\n\n const textarea = ownerDocument.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.inset = '0';\n textarea.style.opacity = '0';\n textarea.style.pointerEvents = 'none';\n textarea.style.position = 'fixed';\n const activeElement = ownerDocument.activeElement;\n const restoreTarget = isHtmlElement(activeElement) ? activeElement : null;\n\n body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n return ownerDocument.execCommand('copy');\n } finally {\n body.removeChild(textarea);\n if (restoreTarget !== null && ownerDocument.contains(restoreTarget)) {\n restoreTarget.focus();\n }\n }\n}\n\nfunction toRoundedPositiveNumber(value: number): number {\n return Math.max(0, Math.round(value));\n}\n\nfunction toPlainTextFromHtml(html: string, ownerDocument: unknown): string {\n if (!isDocument(ownerDocument)) {\n return html.replace(/<[^>]*>/g, '');\n }\n\n const template = ownerDocument.createElement('template');\n template.innerHTML = html;\n return template.content.textContent ?? '';\n}\n\nfunction normalizeHotkey(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeKey(value: string): string {\n if (value === ' ') {\n return 'space';\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'spacebar') {\n return 'space';\n }\n\n return normalized;\n}\n\nfunction isActivationKey(key: string): boolean {\n return key === 'Enter' || key === ' ';\n}\n\nfunction isNativeButton(value: unknown): value is HTMLButtonElement {\n return typeof HTMLButtonElement !== 'undefined' && value instanceof HTMLButtonElement;\n}\n\nfunction isElement(value: unknown): value is Element {\n return typeof Element !== 'undefined' && value instanceof Element;\n}\n\nfunction resolveExplicitText(\n value: TngCopyButtonTextInput,\n): { error: Error | null; value: string | null | undefined } {\n if (value === undefined || value === null) {\n return { error: null, value };\n }\n\n if (typeof value === 'string') {\n return { error: null, value };\n }\n\n try {\n const result = value();\n if (result === null || result === undefined) {\n return { error: null, value: null };\n }\n\n return { error: null, value: typeof result === 'string' ? result : String(result) };\n } catch (error) {\n return { error: toCopyError(error), value: null };\n }\n}\n\nfunction eventMatchesHotkey(event: KeyboardEvent, hotkey: string): boolean {\n const tokens = hotkey\n .split('+')\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0);\n\n if (tokens.length === 0) {\n return false;\n }\n\n const keyToken = tokens[tokens.length - 1];\n const modifierTokens = tokens.slice(0, -1);\n const modifierSet = new Set(modifierTokens);\n const isMacPlatform = /mac|iphone|ipad|ipod/i.test(globalThis.navigator?.platform ?? '');\n\n const expectsCtrl = modifierSet.has('ctrl') || (modifierSet.has('mod') && !isMacPlatform);\n const expectsMeta = modifierSet.has('meta') || (modifierSet.has('mod') && isMacPlatform);\n const expectsAlt = modifierSet.has('alt');\n const expectsShift = modifierSet.has('shift');\n\n if (event.ctrlKey !== expectsCtrl) {\n return false;\n }\n\n if (event.metaKey !== expectsMeta) {\n return false;\n }\n\n if (event.altKey !== expectsAlt) {\n return false;\n }\n\n if (event.shiftKey !== expectsShift) {\n return false;\n }\n\n return normalizeKey(event.key) === normalizeKey(keyToken);\n}\n\nfunction coerceTngCopySuccessDuration(value: number | string): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return defaultTngCopySuccessDurationMs;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nfunction coerceTngCopyAnnounce(value: TngCopyAnnounce | string | null | undefined): TngCopyAnnounce {\n if (value === undefined || value === null || value === 'auto') {\n return 'auto';\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return 'auto';\n}\n\nfunction coerceTngCopyFormat(value: TngCopyFormat | string | null | undefined): TngCopyFormat {\n if (value === 'text/html') {\n return 'text/html';\n }\n\n return 'text/plain';\n}\n\nexport function normalizeTngCopyIgnoreSelectors(\n value: TngCopyIgnoreSelectorsInput,\n): readonly string[] {\n if (value === undefined || value === null) {\n return defaultTngCopyIgnoreSelectors;\n }\n\n if (typeof value === 'string') {\n return normalizeSelectorFromString(value);\n }\n\n return normalizeSelectorFromArray(value);\n}\n\nexport function resolveTngCopyPayload(\n directText: string | null | undefined,\n sourceText: string | null,\n): string | null {\n if (directText !== null && directText !== undefined) {\n return hasNonEmptyText(directText) ? directText : null;\n }\n\n if (sourceText !== null && hasNonEmptyText(sourceText)) {\n return sourceText;\n }\n\n return null;\n}\n\nexport async function writeTngClipboardText(\n text: string,\n ownerDocument: unknown,\n format: TngCopyFormat = 'text/plain',\n): Promise<TngCopyMethod> {\n const clipboardApi = globalThis.navigator?.clipboard;\n const plainText = format === 'text/html' ? toPlainTextFromHtml(text, ownerDocument) : text;\n let clipboardError: unknown = null;\n\n if (clipboardApi !== undefined) {\n try {\n if (\n format === 'text/html' &&\n typeof clipboardApi.write === 'function' &&\n typeof ClipboardItem !== 'undefined' &&\n typeof Blob !== 'undefined'\n ) {\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([text], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n });\n await clipboardApi.write([clipboardItem]);\n return 'clipboard';\n }\n\n if (typeof clipboardApi.writeText === 'function') {\n await clipboardApi.writeText(plainText);\n return 'clipboard';\n }\n } catch (error) {\n clipboardError = error;\n }\n }\n\n const didCopy = copyWithExecCommand(plainText, ownerDocument);\n if (didCopy) {\n return 'execCommand';\n }\n\n if (clipboardError !== null) {\n throw toCopyError(clipboardError);\n }\n\n throw new Error('Clipboard API is not available in this environment.');\n}\n\n@Directive({\n selector: '[tngCopy], [tngCopyButton]',\n exportAs: 'tngCopy',\n})\nexport class TngCopy {\n public readonly tngCopy = output<TngCopyEvent>();\n public readonly tngCopyButtonText = input<TngCopyButtonTextInput>(undefined);\n public readonly tngCopyButtonTarget = input<TngCopyFromTarget>(null);\n public readonly tngCopyButtonFormat = input<TngCopyFormat, TngCopyFormat | string | null | undefined>(\n 'text/plain',\n { transform: coerceTngCopyFormat },\n );\n public readonly tngCopyButtonSuccessDurationMs = input<number, number | string>(\n defaultTngCopySuccessDurationMs,\n { transform: coerceTngCopySuccessDuration },\n );\n public readonly tngCopyButtonDisabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly tngCopyButtonHotkey = input<string | null>(null);\n public readonly tngCopyButtonAnnounce = input<TngCopyAnnounce, TngCopyAnnounce | string | null | undefined>(\n 'auto',\n { transform: coerceTngCopyAnnounce },\n );\n public readonly tngCopyButtonSuccessMessage = input<string>(defaultTngCopySuccessAnnouncement);\n public readonly tngCopyButtonErrorMessage = input<string>(defaultTngCopyErrorAnnouncement);\n public readonly tngCopyDisabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly tngCopied = output<string>();\n public readonly tngCopySuccess = output<TngCopySuccessEvent>();\n public readonly tngCopyError = output<TngCopyErrorEvent>();\n public readonly tngCopyFrom = input<TngCopyFromTarget>(null);\n public readonly tngCopyIgnoreSelectors = input<readonly string[], TngCopyIgnoreSelectorsInput>(\n defaultTngCopyIgnoreSelectors,\n {\n transform: normalizeTngCopyIgnoreSelectors,\n },\n );\n public readonly tngCopyText = input<string | null | undefined>(undefined);\n public readonly tngCopyAnnounced = output<string>();\n public readonly status = signal<TngCopyButtonStatus>('idle');\n public readonly lastCopiedText = signal<string | null>(null);\n public readonly error = signal<unknown | null>(null);\n\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n private successResetTimer: ReturnType<typeof setTimeout> | null = null;\n private copying = false;\n\n @HostBinding('attr.data-copy-disabled')\n protected get dataCopyDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n if (isNativeButton(this.hostElement)) {\n return null;\n }\n\n return this.isDisabled() ? 'true' : null;\n }\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n if (!isNativeButton(this.hostElement)) {\n return null;\n }\n\n return this.isDisabled() ? '' : null;\n }\n\n public constructor() {\n effect((onCleanup): void => {\n const hotkey = normalizeHotkey(this.tngCopyButtonHotkey());\n if (hotkey === null) {\n return;\n }\n\n const ownerDocument = this.hostElement.ownerDocument;\n const listener = (event: KeyboardEvent): void => {\n if (!this.isHostOrChildFocused()) {\n return;\n }\n\n if (!eventMatchesHotkey(event, hotkey)) {\n return;\n }\n\n event.preventDefault();\n void this.tryCopy('keyboard');\n };\n\n ownerDocument.addEventListener('keydown', listener);\n onCleanup(() => ownerDocument.removeEventListener('keydown', listener));\n });\n\n this.destroyRef.onDestroy((): void => {\n this.clearSuccessResetTimer();\n });\n }\n\n @HostListener('click', ['$event'])\n protected onHostClick(...args: readonly unknown[]): void {\n const [event] = args;\n if (!(event instanceof Event)) {\n return;\n }\n\n if (this.isDisabled() && !isNativeButton(this.hostElement)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n\n void this.tryCopy('pointer');\n }\n\n @HostListener('keydown', ['$event'])\n protected onHostKeyDown(...args: readonly unknown[]): void {\n if (isNativeButton(this.hostElement)) {\n return;\n }\n\n const [event] = args;\n if (!(event instanceof KeyboardEvent)) {\n return;\n }\n\n if (!isActivationKey(event.key)) {\n return;\n }\n\n event.preventDefault();\n if (this.isDisabled()) {\n return;\n }\n\n void this.tryCopy('keyboard');\n }\n\n public async copy(): Promise<boolean> {\n return this.tryCopy('programmatic');\n }\n\n private shouldAnnounce(trigger: TngCopyButtonTrigger): boolean {\n const announce = this.tngCopyButtonAnnounce();\n if (announce === false) {\n return false;\n }\n\n if (announce === true) {\n return true;\n }\n\n return trigger === 'keyboard';\n }\n\n private isDisabled(): boolean {\n return this.tngCopyDisabled() || this.tngCopyButtonDisabled();\n }\n\n private isHostOrChildFocused(): boolean {\n const activeElement = this.hostElement.ownerDocument.activeElement;\n if (!isElement(activeElement)) {\n return false;\n }\n\n return activeElement === this.hostElement || this.hostElement.contains(activeElement);\n }\n\n private clearSuccessResetTimer(): void {\n if (this.successResetTimer === null) {\n return;\n }\n\n clearTimeout(this.successResetTimer);\n this.successResetTimer = null;\n }\n\n private scheduleSuccessReset(): void {\n this.clearSuccessResetTimer();\n this.successResetTimer = setTimeout((): void => {\n this.status.set('idle');\n this.successResetTimer = null;\n }, this.tngCopyButtonSuccessDurationMs());\n }\n\n private announce(message: string, trigger: TngCopyButtonTrigger): void {\n if (!this.shouldAnnounce(trigger)) {\n return;\n }\n\n const normalizedMessage = message.trim();\n if (normalizedMessage.length === 0) {\n return;\n }\n\n this.tngCopyAnnounced.emit(normalizedMessage);\n }\n\n private emitError(error: Error, trigger: TngCopyButtonTrigger): void {\n this.status.set('error');\n this.error.set(error);\n this.tngCopyError.emit({ error });\n this.announce(this.tngCopyButtonErrorMessage(), trigger);\n }\n\n private async tryCopy(trigger: TngCopyButtonTrigger): Promise<boolean> {\n if (this.copying) {\n return false;\n }\n\n if (this.isDisabled()) {\n return false;\n }\n\n this.clearSuccessResetTimer();\n this.status.set('copying');\n this.error.set(null);\n this.copying = true;\n\n const resolvedPayload = this.resolvePayload();\n if (resolvedPayload.error !== null) {\n this.emitError(resolvedPayload.error, trigger);\n this.copying = false;\n return false;\n }\n\n if (resolvedPayload.text === null) {\n this.emitError(\n new Error('No copy payload found. Provide tngCopyButtonText/tngCopyText or target inputs.'),\n trigger,\n );\n this.copying = false;\n return false;\n }\n\n this.tngCopy.emit({ text: resolvedPayload.text, trigger });\n\n try {\n const method = await writeTngClipboardText(\n resolvedPayload.text,\n this.hostElement.ownerDocument,\n this.tngCopyButtonFormat(),\n );\n this.status.set('success');\n this.lastCopiedText.set(resolvedPayload.text);\n this.tngCopied.emit(resolvedPayload.text);\n this.tngCopySuccess.emit({ text: resolvedPayload.text, method });\n this.announce(this.tngCopyButtonSuccessMessage(), trigger);\n this.scheduleSuccessReset();\n return true;\n } catch (error) {\n this.emitError(toCopyError(error), trigger);\n return false;\n } finally {\n this.copying = false;\n }\n }\n\n private resolvePayload(): { error: Error | null; text: string | null } {\n const explicitTextResult = resolveExplicitText(this.tngCopyButtonText());\n if (explicitTextResult.error !== null) {\n return { error: explicitTextResult.error, text: null };\n }\n\n const fallbackText = this.tngCopyText();\n const directText =\n explicitTextResult.value !== undefined ? explicitTextResult.value : fallbackText;\n\n const configuredTarget = this.tngCopyButtonTarget() ?? this.tngCopyFrom();\n const hasConfiguredTarget =\n configuredTarget !== undefined &&\n configuredTarget !== null &&\n !(typeof configuredTarget === 'string' && configuredTarget.trim().length === 0);\n\n const sourceElement = resolveSourceElement(configuredTarget, this.hostElement.ownerDocument);\n if (hasConfiguredTarget && sourceElement === null) {\n return { error: new Error('Copy target was not found.'), text: null };\n }\n\n const sourceText =\n sourceElement === null\n ? null\n : extractTextFromSourceElement(sourceElement, this.tngCopyIgnoreSelectors());\n\n return { error: null, text: resolveTngCopyPayload(directText, sourceText) };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-copy.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/copy/tng-copy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n booleanAttribute,\n effect,\n inject,\n input,\n output,\n signal,\n type Signal,\n} from '@angular/core';\nimport type { ElementRef as NgElementRef } from '@angular/core';\n\ntype TngCopyElementRef = Readonly<NgElementRef<HTMLElement>>;\ntype TngCopySourceElement = Readonly<HTMLElement>;\n\nexport type TngCopyFromTarget =\n | TngCopyElementRef\n | TngCopySourceElement\n | string\n | null\n | undefined;\nexport type TngCopyIgnoreSelectorsInput = readonly string[] | string | null | undefined;\nexport type TngCopyButtonTextInput = string | (() => string) | Signal<string> | null | undefined;\nexport type TngCopyButtonTrigger = 'keyboard' | 'pointer' | 'programmatic';\nexport type TngCopyButtonStatus = 'copying' | 'error' | 'idle' | 'success';\nexport type TngCopyFormat = 'text/html' | 'text/plain';\n\n/**\n * Accept string because template/attribute bindings commonly arrive as strings.\n * Keeping this broad also avoids `no-redundant-type-constituents` (string + literals).\n */\nexport type TngCopyFormatInput = string | null | undefined;\nexport type TngCopyMethod = 'clipboard' | 'execCommand';\nexport type TngCopyAnnounce = 'auto' | boolean;\n\nexport type TngCopyAnnounceInput = string | boolean | null | undefined;\n\nexport type TngCopyEvent = {\n text: string;\n trigger: TngCopyButtonTrigger;\n}\n\nexport type TngCopySuccessEvent = {\n method: TngCopyMethod;\n text: string;\n}\n\nexport type TngCopyErrorEvent = {\n error: unknown;\n}\n\nexport const defaultTngCopyIgnoreSelectors: readonly string[] = Object.freeze([\n '[data-copy-ignore]',\n '.line-no',\n '.line-number',\n '.line-numbers',\n]);\nexport const defaultTngCopySuccessDurationMs = 1500;\nexport const defaultTngCopySuccessAnnouncement = 'Copied to clipboard';\nexport const defaultTngCopyErrorAnnouncement = 'Copy failed';\n\nfunction hasNonEmptyText(value: string): boolean {\n return value.trim().length > 0;\n}\n\nfunction dedupeSelectors(selectors: readonly string[]): readonly string[] {\n return [...new Set(selectors)];\n}\n\nfunction normalizeSelectorFromArray(value: readonly string[]): readonly string[] {\n return dedupeSelectors(\n value.map((selector) => selector.trim()).filter((selector) => selector.length > 0),\n );\n}\n\nfunction normalizeSelectorFromString(value: string): readonly string[] {\n return dedupeSelectors(\n value\n .split(',')\n .map((selector) => selector.trim())\n .filter((selector) => selector.length > 0),\n );\n}\n\nfunction toCopyError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new Error('Copy failed.');\n}\n\nfunction isHtmlElement(value: unknown): value is HTMLElement {\n return typeof HTMLElement !== 'undefined' && value instanceof HTMLElement;\n}\n\nfunction isDocument(value: unknown): value is Document {\n return typeof Document !== 'undefined' && value instanceof Document;\n}\n\nfunction isElementRefTarget(value: unknown): value is TngCopyElementRef {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n if (!('nativeElement' in value)) {\n return false;\n }\n\n const candidate = value as { nativeElement: unknown };\n return isHtmlElement(candidate.nativeElement);\n}\n\nfunction resolveSourceElement(source: unknown, ownerDocument: unknown): HTMLElement | null {\n if (!isDocument(ownerDocument)) {\n return null;\n }\n\n if (source === null || source === undefined) {\n return null;\n }\n\n if (typeof source === 'string') {\n const normalizedSelector = source.trim();\n if (normalizedSelector.length === 0) {\n return null;\n }\n\n return ownerDocument.querySelector<HTMLElement>(normalizedSelector);\n }\n\n if (isHtmlElement(source)) {\n return source;\n }\n\n if (isElementRefTarget(source)) {\n return source.nativeElement;\n }\n\n return null;\n}\n\nfunction removeIgnoredNodes(root: unknown, ignoreSelectors: readonly string[]): void {\n if (!isHtmlElement(root)) {\n return;\n }\n\n for (const selector of ignoreSelectors) {\n try {\n const ignoredNodes: readonly Element[] = Array.from(root.querySelectorAll(selector));\n for (const node of ignoredNodes) {\n node.remove();\n }\n } catch {\n continue;\n }\n }\n}\n\nfunction isTextInputElement(\n sourceElement: unknown,\n): sourceElement is HTMLInputElement | HTMLTextAreaElement {\n const isInputElement =\n typeof HTMLInputElement !== 'undefined' && sourceElement instanceof HTMLInputElement;\n if (isInputElement) {\n return true;\n }\n\n return typeof HTMLTextAreaElement !== 'undefined' && sourceElement instanceof HTMLTextAreaElement;\n}\n\nfunction extractTextFromSourceElement(\n sourceElement: unknown,\n ignoreSelectors: readonly string[],\n): string {\n if (!isHtmlElement(sourceElement)) {\n return '';\n }\n\n if (isTextInputElement(sourceElement)) {\n return sourceElement.value;\n }\n\n if (ignoreSelectors.length === 0) {\n return sourceElement.textContent ?? '';\n }\n\n const clone = sourceElement.cloneNode(true) as HTMLElement;\n removeIgnoredNodes(clone, ignoreSelectors);\n return clone.textContent ?? '';\n}\n\nfunction copyWithExecCommand(text: string, ownerDocument: unknown): boolean {\n if (!isDocument(ownerDocument)) {\n return false;\n }\n\n if (typeof ownerDocument.execCommand !== 'function') {\n return false;\n }\n\n const body = ownerDocument.body;\n if (body === null) {\n return false;\n }\n\n const textarea = ownerDocument.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', '');\n textarea.style.inset = '0';\n textarea.style.opacity = '0';\n textarea.style.pointerEvents = 'none';\n textarea.style.position = 'fixed';\n const activeElement = ownerDocument.activeElement;\n const restoreTarget = isHtmlElement(activeElement) ? activeElement : null;\n\n body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n return ownerDocument.execCommand('copy');\n } finally {\n body.removeChild(textarea);\n if (restoreTarget !== null && ownerDocument.contains(restoreTarget)) {\n restoreTarget.focus();\n }\n }\n}\n\nfunction toRoundedPositiveNumber(value: number): number {\n return Math.max(0, Math.round(value));\n}\n\nfunction toPlainTextFromHtml(html: string, ownerDocument: unknown): string {\n if (!isDocument(ownerDocument)) {\n return html.replace(/<[^>]*>/g, '');\n }\n\n const template = ownerDocument.createElement('template');\n template.innerHTML = html;\n return template.content.textContent ?? '';\n}\n\nfunction normalizeHotkey(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeKey(value: string): string {\n if (value === ' ') {\n return 'space';\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'spacebar') {\n return 'space';\n }\n\n return normalized;\n}\n\nfunction isActivationKey(key: string): boolean {\n return key === 'Enter' || key === ' ';\n}\n\nfunction isNativeButton(value: unknown): value is HTMLButtonElement {\n return typeof HTMLButtonElement !== 'undefined' && value instanceof HTMLButtonElement;\n}\n\nfunction isElement(value: unknown): value is Element {\n return typeof Element !== 'undefined' && value instanceof Element;\n}\n\nfunction resolveExplicitText(\n value: TngCopyButtonTextInput,\n): { error: Error | null; value: string | null | undefined } {\n if (value === undefined || value === null) {\n return { error: null, value };\n }\n\n if (typeof value === 'string') {\n return { error: null, value };\n }\n\n try {\n const result = value();\n if (result === null || result === undefined) {\n return { error: null, value: null };\n }\n\n return { error: null, value: typeof result === 'string' ? result : String(result) };\n } catch (error) {\n return { error: toCopyError(error), value: null };\n }\n}\n\ntype TngHotkeyModifiers = Readonly<{\n ctrl: boolean;\n meta: boolean;\n alt: boolean;\n shift: boolean;\n key: string;\n}>;\n\nfunction parseHotkey(hotkey: string): TngHotkeyModifiers | null {\n const tokens = hotkey\n .split('+')\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n\n if (tokens.length === 0) return null;\n\n const key = tokens[tokens.length - 1];\n const mods = new Set(tokens.slice(0, -1));\n\n const isMac = /mac|iphone|ipad|ipod/i.test(globalThis.navigator?.platform ?? '');\n const modCtrl = mods.has('ctrl') || (mods.has('mod') && !isMac);\n const modMeta = mods.has('meta') || (mods.has('mod') && isMac);\n\n return {\n ctrl: modCtrl,\n meta: modMeta,\n alt: mods.has('alt'),\n shift: mods.has('shift'),\n key,\n };\n}\n\nexport function eventMatchesHotkey(event: KeyboardEvent, hotkey: string): boolean {\n const parsed = parseHotkey(hotkey);\n if (!parsed) return false;\n\n const checks: readonly (readonly [boolean, boolean])[] = [\n [event.ctrlKey, parsed.ctrl],\n [event.metaKey, parsed.meta],\n [event.altKey, parsed.alt],\n [event.shiftKey, parsed.shift],\n ];\n\n if (checks.some(([actual, expected]) => actual !== expected)) return false;\n\n return normalizeKey(event.key) === normalizeKey(parsed.key);\n}\n\nfunction coerceTngCopySuccessDuration(value: number | string): number {\n const numericValue = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return defaultTngCopySuccessDurationMs;\n }\n\n return toRoundedPositiveNumber(numericValue);\n}\n\nexport function coerceTngCopyAnnounce(value: TngCopyAnnounceInput): TngCopyAnnounce {\n if (value === true || value === false) return value;\n if (value === null || value === undefined) return 'auto';\n\n const v = String(value).trim().toLowerCase();\n if (v === '' || v === 'true') return true;\n if (v === 'false') return false;\n return 'auto';\n}\n\nexport function coerceTngCopyFormat(value: TngCopyFormatInput): TngCopyFormat {\n const v = value === null || value === undefined ? '' : String(value).trim().toLowerCase();\n return v === 'text/html' ? 'text/html' : 'text/plain';\n}\n\nexport function normalizeTngCopyIgnoreSelectors(\n value: TngCopyIgnoreSelectorsInput,\n): readonly string[] {\n if (value === undefined || value === null) {\n return defaultTngCopyIgnoreSelectors;\n }\n\n if (typeof value === 'string') {\n return normalizeSelectorFromString(value);\n }\n\n return normalizeSelectorFromArray(value);\n}\n\nexport function resolveTngCopyPayload(\n directText: string | null | undefined,\n sourceText: string | null,\n): string | null {\n if (directText !== null && directText !== undefined) {\n return hasNonEmptyText(directText) ? directText : null;\n }\n\n if (sourceText !== null && hasNonEmptyText(sourceText)) {\n return sourceText;\n }\n\n return null;\n}\n\ntype TngClipboardLike = Readonly<{\n write?: (items: readonly unknown[]) => Promise<void>;\n writeText?: (text: string) => Promise<void>;\n}>;\n\nfunction canWriteHtml(\n clipboardApi: TngClipboardLike,\n): clipboardApi is Readonly<{ write: (items: readonly unknown[]) => Promise<void> }> {\n return (\n typeof clipboardApi.write === 'function' &&\n typeof ClipboardItem !== 'undefined' &&\n typeof Blob !== 'undefined'\n );\n}\n\nasync function tryWriteTngClipboard(params: Readonly<{\n format: TngCopyFormat;\n text: string;\n plainText: string;\n}>): Promise<TngCopyMethod | null> {\n const { format, text, plainText } = params;\n\n const clipboardApi = globalThis.navigator?.clipboard as unknown as TngClipboardLike | undefined;\n if (clipboardApi === undefined) {\n return null;\n }\n\n if (format === 'text/html' && canWriteHtml(clipboardApi)) {\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([text], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n });\n await clipboardApi.write([clipboardItem]);\n return 'clipboard';\n }\n\n if (typeof clipboardApi.writeText === 'function') {\n await clipboardApi.writeText(plainText);\n return 'clipboard';\n }\n\n return null;\n}\n\nexport async function writeTngClipboardText(\n text: string,\n ownerDocument: unknown,\n format: TngCopyFormat = 'text/plain',\n): Promise<TngCopyMethod> {\n const plainText = format === 'text/html' ? toPlainTextFromHtml(text, ownerDocument) : text;\n\n let clipboardError: unknown = null;\n\n try {\n const result = await tryWriteTngClipboard({ format, text, plainText });\n if (result !== null) {\n return result;\n }\n } catch (error) {\n clipboardError = error;\n }\n\n if (copyWithExecCommand(plainText, ownerDocument)) {\n return 'execCommand';\n }\n\n if (clipboardError !== null) {\n throw toCopyError(clipboardError);\n }\n\n throw new Error('Clipboard API is not available in this environment.');\n}\n\n@Directive({\n selector: '[tngCopy], [tngCopyButton]',\n exportAs: 'tngCopy',\n standalone: true,\n})\nexport class TngCopy {\n public readonly tngCopy = output<TngCopyEvent>();\n public readonly tngCopyButtonText = input<TngCopyButtonTextInput>(undefined);\n public readonly tngCopyButtonTarget = input<TngCopyFromTarget>(null);\n public readonly tngCopyButtonFormat = input<TngCopyFormat, TngCopyFormatInput>('text/plain', {\n transform: coerceTngCopyFormat,\n });\n public readonly tngCopyButtonSuccessDurationMs = input<number, number | string>(\n defaultTngCopySuccessDurationMs,\n { transform: coerceTngCopySuccessDuration },\n );\n public readonly tngCopyButtonDisabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly tngCopyButtonHotkey = input<string | null>(null);\n public readonly tngCopyButtonAnnounce = input<TngCopyAnnounce, TngCopyAnnounceInput>('auto', {\n transform: coerceTngCopyAnnounce,\n });\n public readonly tngCopyButtonSuccessMessage = input<string>(defaultTngCopySuccessAnnouncement);\n public readonly tngCopyButtonErrorMessage = input<string>(defaultTngCopyErrorAnnouncement);\n public readonly tngCopyDisabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly tngCopied = output<string>();\n public readonly tngCopySuccess = output<TngCopySuccessEvent>();\n public readonly tngCopyError = output<TngCopyErrorEvent>();\n public readonly tngCopyFrom = input<TngCopyFromTarget>(null);\n public readonly tngCopyIgnoreSelectors = input<readonly string[], TngCopyIgnoreSelectorsInput>(\n defaultTngCopyIgnoreSelectors,\n {\n transform: normalizeTngCopyIgnoreSelectors,\n },\n );\n public readonly tngCopyText = input<string | null | undefined>(undefined);\n public readonly tngCopyAnnounced = output<string>();\n public readonly status = signal<TngCopyButtonStatus>('idle');\n public readonly lastCopiedText = signal<string | null>(null);\n public readonly error = signal<Error | null>(null);\n\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n private successResetTimer: ReturnType<typeof setTimeout> | null = null;\n private copying = false;\n\n @HostBinding('attr.data-copy-disabled')\n protected get dataCopyDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n if (isNativeButton(this.hostElement)) {\n return null;\n }\n\n return this.isDisabled() ? 'true' : null;\n }\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n if (!isNativeButton(this.hostElement)) {\n return null;\n }\n\n return this.isDisabled() ? '' : null;\n }\n\n public constructor() {\n effect((onCleanup): void => {\n const hotkey = normalizeHotkey(this.tngCopyButtonHotkey());\n if (hotkey === null) {\n return;\n }\n\n const ownerDocument = this.hostElement.ownerDocument;\n const listener = (event: KeyboardEvent): void => {\n if (!this.isHostOrChildFocused()) {\n return;\n }\n\n if (!eventMatchesHotkey(event, hotkey)) {\n return;\n }\n\n event.preventDefault();\n void this.tryCopy('keyboard');\n };\n\n ownerDocument.addEventListener('keydown', listener);\n onCleanup(() => ownerDocument.removeEventListener('keydown', listener));\n });\n\n this.destroyRef.onDestroy((): void => {\n this.clearSuccessResetTimer();\n });\n }\n\n @HostListener('click', ['$event'])\n protected onHostClick(...args: readonly unknown[]): void {\n const [event] = args;\n if (!(event instanceof Event)) {\n return;\n }\n\n if (this.isDisabled() && !isNativeButton(this.hostElement)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n\n void this.tryCopy('pointer');\n }\n\n @HostListener('keydown', ['$event'])\n protected onHostKeyDown(...args: readonly unknown[]): void {\n if (isNativeButton(this.hostElement)) {\n return;\n }\n\n const [event] = args;\n if (!(event instanceof KeyboardEvent)) {\n return;\n }\n\n if (!isActivationKey(event.key)) {\n return;\n }\n\n event.preventDefault();\n if (this.isDisabled()) {\n return;\n }\n\n void this.tryCopy('keyboard');\n }\n\n public async copy(): Promise<boolean> {\n return this.tryCopy('programmatic');\n }\n\n private shouldAnnounce(trigger: TngCopyButtonTrigger): boolean {\n const announce = this.tngCopyButtonAnnounce();\n if (announce === false) {\n return false;\n }\n\n if (announce === true) {\n return true;\n }\n\n return trigger === 'keyboard';\n }\n\n private isDisabled(): boolean {\n return this.tngCopyDisabled() || this.tngCopyButtonDisabled();\n }\n\n private isHostOrChildFocused(): boolean {\n const activeElement = this.hostElement.ownerDocument.activeElement;\n if (!isElement(activeElement)) {\n return false;\n }\n\n return activeElement === this.hostElement || this.hostElement.contains(activeElement);\n }\n\n private clearSuccessResetTimer(): void {\n if (this.successResetTimer === null) {\n return;\n }\n\n clearTimeout(this.successResetTimer);\n this.successResetTimer = null;\n }\n\n private scheduleSuccessReset(): void {\n this.clearSuccessResetTimer();\n this.successResetTimer = setTimeout((): void => {\n this.status.set('idle');\n this.successResetTimer = null;\n }, this.tngCopyButtonSuccessDurationMs());\n }\n\n private announce(message: string, trigger: TngCopyButtonTrigger): void {\n if (!this.shouldAnnounce(trigger)) {\n return;\n }\n\n const normalizedMessage = message.trim();\n if (normalizedMessage.length === 0) {\n return;\n }\n\n this.tngCopyAnnounced.emit(normalizedMessage);\n }\n\n private emitError(error: Error, trigger: TngCopyButtonTrigger): void {\n this.status.set('error');\n this.error.set(error);\n this.tngCopyError.emit({ error });\n this.announce(this.tngCopyButtonErrorMessage(), trigger);\n }\n\n private async doCopy(text: string, trigger: TngCopyButtonTrigger): Promise<boolean> {\n try {\n const method = await writeTngClipboardText(\n text,\n this.hostElement.ownerDocument,\n this.tngCopyButtonFormat(),\n );\n this.status.set('success');\n this.lastCopiedText.set(text);\n this.tngCopied.emit(text);\n this.tngCopySuccess.emit({ text, method });\n this.announce(this.tngCopyButtonSuccessMessage(), trigger);\n this.scheduleSuccessReset();\n return true;\n } catch (error) {\n this.emitError(toCopyError(error), trigger);\n return false;\n } finally {\n this.copying = false;\n }\n }\n\n private async tryCopy(trigger: TngCopyButtonTrigger): Promise<boolean> {\n if (this.copying) {\n return false;\n }\n\n if (this.isDisabled()) {\n return false;\n }\n\n this.clearSuccessResetTimer();\n this.status.set('copying');\n this.error.set(null);\n this.copying = true;\n\n const resolvedPayload = this.resolvePayload();\n if (resolvedPayload.error !== null) {\n this.emitError(resolvedPayload.error, trigger);\n this.copying = false;\n return false;\n }\n\n if (resolvedPayload.text === null) {\n this.emitError(\n new Error('No copy payload found. Provide tngCopyButtonText/tngCopyText or target inputs.'),\n trigger,\n );\n this.copying = false;\n return false;\n }\n\n this.tngCopy.emit({ text: resolvedPayload.text, trigger });\n const result = await this.doCopy(resolvedPayload.text, trigger);\n return result;\n\n \n }\n\n private findSourceText(): string | null {\n const configuredTarget = this.tngCopyButtonTarget() ?? this.tngCopyFrom();\n const hasConfiguredTarget =\n configuredTarget !== undefined &&\n configuredTarget !== null &&\n !(typeof configuredTarget === 'string' && configuredTarget.trim().length === 0);\n\n const sourceElement = resolveSourceElement(configuredTarget, this.hostElement.ownerDocument);\n if (hasConfiguredTarget && sourceElement === null) {\n throw new Error('Copy target was not found.');\n }\n const sourceText =\n sourceElement === null\n ? null\n : extractTextFromSourceElement(sourceElement, this.tngCopyIgnoreSelectors());\n return sourceText;\n }\n\n private resolvePayload(): { error: Error | null; text: string | null } {\n const explicitTextResult = resolveExplicitText(this.tngCopyButtonText());\n if (explicitTextResult.error !== null) {\n return { error: explicitTextResult.error, text: null };\n }\n\n const fallbackText = this.tngCopyText();\n const directText =\n explicitTextResult.value !== undefined ? explicitTextResult.value : fallbackText;\n\n try {\n const sourceText = this.findSourceText();\n return { error: null, text: resolveTngCopyPayload(directText, sourceText) };\n } catch (error) {\n return { error: toCopyError(error), text: null };\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-press.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/press/tng-press.ts"],"names":[],"mappings":"AAWA,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAYzD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,GAAG,IAAI,CAczF;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,GACzC,oBAAoB,GAAG,IAAI,CAmB7B;AA2BD,
|
|
1
|
+
{"version":3,"file":"tng-press.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/press/tng-press.ts"],"names":[],"mappings":"AAWA,KAAK,oBAAoB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAYzD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,GAAG,IAAI,CAczF;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,GACzC,oBAAoB,GAAG,IAAI,CAmB7B;AA2BD,qBAKa,QAAQ;IACnB,SAAgB,YAAY,qDAA8B;IAC1D,SAAgB,YAAY,yFAEzB;IACH,SAAgB,YAAY,qHAKzB;IACH,SAAgB,WAAW,yFAExB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,IAAI,oDAAiC;IAErD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqD;IAG7E,SAAS,KAAK,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAE9C;IAGD,SAAS,KAAK,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAM9C;IAGD,SAAS,KAAK,gBAAgB,IAAI,OAAO,GAAG,MAAM,GAAG,IAAI,CAExD;IAGD,SAAS,KAAK,gBAAgB,IAAI,oBAAoB,GAAG,IAAI,CAE5D;IAGD,SAAS,KAAK,eAAe,IAAI,OAAO,GAAG,MAAM,GAAG,IAAI,CAEvD;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAMtC;IAGD,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAExC;IAGD,SAAS,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAU1C;IAGD,SAAS,KAAK,QAAQ,IAAI,YAAY,GAAG,IAAI,CAE5C;IAGD,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAexD,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAsB1D,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,cAAc;CAGvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-press.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/press/tng-press.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\n\ntype ButtonHostElement = HTMLAnchorElement | HTMLButtonElement;\ntype NullableBooleanInput = boolean | null | string | undefined;\nexport type TngPressAriaHasPopup =\n | 'dialog'\n | 'false'\n | 'grid'\n | 'listbox'\n | 'menu'\n | 'tree'\n | 'true';\nexport type TngPressType = 'button' | 'reset' | 'submit';\n\nconst validAriaHasPopupValues: readonly TngPressAriaHasPopup[] = [\n 'dialog',\n 'false',\n 'grid',\n 'listbox',\n 'menu',\n 'tree',\n 'true',\n];\n\nexport function coerceTngPressNullableBoolean(value: NullableBooleanInput): boolean | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return null;\n}\n\nexport function coerceTngPressAriaHasPopup(\n value: boolean | null | string | undefined,\n): TngPressAriaHasPopup | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (value === true) {\n return 'true';\n }\n\n if (value === false) {\n return 'false';\n }\n\n const normalized = value.trim().toLowerCase();\n if (!isTngPressAriaHasPopup(normalized)) {\n return null;\n }\n\n return normalized;\n}\n\nfunction isActivationKey(key: string): boolean {\n return key === ' ' || key === 'Enter';\n}\n\nfunction isTngPressAriaHasPopup(value: string): value is TngPressAriaHasPopup {\n return validAriaHasPopupValues.includes(value as TngPressAriaHasPopup);\n}\n\nfunction normalizeStringValue(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toAriaBoolean(value: boolean | null): 'false' | 'true' | null {\n if (value === null) {\n return null;\n }\n\n return value ? 'true' : 'false';\n}\n\n@Directive({\n selector: 'a[tngPress], button[tngPress]',\n exportAs: 'tngPress',\n})\nexport class TngPress {\n public readonly ariaControls = input<string | null>(null);\n public readonly ariaExpanded = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngPressNullableBoolean,\n });\n public readonly ariaHasPopup = input<\n TngPressAriaHasPopup | null,\n boolean | null | string | undefined\n >(null, {\n transform: coerceTngPressAriaHasPopup,\n });\n public readonly ariaPressed = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngPressNullableBoolean,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly type = input<TngPressType>('button');\n\n private readonly hostRef = inject<ElementRef<ButtonHostElement>>(ElementRef);\n\n @HostBinding('attr.aria-controls')\n protected get ariaControlsAttr(): string | null {\n return normalizeStringValue(this.ariaControls());\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n if (this.isNativeButton()) {\n return null;\n }\n\n return this.disabled() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-expanded')\n protected get ariaExpandedAttr(): 'false' | 'true' | null {\n return toAriaBoolean(this.ariaExpanded());\n }\n\n @HostBinding('attr.aria-haspopup')\n protected get ariaHasPopupAttr(): TngPressAriaHasPopup | null {\n return this.ariaHasPopup();\n }\n\n @HostBinding('attr.aria-pressed')\n protected get ariaPressedAttr(): 'false' | 'true' | null {\n return toAriaBoolean(this.ariaPressed());\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n if (!this.isNativeButton()) {\n return null;\n }\n\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.role')\n protected get roleAttr(): 'button' | null {\n return this.isAnchorWithoutHref() ? 'button' : null;\n }\n\n @HostBinding('attr.tabindex')\n protected get tabIndexAttr(): -1 | 0 | null {\n if (!this.isAnchorHost()) {\n return null;\n }\n\n if (this.disabled()) {\n return -1;\n }\n\n return this.hasHref() ? null : 0;\n }\n\n @HostBinding('attr.type')\n protected get typeAttr(): TngPressType | null {\n return this.isNativeButton() ? this.type() : null;\n }\n\n @HostListener('click', ['$event'])\n protected onHostClick(...args: readonly unknown[]): void {\n if (!this.disabled()) {\n return;\n }\n\n const [event] = args;\n if (!(event instanceof Event)) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n @HostListener('keydown', ['$event'])\n protected onHostKeyDown(...args: readonly unknown[]): void {\n if (!this.isAnchorWithoutHref()) {\n return;\n }\n\n const [event] = args;\n if (!(event instanceof KeyboardEvent)) {\n return;\n }\n\n if (!isActivationKey(event.key)) {\n return;\n }\n\n event.preventDefault();\n if (this.disabled()) {\n return;\n }\n\n this.hostElement.click();\n }\n\n private get hostElement(): ButtonHostElement {\n return this.hostRef.nativeElement;\n }\n\n private hasHref(): boolean {\n return this.hostElement.hasAttribute('href');\n }\n\n private isAnchorHost(): boolean {\n return this.hostElement.tagName === 'A';\n }\n\n private isAnchorWithoutHref(): boolean {\n if (!this.isAnchorHost()) {\n return false;\n }\n\n return !this.hasHref();\n }\n\n private isNativeButton(): boolean {\n return this.hostElement.tagName === 'BUTTON';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-press.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/press/tng-press.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,KAAK,GACN,MAAM,eAAe,CAAC;AAcvB,MAAM,uBAAuB,GAAoC;IAC/D,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,KAA2B;IACvE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAA0C;IAE1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO,CAAC;AACxC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAA6B,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAgC;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,KAAqB;IAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAClC,CAAC;AAOM,IAAM,QAAQ,GAAd,MAAM,QAAQ;IACH,YAAY,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;IAC1C,YAAY,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC/E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,YAAY,GAAG,KAAK,CAGlC,IAAI,EAAE;QACN,SAAS,EAAE,0BAA0B;KACtC,CAAC,CAAC;IACa,WAAW,GAAG,KAAK,CAAuC,IAAI,EAAE;QAC9E,SAAS,EAAE,6BAA6B;KACzC,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,IAAI,GAAG,KAAK,CAAe,QAAQ,CAAC,CAAC;IAEpC,OAAO,GAAG,MAAM,CAAgC,UAAU,CAAC,CAAC;IAG7E,IAAc,gBAAgB;QAC5B,OAAO,oBAAoB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,CAAC;IAGD,IAAc,gBAAgB;QAC5B,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAGD,IAAc,eAAe;QAC3B,OAAO,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAGD,IAAc,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAGD,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAGD,IAAc,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAGD,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAGS,WAAW,CAAC,GAAG,IAAwB;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACnC,CAAC;IAGS,aAAa,CAAC,GAAG,IAAwB;QACjD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,IAAY,WAAW;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACpC,CAAC;IAEO,OAAO;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,GAAG,CAAC;IAC1C,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC;IAC/C,CAAC;CACF,CAAA;AA9HC;IADC,WAAW,CAAC,oBAAoB,CAAC;gDAGjC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;gDAOjC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;gDAGjC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;gDAGjC;AAGD;IADC,WAAW,CAAC,mBAAmB,CAAC;+CAGhC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;gDAGjC;AAGD;IADC,WAAW,CAAC,eAAe,CAAC;4CAO5B;AAGD;IADC,WAAW,CAAC,WAAW,CAAC;wCAGxB;AAGD;IADC,WAAW,CAAC,eAAe,CAAC;4CAW5B;AAGD;IADC,WAAW,CAAC,WAAW,CAAC;wCAGxB;AAGS;IADT,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;2CAajC;AAGS;IADT,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;6CAqBnC;AA3HU,QAAQ;IALpB,SAAS,CAAC;QACT,QAAQ,EAAE,+BAA+B;QACzC,QAAQ,EAAE,UAAU;QACpB,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,QAAQ,CAoJpB","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\n\ntype ButtonHostElement = HTMLAnchorElement | HTMLButtonElement;\ntype NullableBooleanInput = boolean | null | string | undefined;\nexport type TngPressAriaHasPopup =\n | 'dialog'\n | 'false'\n | 'grid'\n | 'listbox'\n | 'menu'\n | 'tree'\n | 'true';\nexport type TngPressType = 'button' | 'reset' | 'submit';\n\nconst validAriaHasPopupValues: readonly TngPressAriaHasPopup[] = [\n 'dialog',\n 'false',\n 'grid',\n 'listbox',\n 'menu',\n 'tree',\n 'true',\n];\n\nexport function coerceTngPressNullableBoolean(value: NullableBooleanInput): boolean | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (value === '' || value === true || value === 'true') {\n return true;\n }\n\n if (value === false || value === 'false') {\n return false;\n }\n\n return null;\n}\n\nexport function coerceTngPressAriaHasPopup(\n value: boolean | null | string | undefined,\n): TngPressAriaHasPopup | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n if (value === true) {\n return 'true';\n }\n\n if (value === false) {\n return 'false';\n }\n\n const normalized = value.trim().toLowerCase();\n if (!isTngPressAriaHasPopup(normalized)) {\n return null;\n }\n\n return normalized;\n}\n\nfunction isActivationKey(key: string): boolean {\n return key === ' ' || key === 'Enter';\n}\n\nfunction isTngPressAriaHasPopup(value: string): value is TngPressAriaHasPopup {\n return validAriaHasPopupValues.includes(value as TngPressAriaHasPopup);\n}\n\nfunction normalizeStringValue(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toAriaBoolean(value: boolean | null): 'false' | 'true' | null {\n if (value === null) {\n return null;\n }\n\n return value ? 'true' : 'false';\n}\n\n@Directive({\n selector: 'a[tngPress], button[tngPress]',\n exportAs: 'tngPress',\n standalone: true,\n})\nexport class TngPress {\n public readonly ariaControls = input<string | null>(null);\n public readonly ariaExpanded = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngPressNullableBoolean,\n });\n public readonly ariaHasPopup = input<\n TngPressAriaHasPopup | null,\n boolean | null | string | undefined\n >(null, {\n transform: coerceTngPressAriaHasPopup,\n });\n public readonly ariaPressed = input<boolean | null, NullableBooleanInput>(null, {\n transform: coerceTngPressNullableBoolean,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly type = input<TngPressType>('button');\n\n private readonly hostRef = inject<ElementRef<ButtonHostElement>>(ElementRef);\n\n @HostBinding('attr.aria-controls')\n protected get ariaControlsAttr(): string | null {\n return normalizeStringValue(this.ariaControls());\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n if (this.isNativeButton()) {\n return null;\n }\n\n return this.disabled() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-expanded')\n protected get ariaExpandedAttr(): 'false' | 'true' | null {\n return toAriaBoolean(this.ariaExpanded());\n }\n\n @HostBinding('attr.aria-haspopup')\n protected get ariaHasPopupAttr(): TngPressAriaHasPopup | null {\n return this.ariaHasPopup();\n }\n\n @HostBinding('attr.aria-pressed')\n protected get ariaPressedAttr(): 'false' | 'true' | null {\n return toAriaBoolean(this.ariaPressed());\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n if (!this.isNativeButton()) {\n return null;\n }\n\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.role')\n protected get roleAttr(): 'button' | null {\n return this.isAnchorWithoutHref() ? 'button' : null;\n }\n\n @HostBinding('attr.tabindex')\n protected get tabIndexAttr(): -1 | 0 | null {\n if (!this.isAnchorHost()) {\n return null;\n }\n\n if (this.disabled()) {\n return -1;\n }\n\n return this.hasHref() ? null : 0;\n }\n\n @HostBinding('attr.type')\n protected get typeAttr(): TngPressType | null {\n return this.isNativeButton() ? this.type() : null;\n }\n\n @HostListener('click', ['$event'])\n protected onHostClick(...args: readonly unknown[]): void {\n if (!this.disabled()) {\n return;\n }\n\n const [event] = args;\n if (!(event instanceof Event)) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n @HostListener('keydown', ['$event'])\n protected onHostKeyDown(...args: readonly unknown[]): void {\n if (!this.isAnchorWithoutHref()) {\n return;\n }\n\n const [event] = args;\n if (!(event instanceof KeyboardEvent)) {\n return;\n }\n\n if (!isActivationKey(event.key)) {\n return;\n }\n\n event.preventDefault();\n if (this.disabled()) {\n return;\n }\n\n this.hostElement.click();\n }\n\n private get hostElement(): ButtonHostElement {\n return this.hostRef.nativeElement;\n }\n\n private hasHref(): boolean {\n return this.hostElement.hasAttribute('href');\n }\n\n private isAnchorHost(): boolean {\n return this.hostElement.tagName === 'A';\n }\n\n private isAnchorWithoutHref(): boolean {\n if (!this.isAnchorHost()) {\n return false;\n }\n\n return !this.hasHref();\n }\n\n private isNativeButton(): boolean {\n return this.hostElement.tagName === 'BUTTON';\n }\n}\n"]}
|
|
@@ -1,4 +1,41 @@
|
|
|
1
|
+
import type { TngKeyboardEvent, TngMouseEvent } from '@tailng-ui/cdk';
|
|
1
2
|
export declare class TngTag {
|
|
3
|
+
readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
4
|
+
readonly removable: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
5
|
+
readonly label: import("@angular/core").InputSignal<string | null>;
|
|
6
|
+
readonly tngTagRemoved: import("@angular/core").OutputEmitterRef<void>;
|
|
7
|
+
isDisabled(): boolean;
|
|
8
|
+
isRemovable(): boolean;
|
|
9
|
+
resolvedLabel(): string;
|
|
10
|
+
requestRemove(): boolean;
|
|
11
|
+
protected get ariaDisabledAttr(): 'true' | null;
|
|
12
|
+
protected get dataDisabledAttr(): '' | null;
|
|
13
|
+
protected get dataRemovableAttr(): '' | null;
|
|
2
14
|
protected readonly dataSlot: "tag";
|
|
3
15
|
}
|
|
16
|
+
export declare class TngTagIcon {
|
|
17
|
+
protected readonly dataSlot: "tag-icon";
|
|
18
|
+
}
|
|
19
|
+
export declare class TngTagClose {
|
|
20
|
+
private readonly elementRef;
|
|
21
|
+
private readonly tag;
|
|
22
|
+
private focused;
|
|
23
|
+
private suppressNextClick;
|
|
24
|
+
readonly ariaLabel: import("@angular/core").InputSignal<string | null>;
|
|
25
|
+
protected onClick(event: TngMouseEvent): void;
|
|
26
|
+
protected onFocusIn(): void;
|
|
27
|
+
protected onFocusOut(): void;
|
|
28
|
+
protected onKeydown(event: TngKeyboardEvent): void;
|
|
29
|
+
private requestRemove;
|
|
30
|
+
private isButtonElement;
|
|
31
|
+
private isDisabled;
|
|
32
|
+
protected get ariaLabelAttr(): string;
|
|
33
|
+
protected get dataDisabledAttr(): '' | null;
|
|
34
|
+
protected get dataFocusedAttr(): '' | null;
|
|
35
|
+
protected readonly dataSlot: "tag-close";
|
|
36
|
+
protected get disabledAttr(): '' | null;
|
|
37
|
+
protected get roleAttr(): 'button' | null;
|
|
38
|
+
protected get tabIndexAttr(): '0' | '-1' | null;
|
|
39
|
+
protected get typeAttr(): 'button' | null;
|
|
40
|
+
}
|
|
4
41
|
//# sourceMappingURL=tng-tag.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-tag.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/tag/tng-tag.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tng-tag.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/tag/tng-tag.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAWtE,qBAKa,MAAM;IACjB,SAAgB,QAAQ,8EAGrB;IAEH,SAAgB,SAAS,8EAGtB;IAEH,SAAgB,KAAK,qDAElB;IAEH,SAAgB,aAAa,iDAAkB;IAExC,UAAU,IAAI,OAAO;IAIrB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,MAAM;IAIvB,aAAa,IAAI,OAAO;IAU/B,SAAS,KAAK,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAE9C;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,iBAAiB,IAAI,EAAE,GAAG,IAAI,CAE3C;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,KAAK,CAAU;CAC9C;AAED,qBAKa,UAAU;IAErB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;CACnD;AAED,qBAKa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;IAC1E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsC;IAE1D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAElC,SAAgB,SAAS,qDAEtB;IAGH,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAe7C,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B,SAAS,CAAC,UAAU,IAAI,IAAI;IAK5B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAgBlD,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,UAAU;IAKlB,SAAS,KAAK,aAAa,IAAI,MAAM,CAapC;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,WAAW,CAAU;IAGnD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAMtC;IAGD,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAExC;IAGD,SAAS,KAAK,YAAY,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAM9C;IAGD,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAExC;CACF"}
|