@tailng-ui/primitives 0.11.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 (101) hide show
  1. package/README.md +97 -11
  2. package/package.json +1 -1
  3. package/src/lib/feedback/empty/tng-empty.d.ts.map +1 -1
  4. package/src/lib/feedback/empty/tng-empty.js +5 -0
  5. package/src/lib/feedback/empty/tng-empty.js.map +1 -1
  6. package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts.map +1 -1
  7. package/src/lib/feedback/progress-bar/tng-progress-bar.js +2 -0
  8. package/src/lib/feedback/progress-bar/tng-progress-bar.js.map +1 -1
  9. package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts.map +1 -1
  10. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js +1 -0
  11. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js.map +1 -1
  12. package/src/lib/feedback/skeleton/tng-skeleton.d.ts.map +1 -1
  13. package/src/lib/feedback/skeleton/tng-skeleton.js +1 -0
  14. package/src/lib/feedback/skeleton/tng-skeleton.js.map +1 -1
  15. package/src/lib/feedback/toast/tng-toast.d.ts.map +1 -1
  16. package/src/lib/feedback/toast/tng-toast.js +2 -0
  17. package/src/lib/feedback/toast/tng-toast.js.map +1 -1
  18. package/src/lib/form/checkbox/tng-checkbox.d.ts.map +1 -1
  19. package/src/lib/form/checkbox/tng-checkbox.js +1 -0
  20. package/src/lib/form/checkbox/tng-checkbox.js.map +1 -1
  21. package/src/lib/form/chips/tng-chips.d.ts.map +1 -1
  22. package/src/lib/form/chips/tng-chips.js +3 -0
  23. package/src/lib/form/chips/tng-chips.js.map +1 -1
  24. package/src/lib/form/combobox/tng-combobox.d.ts.map +1 -1
  25. package/src/lib/form/combobox/tng-combobox.js +1 -0
  26. package/src/lib/form/combobox/tng-combobox.js.map +1 -1
  27. package/src/lib/form/input-otp/tng-input-otp.d.ts.map +1 -1
  28. package/src/lib/form/input-otp/tng-input-otp.js +1 -0
  29. package/src/lib/form/input-otp/tng-input-otp.js.map +1 -1
  30. package/src/lib/form/label/tng-label.d.ts.map +1 -1
  31. package/src/lib/form/label/tng-label.js +1 -0
  32. package/src/lib/form/label/tng-label.js.map +1 -1
  33. package/src/lib/form/multiselect/tng-multiselect.d.ts.map +1 -1
  34. package/src/lib/form/multiselect/tng-multiselect.js +1 -0
  35. package/src/lib/form/multiselect/tng-multiselect.js.map +1 -1
  36. package/src/lib/form/radio/tng-radio.d.ts.map +1 -1
  37. package/src/lib/form/radio/tng-radio.js +1 -0
  38. package/src/lib/form/radio/tng-radio.js.map +1 -1
  39. package/src/lib/form/slider/tng-slider.d.ts.map +1 -1
  40. package/src/lib/form/slider/tng-slider.js +1 -0
  41. package/src/lib/form/slider/tng-slider.js.map +1 -1
  42. package/src/lib/form/switch/tng-switch.d.ts.map +1 -1
  43. package/src/lib/form/switch/tng-switch.js +1 -0
  44. package/src/lib/form/switch/tng-switch.js.map +1 -1
  45. package/src/lib/form/toggle/tng-toggle.d.ts.map +1 -1
  46. package/src/lib/form/toggle/tng-toggle.js +1 -0
  47. package/src/lib/form/toggle/tng-toggle.js.map +1 -1
  48. package/src/lib/form/toggle-group/tng-toggle-group.d.ts.map +1 -1
  49. package/src/lib/form/toggle-group/tng-toggle-group.js +1 -0
  50. package/src/lib/form/toggle-group/tng-toggle-group.js.map +1 -1
  51. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts.map +1 -1
  52. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js +1 -0
  53. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js.map +1 -1
  54. package/src/lib/layout/card/tng-card.d.ts.map +1 -1
  55. package/src/lib/layout/card/tng-card.js +10 -0
  56. package/src/lib/layout/card/tng-card.js.map +1 -1
  57. package/src/lib/layout/collapsible/tng-collapsible.d.ts.map +1 -1
  58. package/src/lib/layout/collapsible/tng-collapsible.js +3 -0
  59. package/src/lib/layout/collapsible/tng-collapsible.js.map +1 -1
  60. package/src/lib/layout/grid/tng-grid.d.ts.map +1 -1
  61. package/src/lib/layout/grid/tng-grid.js +1 -0
  62. package/src/lib/layout/grid/tng-grid.js.map +1 -1
  63. package/src/lib/layout/separator/tng-separator.d.ts.map +1 -1
  64. package/src/lib/layout/separator/tng-separator.js +1 -0
  65. package/src/lib/layout/separator/tng-separator.js.map +1 -1
  66. package/src/lib/layout/stepper/tng-stepper.d.ts.map +1 -1
  67. package/src/lib/layout/stepper/tng-stepper.js +1 -0
  68. package/src/lib/layout/stepper/tng-stepper.js.map +1 -1
  69. package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts.map +1 -1
  70. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js +5 -0
  71. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js.map +1 -1
  72. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts.map +1 -1
  73. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js +1 -0
  74. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js.map +1 -1
  75. package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts.map +1 -1
  76. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js +1 -0
  77. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js.map +1 -1
  78. package/src/lib/navigation/toolbar/tng-toolbar.d.ts.map +1 -1
  79. package/src/lib/navigation/toolbar/tng-toolbar.js +1 -0
  80. package/src/lib/navigation/toolbar/tng-toolbar.js.map +1 -1
  81. package/src/lib/overlay/tooltip/tng-tooltip.d.ts.map +1 -1
  82. package/src/lib/overlay/tooltip/tng-tooltip.js +3 -0
  83. package/src/lib/overlay/tooltip/tng-tooltip.js.map +1 -1
  84. package/src/lib/utility/avatar/tng-avatar.d.ts.map +1 -1
  85. package/src/lib/utility/avatar/tng-avatar.js +3 -0
  86. package/src/lib/utility/avatar/tng-avatar.js.map +1 -1
  87. package/src/lib/utility/badge/tng-badge.d.ts.map +1 -1
  88. package/src/lib/utility/badge/tng-badge.js +1 -0
  89. package/src/lib/utility/badge/tng-badge.js.map +1 -1
  90. package/src/lib/utility/code-block/tng-code-block.d.ts.map +1 -1
  91. package/src/lib/utility/code-block/tng-code-block.js +5 -0
  92. package/src/lib/utility/code-block/tng-code-block.js.map +1 -1
  93. package/src/lib/utility/copy/tng-copy.d.ts.map +1 -1
  94. package/src/lib/utility/copy/tng-copy.js +1 -0
  95. package/src/lib/utility/copy/tng-copy.js.map +1 -1
  96. package/src/lib/utility/press/tng-press.d.ts.map +1 -1
  97. package/src/lib/utility/press/tng-press.js +1 -0
  98. package/src/lib/utility/press/tng-press.js.map +1 -1
  99. package/src/lib/utility/tag/tng-tag.d.ts.map +1 -1
  100. package/src/lib/utility/tag/tng-tag.js +3 -0
  101. package/src/lib/utility/tag/tng-tag.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tng-tag.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/tag/tng-tag.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AAGvB,SAAS,eAAe,CAAC,KAAgC;IACvD,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;AAMM,IAAM,MAAM,GAAZ,MAAM,MAAM;IACD,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,KAAK,EAAE,gBAAgB;QACvB,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IAEa,SAAS,GAAG,KAAK,CAA4B,KAAK,EAAE;QAClE,KAAK,EAAE,iBAAiB;QACxB,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IAEa,KAAK,GAAG,KAAK,CAAgB,IAAI,EAAE;QACjD,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEa,aAAa,GAAG,MAAM,EAAQ,CAAC;IAExC,UAAU;QACf,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IAEM,aAAa;QAClB,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC;IAChD,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAGD,IAAc,iBAAiB;QAC7B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAGkB,QAAQ,GAAG,KAAc,CAAC;CAC9C,CAAA;AAhBC;IADC,WAAW,CAAC,oBAAoB,CAAC;8CAGjC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;8CAGjC;AAGD;IADC,WAAW,CAAC,qBAAqB,CAAC;+CAGlC;AAGkB;IADlB,WAAW,CAAC,gBAAgB,CAAC;wCACe;AAtDlC,MAAM;IAJlB,SAAS,CAAC;QACT,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,QAAQ;KACnB,CAAC;GACW,MAAM,CAuDlB;;AAMM,IAAM,UAAU,GAAhB,MAAM,UAAU;IAEF,QAAQ,GAAG,UAAmB,CAAC;CACnD,CAAA;AADoB;IADlB,WAAW,CAAC,gBAAgB,CAAC;4CACoB;AAFvC,UAAU;IAJtB,SAAS,CAAC;QACT,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,YAAY;KACvB,CAAC;GACW,UAAU,CAGtB;;AAMM,IAAM,WAAW,GAAjB,MAAM,WAAW;IACL,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;IACzD,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,OAAO,GAAG,KAAK,CAAC;IAChB,iBAAiB,GAAG,KAAK,CAAC;IAElB,SAAS,GAAG,KAAK,CAAgB,IAAI,EAAE;QACrD,KAAK,EAAE,sBAAsB;KAC9B,CAAC,CAAC;IAGO,OAAO,CAAC,KAAoB;QACpC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAGS,SAAS;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAGS,UAAU;QAClB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAGS,SAAS,CAAC,KAAuB;QACzC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IAC5C,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,KAAK,QAAQ,CAAC;IAC5D,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC1C,CAAC;IAGD,IAAc,aAAa;QACzB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9F,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,KAAK,CAAC;QACjD,OAAO,UAAU,KAAK,EAAE,CAAC;IAC3B,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAGD,IAAc,eAAe;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC;IAGkB,QAAQ,GAAG,WAAoB,CAAC;IAGnD,IAAc,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAGD,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,CAAC;IAGD,IAAc,YAAY;QACxB,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,CAAC;IAGD,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;CACF,CAAA;AA7GW;IADT,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;0CAajC;AAGS;IADT,YAAY,CAAC,SAAS,CAAC;4CAGvB;AAGS;IADT,YAAY,CAAC,UAAU,CAAC;6CAGxB;AAGS;IADT,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;4CAenC;AAeD;IADC,WAAW,CAAC,iBAAiB,CAAC;gDAc9B;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;mDAGjC;AAGD;IADC,WAAW,CAAC,mBAAmB,CAAC;kDAGhC;AAGkB;IADlB,WAAW,CAAC,gBAAgB,CAAC;6CACqB;AAGnD;IADC,WAAW,CAAC,eAAe,CAAC;+CAO5B;AAGD;IADC,WAAW,CAAC,WAAW,CAAC;2CAGxB;AAGD;IADC,WAAW,CAAC,eAAe,CAAC;+CAO5B;AAGD;IADC,WAAW,CAAC,WAAW,CAAC;2CAGxB;AAxHU,WAAW;IAJvB,SAAS,CAAC;QACT,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,aAAa;KACxB,CAAC;GACW,WAAW,CAyHvB","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport type { TngKeyboardEvent, TngMouseEvent } from '@tailng-ui/cdk';\n\nfunction normalizeString(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\n@Directive({\n selector: '[tngTag]',\n exportAs: 'tngTag',\n})\nexport class TngTag {\n public readonly disabled = input<boolean, boolean | string>(false, {\n alias: 'tngTagDisabled',\n transform: booleanAttribute,\n });\n\n public readonly removable = input<boolean, boolean | string>(false, {\n alias: 'tngTagRemovable',\n transform: booleanAttribute,\n });\n\n public readonly label = input<string | null>(null, {\n alias: 'tngTagLabel',\n });\n\n public readonly tngTagRemoved = output<void>();\n\n public isDisabled(): boolean {\n return this.disabled();\n }\n\n public isRemovable(): boolean {\n return this.removable() && !this.isDisabled();\n }\n\n public resolvedLabel(): string {\n return normalizeString(this.label()) ?? 'tag';\n }\n\n public requestRemove(): boolean {\n if (!this.isRemovable()) {\n return false;\n }\n\n this.tngTagRemoved.emit();\n return true;\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n return this.isDisabled() ? 'true' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.data-removable')\n protected get dataRemovableAttr(): '' | null {\n return this.removable() ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'tag' as const;\n}\n\n@Directive({\n selector: '[tngTagIcon]',\n exportAs: 'tngTagIcon',\n})\nexport class TngTagIcon {\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'tag-icon' as const;\n}\n\n@Directive({\n selector: '[tngTagClose]',\n exportAs: 'tngTagClose',\n})\nexport class TngTagClose {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly tag = inject(TngTag, { optional: true });\n\n private focused = false;\n private suppressNextClick = false;\n\n public readonly ariaLabel = input<string | null>(null, {\n alias: 'tngTagCloseAriaLabel',\n });\n\n @HostListener('click', ['$event'])\n protected onClick(event: TngMouseEvent): void {\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (!this.requestRemove()) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout')\n protected onFocusOut(): void {\n this.focused = false;\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: TngKeyboardEvent): void {\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.suppressNextClick = true;\n setTimeout(() => {\n this.suppressNextClick = false;\n });\n\n this.requestRemove();\n }\n\n private requestRemove(): boolean {\n return this.tag?.requestRemove() === true;\n }\n\n private isButtonElement(): boolean {\n return this.elementRef.nativeElement.tagName === 'BUTTON';\n }\n\n private isDisabled(): boolean {\n return this.tag?.isRemovable() !== true;\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string {\n const explicit = normalizeString(this.ariaLabel());\n if (explicit !== null) {\n return explicit;\n }\n\n const hostDefined = normalizeString(this.elementRef.nativeElement.getAttribute('aria-label'));\n if (hostDefined !== null) {\n return hostDefined;\n }\n\n const label = this.tag?.resolvedLabel() ?? 'tag';\n return `Remove ${label}`;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocusedAttr(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'tag-close' as const;\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n if (!this.isButtonElement()) {\n return null;\n }\n\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.role')\n protected get roleAttr(): 'button' | null {\n return this.isButtonElement() ? null : 'button';\n }\n\n @HostBinding('attr.tabindex')\n protected get tabIndexAttr(): '0' | '-1' | null {\n if (this.isButtonElement()) {\n return null;\n }\n\n return this.isDisabled() ? '-1' : '0';\n }\n\n @HostBinding('attr.type')\n protected get typeAttr(): 'button' | null {\n return this.isButtonElement() ? 'button' : null;\n }\n}\n"]}
1
+ {"version":3,"file":"tng-tag.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/utility/tag/tng-tag.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\nimport type { TngKeyboardEvent, TngMouseEvent } from '@tailng-ui/cdk';\n\nfunction normalizeString(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\n@Directive({\n selector: '[tngTag]',\n exportAs: 'tngTag',\n standalone: true,\n})\nexport class TngTag {\n public readonly disabled = input<boolean, boolean | string>(false, {\n alias: 'tngTagDisabled',\n transform: booleanAttribute,\n });\n\n public readonly removable = input<boolean, boolean | string>(false, {\n alias: 'tngTagRemovable',\n transform: booleanAttribute,\n });\n\n public readonly label = input<string | null>(null, {\n alias: 'tngTagLabel',\n });\n\n public readonly tngTagRemoved = output<void>();\n\n public isDisabled(): boolean {\n return this.disabled();\n }\n\n public isRemovable(): boolean {\n return this.removable() && !this.isDisabled();\n }\n\n public resolvedLabel(): string {\n return normalizeString(this.label()) ?? 'tag';\n }\n\n public requestRemove(): boolean {\n if (!this.isRemovable()) {\n return false;\n }\n\n this.tngTagRemoved.emit();\n return true;\n }\n\n @HostBinding('attr.aria-disabled')\n protected get ariaDisabledAttr(): 'true' | null {\n return this.isDisabled() ? 'true' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.data-removable')\n protected get dataRemovableAttr(): '' | null {\n return this.removable() ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'tag' as const;\n}\n\n@Directive({\n selector: '[tngTagIcon]',\n exportAs: 'tngTagIcon',\n standalone: true,\n})\nexport class TngTagIcon {\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'tag-icon' as const;\n}\n\n@Directive({\n selector: '[tngTagClose]',\n exportAs: 'tngTagClose',\n standalone: true,\n})\nexport class TngTagClose {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly tag = inject(TngTag, { optional: true });\n\n private focused = false;\n private suppressNextClick = false;\n\n public readonly ariaLabel = input<string | null>(null, {\n alias: 'tngTagCloseAriaLabel',\n });\n\n @HostListener('click', ['$event'])\n protected onClick(event: TngMouseEvent): void {\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (!this.requestRemove()) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout')\n protected onFocusOut(): void {\n this.focused = false;\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: TngKeyboardEvent): void {\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.suppressNextClick = true;\n setTimeout(() => {\n this.suppressNextClick = false;\n });\n\n this.requestRemove();\n }\n\n private requestRemove(): boolean {\n return this.tag?.requestRemove() === true;\n }\n\n private isButtonElement(): boolean {\n return this.elementRef.nativeElement.tagName === 'BUTTON';\n }\n\n private isDisabled(): boolean {\n return this.tag?.isRemovable() !== true;\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string {\n const explicit = normalizeString(this.ariaLabel());\n if (explicit !== null) {\n return explicit;\n }\n\n const hostDefined = normalizeString(this.elementRef.nativeElement.getAttribute('aria-label'));\n if (hostDefined !== null) {\n return hostDefined;\n }\n\n const label = this.tag?.resolvedLabel() ?? 'tag';\n return `Remove ${label}`;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocusedAttr(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'tag-close' as const;\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n if (!this.isButtonElement()) {\n return null;\n }\n\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.role')\n protected get roleAttr(): 'button' | null {\n return this.isButtonElement() ? null : 'button';\n }\n\n @HostBinding('attr.tabindex')\n protected get tabIndexAttr(): '0' | '-1' | null {\n if (this.isButtonElement()) {\n return null;\n }\n\n return this.isDisabled() ? '-1' : '0';\n }\n\n @HostBinding('attr.type')\n protected get typeAttr(): 'button' | null {\n return this.isButtonElement() ? 'button' : null;\n }\n}\n"]}