@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.
Files changed (166) hide show
  1. package/README.md +97 -11
  2. package/package.json +9 -3
  3. package/src/index.d.ts +5 -0
  4. package/src/index.d.ts.map +1 -1
  5. package/src/index.js +5 -0
  6. package/src/index.js.map +1 -1
  7. package/src/lib/feedback/empty/tng-empty.d.ts.map +1 -1
  8. package/src/lib/feedback/empty/tng-empty.js +5 -0
  9. package/src/lib/feedback/empty/tng-empty.js.map +1 -1
  10. package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts.map +1 -1
  11. package/src/lib/feedback/progress-bar/tng-progress-bar.js +4 -1
  12. package/src/lib/feedback/progress-bar/tng-progress-bar.js.map +1 -1
  13. package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts.map +1 -1
  14. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js +3 -1
  15. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js.map +1 -1
  16. package/src/lib/feedback/skeleton/tng-skeleton.d.ts +1 -0
  17. package/src/lib/feedback/skeleton/tng-skeleton.d.ts.map +1 -1
  18. package/src/lib/feedback/skeleton/tng-skeleton.js +5 -0
  19. package/src/lib/feedback/skeleton/tng-skeleton.js.map +1 -1
  20. package/src/lib/feedback/toast/tng-toast.d.ts.map +1 -1
  21. package/src/lib/feedback/toast/tng-toast.js +2 -0
  22. package/src/lib/feedback/toast/tng-toast.js.map +1 -1
  23. package/src/lib/form/checkbox/tng-checkbox.d.ts.map +1 -1
  24. package/src/lib/form/checkbox/tng-checkbox.js +1 -0
  25. package/src/lib/form/checkbox/tng-checkbox.js.map +1 -1
  26. package/src/lib/form/chips/tng-chips.d.ts +53 -1
  27. package/src/lib/form/chips/tng-chips.d.ts.map +1 -1
  28. package/src/lib/form/chips/tng-chips.js +284 -1
  29. package/src/lib/form/chips/tng-chips.js.map +1 -1
  30. package/src/lib/form/combobox/tng-combobox.d.ts.map +1 -1
  31. package/src/lib/form/combobox/tng-combobox.js +1 -0
  32. package/src/lib/form/combobox/tng-combobox.js.map +1 -1
  33. package/src/lib/form/input-otp/tng-input-otp.d.ts +22 -0
  34. package/src/lib/form/input-otp/tng-input-otp.d.ts.map +1 -1
  35. package/src/lib/form/input-otp/tng-input-otp.js +106 -1
  36. package/src/lib/form/input-otp/tng-input-otp.js.map +1 -1
  37. package/src/lib/form/label/tng-label.d.ts +2 -0
  38. package/src/lib/form/label/tng-label.d.ts.map +1 -1
  39. package/src/lib/form/label/tng-label.js +10 -0
  40. package/src/lib/form/label/tng-label.js.map +1 -1
  41. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts +1 -0
  42. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts.map +1 -1
  43. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js +26 -0
  44. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js.map +1 -1
  45. package/src/lib/form/multiselect/tng-multiselect.d.ts.map +1 -1
  46. package/src/lib/form/multiselect/tng-multiselect.js +1 -0
  47. package/src/lib/form/multiselect/tng-multiselect.js.map +1 -1
  48. package/src/lib/form/radio/tng-radio.d.ts +26 -0
  49. package/src/lib/form/radio/tng-radio.d.ts.map +1 -1
  50. package/src/lib/form/radio/tng-radio.js +130 -1
  51. package/src/lib/form/radio/tng-radio.js.map +1 -1
  52. package/src/lib/form/slider/tng-slider.d.ts.map +1 -1
  53. package/src/lib/form/slider/tng-slider.js +1 -0
  54. package/src/lib/form/slider/tng-slider.js.map +1 -1
  55. package/src/lib/form/switch/tng-switch.d.ts.map +1 -1
  56. package/src/lib/form/switch/tng-switch.js +1 -0
  57. package/src/lib/form/switch/tng-switch.js.map +1 -1
  58. package/src/lib/form/textarea/tng-textarea.d.ts +6 -14
  59. package/src/lib/form/textarea/tng-textarea.d.ts.map +1 -1
  60. package/src/lib/form/textarea/tng-textarea.js +42 -85
  61. package/src/lib/form/textarea/tng-textarea.js.map +1 -1
  62. package/src/lib/form/toggle/tng-toggle.d.ts.map +1 -1
  63. package/src/lib/form/toggle/tng-toggle.js +1 -0
  64. package/src/lib/form/toggle/tng-toggle.js.map +1 -1
  65. package/src/lib/form/toggle-group/tng-toggle-group.d.ts.map +1 -1
  66. package/src/lib/form/toggle-group/tng-toggle-group.js +1 -0
  67. package/src/lib/form/toggle-group/tng-toggle-group.js.map +1 -1
  68. package/src/lib/layout/accordion/tng-accordion.d.ts +9 -0
  69. package/src/lib/layout/accordion/tng-accordion.d.ts.map +1 -1
  70. package/src/lib/layout/accordion/tng-accordion.js +113 -0
  71. package/src/lib/layout/accordion/tng-accordion.js.map +1 -1
  72. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts.map +1 -1
  73. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js +1 -0
  74. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js.map +1 -1
  75. package/src/lib/layout/card/tng-card.d.ts.map +1 -1
  76. package/src/lib/layout/card/tng-card.js +10 -0
  77. package/src/lib/layout/card/tng-card.js.map +1 -1
  78. package/src/lib/layout/collapsible/tng-collapsible.d.ts.map +1 -1
  79. package/src/lib/layout/collapsible/tng-collapsible.js +3 -0
  80. package/src/lib/layout/collapsible/tng-collapsible.js.map +1 -1
  81. package/src/lib/layout/grid/tng-grid.d.ts.map +1 -1
  82. package/src/lib/layout/grid/tng-grid.js +1 -0
  83. package/src/lib/layout/grid/tng-grid.js.map +1 -1
  84. package/src/lib/layout/separator/tng-separator.d.ts.map +1 -1
  85. package/src/lib/layout/separator/tng-separator.js +1 -0
  86. package/src/lib/layout/separator/tng-separator.js.map +1 -1
  87. package/src/lib/layout/stepper/tng-stepper.d.ts.map +1 -1
  88. package/src/lib/layout/stepper/tng-stepper.js +1 -0
  89. package/src/lib/layout/stepper/tng-stepper.js.map +1 -1
  90. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts +20 -0
  91. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts.map +1 -0
  92. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js +106 -0
  93. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js.map +1 -0
  94. package/src/lib/layout/tree/index.d.ts +5 -0
  95. package/src/lib/layout/tree/index.d.ts.map +1 -0
  96. package/src/lib/layout/tree/index.js +5 -0
  97. package/src/lib/layout/tree/index.js.map +1 -0
  98. package/src/lib/layout/tree/tng-tree-group.d.ts +10 -0
  99. package/src/lib/layout/tree/tng-tree-group.d.ts.map +1 -0
  100. package/src/lib/layout/tree/tng-tree-group.js +29 -0
  101. package/src/lib/layout/tree/tng-tree-group.js.map +1 -0
  102. package/src/lib/layout/tree/tng-tree-indicator.d.ts +8 -0
  103. package/src/lib/layout/tree/tng-tree-indicator.d.ts.map +1 -0
  104. package/src/lib/layout/tree/tng-tree-indicator.js +36 -0
  105. package/src/lib/layout/tree/tng-tree-indicator.js.map +1 -0
  106. package/src/lib/layout/tree/tng-tree-item.d.ts +36 -0
  107. package/src/lib/layout/tree/tng-tree-item.d.ts.map +1 -0
  108. package/src/lib/layout/tree/tng-tree-item.js +139 -0
  109. package/src/lib/layout/tree/tng-tree-item.js.map +1 -0
  110. package/src/lib/layout/tree/tng-tree.d.ts +64 -1
  111. package/src/lib/layout/tree/tng-tree.d.ts.map +1 -1
  112. package/src/lib/layout/tree/tng-tree.js +536 -1
  113. package/src/lib/layout/tree/tng-tree.js.map +1 -1
  114. package/src/lib/layout/tree/tng-tree.transforms.d.ts +10 -0
  115. package/src/lib/layout/tree/tng-tree.transforms.d.ts.map +1 -0
  116. package/src/lib/layout/tree/tng-tree.transforms.js +46 -0
  117. package/src/lib/layout/tree/tng-tree.transforms.js.map +1 -0
  118. package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts.map +1 -1
  119. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js +5 -0
  120. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js.map +1 -1
  121. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts.map +1 -1
  122. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js +1 -0
  123. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js.map +1 -1
  124. package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts.map +1 -1
  125. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js +1 -0
  126. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js.map +1 -1
  127. package/src/lib/navigation/toolbar/tng-toolbar.d.ts.map +1 -1
  128. package/src/lib/navigation/toolbar/tng-toolbar.js +1 -0
  129. package/src/lib/navigation/toolbar/tng-toolbar.js.map +1 -1
  130. package/src/lib/overlay/dialog/tng-dialog.d.ts +158 -0
  131. package/src/lib/overlay/dialog/tng-dialog.d.ts.map +1 -0
  132. package/src/lib/overlay/dialog/tng-dialog.js +854 -0
  133. package/src/lib/overlay/dialog/tng-dialog.js.map +1 -0
  134. package/src/lib/overlay/popover/tng-popover.d.ts +121 -0
  135. package/src/lib/overlay/popover/tng-popover.d.ts.map +1 -0
  136. package/src/lib/overlay/popover/tng-popover.js +614 -0
  137. package/src/lib/overlay/popover/tng-popover.js.map +1 -0
  138. package/src/lib/overlay/tng-overlay-runtime.d.ts +11 -0
  139. package/src/lib/overlay/tng-overlay-runtime.d.ts.map +1 -0
  140. package/src/lib/overlay/tng-overlay-runtime.js +6 -0
  141. package/src/lib/overlay/tng-overlay-runtime.js.map +1 -0
  142. package/src/lib/overlay/tooltip/tng-tooltip.d.ts +92 -3
  143. package/src/lib/overlay/tooltip/tng-tooltip.d.ts.map +1 -1
  144. package/src/lib/overlay/tooltip/tng-tooltip.js +477 -3
  145. package/src/lib/overlay/tooltip/tng-tooltip.js.map +1 -1
  146. package/src/lib/utility/avatar/tng-avatar.d.ts.map +1 -1
  147. package/src/lib/utility/avatar/tng-avatar.js +3 -0
  148. package/src/lib/utility/avatar/tng-avatar.js.map +1 -1
  149. package/src/lib/utility/badge/tng-badge.d.ts +6 -0
  150. package/src/lib/utility/badge/tng-badge.d.ts.map +1 -1
  151. package/src/lib/utility/badge/tng-badge.js +66 -0
  152. package/src/lib/utility/badge/tng-badge.js.map +1 -1
  153. package/src/lib/utility/code-block/tng-code-block.d.ts.map +1 -1
  154. package/src/lib/utility/code-block/tng-code-block.js +5 -0
  155. package/src/lib/utility/code-block/tng-code-block.js.map +1 -1
  156. package/src/lib/utility/copy/tng-copy.d.ts +21 -10
  157. package/src/lib/utility/copy/tng-copy.d.ts.map +1 -1
  158. package/src/lib/utility/copy/tng-copy.js +118 -88
  159. package/src/lib/utility/copy/tng-copy.js.map +1 -1
  160. package/src/lib/utility/press/tng-press.d.ts.map +1 -1
  161. package/src/lib/utility/press/tng-press.js +1 -0
  162. package/src/lib/utility/press/tng-press.js.map +1 -1
  163. package/src/lib/utility/tag/tng-tag.d.ts +37 -0
  164. package/src/lib/utility/tag/tng-tag.d.ts.map +1 -1
  165. package/src/lib/utility/tag/tng-tag.js +198 -1
  166. 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 eventMatchesHotkey(event, hotkey) {
199
+ function parseHotkey(hotkey) {
200
200
  const tokens = hotkey
201
201
  .split('+')
202
- .map((token) => token.trim().toLowerCase())
203
- .filter((token) => token.length > 0);
204
- if (tokens.length === 0) {
205
- return false;
206
- }
207
- const keyToken = tokens[tokens.length - 1];
208
- const modifierTokens = tokens.slice(0, -1);
209
- const modifierSet = new Set(modifierTokens);
210
- const isMacPlatform = /mac|iphone|ipad|ipod/i.test(globalThis.navigator?.platform ?? '');
211
- const expectsCtrl = modifierSet.has('ctrl') || (modifierSet.has('mod') && !isMacPlatform);
212
- const expectsMeta = modifierSet.has('meta') || (modifierSet.has('mod') && isMacPlatform);
213
- const expectsAlt = modifierSet.has('alt');
214
- const expectsShift = modifierSet.has('shift');
215
- if (event.ctrlKey !== expectsCtrl) {
216
- return false;
217
- }
218
- if (event.metaKey !== expectsMeta) {
219
- return false;
220
- }
221
- if (event.altKey !== expectsAlt) {
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
- if (event.shiftKey !== expectsShift) {
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 === undefined || value === null || value === 'auto') {
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 (value === '' || value === true || value === 'true') {
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
- if (value === 'text/html') {
250
- return 'text/html';
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
- export async function writeTngClipboardText(text, ownerDocument, format = 'text/plain') {
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
- if (clipboardApi !== undefined) {
277
- try {
278
- if (format === 'text/html' &&
279
- typeof clipboardApi.write === 'function' &&
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
- const didCopy = copyWithExecCommand(plainText, ownerDocument);
299
- if (didCopy) {
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', { transform: coerceTngCopyFormat });
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', { transform: coerceTngCopyAnnounce });
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
- try {
484
- const method = await writeTngClipboardText(resolvedPayload.text, this.hostElement.ownerDocument, this.tngCopyButtonFormat());
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
- resolvePayload() {
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
- return { error: new Error('Copy target was not found.'), text: null };
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 { error: null, text: resolveTngCopyPayload(directText, sourceText) };
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,qBAIa,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
+ {"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"}
@@ -201,6 +201,7 @@ TngPress = __decorate([
201
201
  Directive({
202
202
  selector: 'a[tngPress], button[tngPress]',
203
203
  exportAs: 'tngPress',
204
+ standalone: true,
204
205
  })
205
206
  ], TngPress);
206
207
  export { TngPress };
@@ -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":"AAEA,qBAIa,MAAM;IAEjB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,KAAK,CAAU;CAC9C"}
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"}