@ngneers/controls 0.0.1-next.1 → 0.0.1-next.2

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 (115) hide show
  1. package/fesm2022/ngneers-controls-api-ng.mjs +11 -18
  2. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-badge.mjs +160 -0
  4. package/fesm2022/ngneers-controls-badge.mjs.map +1 -0
  5. package/fesm2022/ngneers-controls-base.mjs +85 -8
  6. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  7. package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs → ngneers-controls-calendar-time-paM6WVpV.mjs} +2 -2
  8. package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs.map → ngneers-controls-calendar-time-paM6WVpV.mjs.map} +1 -1
  9. package/fesm2022/ngneers-controls-calendar.mjs +13 -6
  10. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-checkbox.mjs +3 -3
  12. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-color-picker.mjs +336 -0
  14. package/fesm2022/ngneers-controls-color-picker.mjs.map +1 -0
  15. package/fesm2022/ngneers-controls-default-icons.mjs +5 -0
  16. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -1
  17. package/fesm2022/ngneers-controls-directives.mjs +64 -7
  18. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  19. package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -5
  20. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-errors.mjs +203 -148
  22. package/fesm2022/ngneers-controls-errors.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-filter.mjs +2 -2
  24. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-hint.mjs +18 -1
  26. package/fesm2022/ngneers-controls-hint.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-i18n-translations-de.mjs +14 -0
  28. package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-i18n-translations-en.mjs +16 -0
  30. package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-icon.mjs +23 -6
  32. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-input-field.mjs +18 -2
  34. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-input.mjs +49 -9
  36. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  37. package/fesm2022/ngneers-controls-list-box.mjs +2 -2
  38. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  39. package/fesm2022/ngneers-controls-mask-input.mjs +4 -1
  40. package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -1
  41. package/fesm2022/ngneers-controls-number-input.mjs +4 -4
  42. package/fesm2022/ngneers-controls-number-input.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-otp.mjs +16 -4
  44. package/fesm2022/ngneers-controls-otp.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-paginator.mjs +36 -9
  46. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  47. package/fesm2022/ngneers-controls-radio.mjs +4 -4
  48. package/fesm2022/ngneers-controls-radio.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-rating.mjs +180 -0
  50. package/fesm2022/ngneers-controls-rating.mjs.map +1 -0
  51. package/fesm2022/ngneers-controls-scroll-shadow.mjs +33 -7
  52. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -1
  53. package/fesm2022/ngneers-controls-scroller.mjs +4 -2
  54. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-select-button.mjs +2 -1
  56. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-select.mjs +24 -4
  58. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-slider.mjs +3 -3
  60. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-stepper.mjs +142 -0
  62. package/fesm2022/ngneers-controls-stepper.mjs.map +1 -0
  63. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  64. package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-table.mjs +282 -15
  66. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  67. package/fesm2022/ngneers-controls-tabs.mjs +2 -2
  68. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-toggle-button.mjs +3 -3
  70. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-tooltip.mjs +16 -28
  72. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-tree.mjs +2 -2
  74. package/fesm2022/ngneers-controls-tree.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-utils.mjs +138 -1
  76. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  77. package/package.json +18 -2
  78. package/types/ngneers-controls-api-ng.d.ts +12 -9
  79. package/types/ngneers-controls-badge.d.ts +67 -0
  80. package/types/ngneers-controls-base.d.ts +61 -4
  81. package/types/ngneers-controls-breadcrumb.d.ts +14 -0
  82. package/types/ngneers-controls-calendar.d.ts +21 -6
  83. package/types/ngneers-controls-chip.d.ts +14 -0
  84. package/types/ngneers-controls-color-picker.d.ts +119 -0
  85. package/types/ngneers-controls-dialog.d.ts +14 -0
  86. package/types/ngneers-controls-directives.d.ts +31 -2
  87. package/types/ngneers-controls-drawer.d.ts +14 -0
  88. package/types/ngneers-controls-edit-inplace.d.ts +20 -0
  89. package/types/ngneers-controls-errors.d.ts +105 -16
  90. package/types/ngneers-controls-filter.d.ts +27 -13
  91. package/types/ngneers-controls-hint.d.ts +8 -1
  92. package/types/ngneers-controls-i18n-translations-de.d.ts +14 -0
  93. package/types/ngneers-controls-i18n-translations-en.d.ts +14 -0
  94. package/types/ngneers-controls-i18n.d.ts +14 -0
  95. package/types/ngneers-controls-icon.d.ts +2 -2
  96. package/types/ngneers-controls-input-field.d.ts +25 -2
  97. package/types/ngneers-controls-input.d.ts +35 -3
  98. package/types/ngneers-controls-list-box.d.ts +14 -0
  99. package/types/ngneers-controls-mask-input.d.ts +14 -0
  100. package/types/ngneers-controls-otp.d.ts +19 -0
  101. package/types/ngneers-controls-paginator.d.ts +31 -3
  102. package/types/ngneers-controls-rating.d.ts +69 -0
  103. package/types/ngneers-controls-scroll-shadow.d.ts +11 -2
  104. package/types/ngneers-controls-scroller.d.ts +3 -1
  105. package/types/ngneers-controls-select.d.ts +27 -3
  106. package/types/ngneers-controls-snackbar.d.ts +14 -0
  107. package/types/ngneers-controls-splitter.d.ts +14 -0
  108. package/types/ngneers-controls-state.d.ts +2 -2
  109. package/types/ngneers-controls-stepper.d.ts +68 -0
  110. package/types/ngneers-controls-table.d.ts +273 -169
  111. package/types/ngneers-controls-toast.d.ts +14 -0
  112. package/types/ngneers-controls-tooltip.d.ts +0 -1
  113. package/types/ngneers-controls-tree.d.ts +14 -0
  114. package/types/ngneers-controls-upload.d.ts +14 -0
  115. package/types/ngneers-controls-utils.d.ts +27 -2
@@ -317,11 +317,11 @@ class NgnTabs extends TabsTemplates {
317
317
  }
318
318
  }
319
319
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnTabs, deps: [], target: i0.ɵɵFactoryTarget.Component });
320
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnTabs, isStandalone: true, selector: "ngn-tabs", inputs: { lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null }, activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null }, iconScrollLeft: { classPropertyName: "iconScrollLeft", publicName: "iconScrollLeft", isSignal: true, isRequired: false, transformFunction: null }, iconScrollRight: { classPropertyName: "iconScrollRight", publicName: "iconScrollRight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeTab: "activeTabChange" }, providers: [provideSelf(NgnTabs)], queries: [{ propertyName: "_tabs", predicate: NgnTab, isSignal: true }], viewQueries: [{ propertyName: "_tabList", first: true, predicate: ["tabList"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_tabListScrollDirective", first: true, predicate: ["tabList"], descendants: true, read: NgnScrollAmount, isSignal: true }, { propertyName: "_renderedTabHeaders", predicate: ["tabHeader"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\n <div\n ngnScrollAmount\n ngnDragScroll\n #tabList\n role=\"tablist\"\n [ptInt]=\"this\"\n [ptClass]=\"'headers'\"\n [id]=\"elementId + '_tablist'\"\n >\n @if (tabsOverflowingLeft()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-left'\"\n (click)=\"scrollHeaders('left')\"\n >\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'tabs-scroll-left'\" />\n </button>\n }\n\n @for (header of headers(); track header.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [aria-selected]=\"header.id === activeTab()\"\n [id]=\"elementId + '_tab_' + header.id\"\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\n (keydown)=\"handleTabKeyPress($event, header.id)\"\n #tabHeader\n [ptInt]=\"this\"\n [ptClass]=\"{\n header: true,\n 'header-active': header.id === activeTab(),\n }\"\n (click)=\"selectTab(header.id)\"\n >\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\n </button>\n }\n @if (tabsOverflowingRight()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-right'\"\n (click)=\"scrollHeaders('right')\"\n >\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'tabs-scroll-right'\" />\n </button>\n }\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'header-active-indicator'\"\n [style.width.px]=\"indicatorWidth()\"\n [style.left.px]=\"indicatorLeft()\"\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\n ></div>\n </div>\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\n</div>\n@for (content of contents(); track content.id; let i = $index) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: content.id === activeTab() }\"\n [id]=\"elementId + '_tabpanel_' + content.id\"\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\n >\n <ngn-defer\n [lazyContent]=\"content.template\"\n [open]=\"content.id === activeTab()\"\n [cache]=\"cache()\"\n [lazy]=\"lazy()\"\n />\n </div>\n}\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }, { kind: "directive", type: NgnScrollAmount, selector: "[ngnScrollAmount]", inputs: ["ngnScrollAmountContainer"] }, { kind: "directive", type: NgnDragScroll, selector: "[ngnDragScroll]" }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }] });
320
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnTabs, isStandalone: true, selector: "ngn-tabs", inputs: { lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null }, activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null }, iconScrollLeft: { classPropertyName: "iconScrollLeft", publicName: "iconScrollLeft", isSignal: true, isRequired: false, transformFunction: null }, iconScrollRight: { classPropertyName: "iconScrollRight", publicName: "iconScrollRight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeTab: "activeTabChange" }, providers: [provideSelf(NgnTabs)], queries: [{ propertyName: "_tabs", predicate: NgnTab, isSignal: true }], viewQueries: [{ propertyName: "_tabList", first: true, predicate: ["tabList"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_tabListScrollDirective", first: true, predicate: ["tabList"], descendants: true, read: NgnScrollAmount, isSignal: true }, { propertyName: "_renderedTabHeaders", predicate: ["tabHeader"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\n <div\n ngnScrollAmount\n ngnDragScroll\n #tabList\n role=\"tablist\"\n [ptInt]=\"this\"\n [ptClass]=\"'headers'\"\n [id]=\"elementId + '_tablist'\"\n >\n @if (tabsOverflowingLeft()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-left'\"\n (click)=\"scrollHeaders('left')\"\n >\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'tabs-scroll-left'\" />\n </button>\n }\n\n @for (header of headers(); track header.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [aria-selected]=\"header.id === activeTab()\"\n [id]=\"elementId + '_tab_' + header.id\"\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\n (keydown)=\"handleTabKeyPress($event, header.id)\"\n #tabHeader\n [ptInt]=\"this\"\n [ptClass]=\"{\n header: true,\n 'header-active': header.id === activeTab(),\n }\"\n (click)=\"selectTab(header.id)\"\n >\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\n </button>\n }\n @if (tabsOverflowingRight()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-right'\"\n (click)=\"scrollHeaders('right')\"\n >\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'tabs-scroll-right'\" />\n </button>\n }\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'header-active-indicator'\"\n [style.width.px]=\"indicatorWidth()\"\n [style.left.px]=\"indicatorLeft()\"\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\n ></div>\n </div>\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\n</div>\n@for (content of contents(); track content.id; let i = $index) {\n @if (content.template) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: content.id === activeTab() }\"\n [id]=\"elementId + '_tabpanel_' + content.id\"\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\n >\n <ngn-defer\n [lazyContent]=\"content.template\"\n [open]=\"content.id === activeTab()\"\n [cache]=\"cache()\"\n [lazy]=\"lazy()\"\n />\n </div>\n }\n}\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }, { kind: "directive", type: NgnScrollAmount, selector: "[ngnScrollAmount]", inputs: ["ngnScrollAmountContainer", "ngnScrollAmountEndThreshold"], outputs: ["endReached"] }, { kind: "directive", type: NgnDragScroll, selector: "[ngnDragScroll]" }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }] });
321
321
  }
322
322
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnTabs, decorators: [{
323
323
  type: Component,
324
- args: [{ selector: 'ngn-tabs', imports: [NgTemplateOutlet, NgnPt, NgnDefer, NgnScrollAmount, NgnDragScroll, NgnIcon], providers: [provideSelf(NgnTabs)], template: "<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\n <div\n ngnScrollAmount\n ngnDragScroll\n #tabList\n role=\"tablist\"\n [ptInt]=\"this\"\n [ptClass]=\"'headers'\"\n [id]=\"elementId + '_tablist'\"\n >\n @if (tabsOverflowingLeft()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-left'\"\n (click)=\"scrollHeaders('left')\"\n >\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'tabs-scroll-left'\" />\n </button>\n }\n\n @for (header of headers(); track header.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [aria-selected]=\"header.id === activeTab()\"\n [id]=\"elementId + '_tab_' + header.id\"\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\n (keydown)=\"handleTabKeyPress($event, header.id)\"\n #tabHeader\n [ptInt]=\"this\"\n [ptClass]=\"{\n header: true,\n 'header-active': header.id === activeTab(),\n }\"\n (click)=\"selectTab(header.id)\"\n >\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\n </button>\n }\n @if (tabsOverflowingRight()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-right'\"\n (click)=\"scrollHeaders('right')\"\n >\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'tabs-scroll-right'\" />\n </button>\n }\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'header-active-indicator'\"\n [style.width.px]=\"indicatorWidth()\"\n [style.left.px]=\"indicatorLeft()\"\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\n ></div>\n </div>\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\n</div>\n@for (content of contents(); track content.id; let i = $index) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: content.id === activeTab() }\"\n [id]=\"elementId + '_tabpanel_' + content.id\"\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\n >\n <ngn-defer\n [lazyContent]=\"content.template\"\n [open]=\"content.id === activeTab()\"\n [cache]=\"cache()\"\n [lazy]=\"lazy()\"\n />\n </div>\n}\n" }]
324
+ args: [{ selector: 'ngn-tabs', imports: [NgTemplateOutlet, NgnPt, NgnDefer, NgnScrollAmount, NgnDragScroll, NgnIcon], providers: [provideSelf(NgnTabs)], template: "<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\n <div\n ngnScrollAmount\n ngnDragScroll\n #tabList\n role=\"tablist\"\n [ptInt]=\"this\"\n [ptClass]=\"'headers'\"\n [id]=\"elementId + '_tablist'\"\n >\n @if (tabsOverflowingLeft()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-left'\"\n (click)=\"scrollHeaders('left')\"\n >\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'tabs-scroll-left'\" />\n </button>\n }\n\n @for (header of headers(); track header.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [aria-selected]=\"header.id === activeTab()\"\n [id]=\"elementId + '_tab_' + header.id\"\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\n (keydown)=\"handleTabKeyPress($event, header.id)\"\n #tabHeader\n [ptInt]=\"this\"\n [ptClass]=\"{\n header: true,\n 'header-active': header.id === activeTab(),\n }\"\n (click)=\"selectTab(header.id)\"\n >\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\n </button>\n }\n @if (tabsOverflowingRight()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-right'\"\n (click)=\"scrollHeaders('right')\"\n >\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'tabs-scroll-right'\" />\n </button>\n }\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'header-active-indicator'\"\n [style.width.px]=\"indicatorWidth()\"\n [style.left.px]=\"indicatorLeft()\"\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\n ></div>\n </div>\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\n</div>\n@for (content of contents(); track content.id; let i = $index) {\n @if (content.template) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: content.id === activeTab() }\"\n [id]=\"elementId + '_tabpanel_' + content.id\"\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\n >\n <ngn-defer\n [lazyContent]=\"content.template\"\n [open]=\"content.id === activeTab()\"\n [cache]=\"cache()\"\n [lazy]=\"lazy()\"\n />\n </div>\n }\n}\n" }]
325
325
  }], ctorParameters: () => [], propDecorators: { lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }], activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: false }] }, { type: i0.Output, args: ["activeTabChange"] }], iconScrollLeft: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconScrollLeft", required: false }] }], iconScrollRight: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconScrollRight", required: false }] }], _tabs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgnTab), { isSignal: true }] }], _tabList: [{ type: i0.ViewChild, args: ['tabList', { ...{
326
326
  read: (ElementRef),
327
327
  }, isSignal: true }] }], _tabListScrollDirective: [{ type: i0.ViewChild, args: ['tabList', { ...{
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-tabs.mjs","sources":["../../src/tabs/tab.ts","../../src/tabs/tabs-templates.ts","../../src/tabs/tabs.ts","../../src/tabs/tabs.html","../../src/tabs/ngneers-controls-tabs.ts"],"sourcesContent":["import {\n afterRenderEffect,\n Component,\n contentChild,\n input,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-tab',\n imports: [],\n template: '',\n\n providers: [provideSelf(NgnTab)],\n})\nexport class NgnTab extends NgnBase<'tabs'> {\n protected readonly theme = null;\n /**\n * The unique identifier for the tab.\n */\n public readonly tabId = input.required<string>();\n\n /**\n * Useful for accessing the {@link tabId} in a safe way, without worrying about timing.\n */\n public readonly safeTabId = signal<string | null>(null);\n\n public readonly content = contentChild<TemplateRef<unknown>>('content');\n public readonly header = contentChild<TemplateRef<unknown>>('header');\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n this.safeTabId.set(this.tabId());\n });\n }\n}\n","import { computed, contentChild, Directive, input, TemplateRef } from '@angular/core';\nimport { NgnBase } from '@ngneers/controls/base';\n\n@Directive()\nexport abstract class TabsTemplates extends NgnBase<'tabs'> {\n // Header left template\n private readonly _userHeaderLeftTemplate = contentChild<TemplateRef<unknown>>('headerLeft');\n /**\n * Set a custom template for the left side of the tabs header.\n * Can also be set using an `<ng-template>` element with `#headerLeft` template reference variable.\n */\n public readonly templateHeaderLeft = input<TemplateRef<unknown> | null>(null);\n protected readonly headerLeftTemplate = computed(\n () => this._userHeaderLeftTemplate() ?? this.templateHeaderLeft()\n );\n\n // Header right template\n private readonly _userHeaderRightTemplate = contentChild<TemplateRef<unknown>>('headerRight');\n /**\n * Set a custom template for the right side of the tabs header.\n * Can also be set using an `<ng-template>` element with `#headerRight` template reference variable.\n */\n public readonly templateHeaderRight = input<TemplateRef<unknown> | null>(null);\n protected readonly headerRightTemplate = computed(\n () => this._userHeaderRightTemplate() ?? this.templateHeaderRight()\n );\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n type AfterViewInit,\n booleanAttribute,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { elementSizeSignal, elementsSizesSignal, Platform } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnDefer } from '@ngneers/controls/defer';\nimport { NgnDragScroll, NgnScrollAmount } from '@ngneers/controls/directives';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnError } from '@ngneers/controls/utils';\nimport { generateElementId } from '@ngneers/controls/utils-ng';\nimport { tabsControlTemplate } from '@ngneers/controls-themes/templates/tabs';\n\nimport { NgnTab } from './tab';\nimport { TabsTemplates } from './tabs-templates';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\nconst PADDING_FOR_STICKY_ELEMENTS = 15;\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-tabs',\n imports: [NgTemplateOutlet, NgnPt, NgnDefer, NgnScrollAmount, NgnDragScroll, NgnIcon],\n templateUrl: './tabs.html',\n\n providers: [provideSelf(NgnTabs)],\n})\nexport class NgnTabs extends TabsTemplates implements AfterViewInit {\n protected readonly theme = this.injectThemeTemplate(tabsControlTemplate, 'root');\n /**\n * Whether to lazy load the tab contents when they become visible.\n * @default false\n */\n public readonly lazy = input(false, { transform: booleanAttribute });\n /**\n * Whether to cache the tab contents. Only applies to {@link lazy} loaded tabs.\n * @default false\n */\n public readonly cache = input(false, { transform: booleanAttribute });\n /**\n * Get or set the active tab ID.\n */\n public readonly activeTab = model<string>('');\n /**\n * Icon for the left scroll button.\n */\n public readonly iconScrollLeft = input<IconType>();\n /**\n * Icon for the right scroll button.\n */\n public readonly iconScrollRight = input<IconType>();\n\n protected readonly isFirstRender = signal(true);\n\n protected readonly elementId = generateElementId();\n protected readonly indicatorWidth = signal(0);\n protected readonly indicatorLeft = signal(0);\n\n private readonly _tabs = contentChildren(NgnTab);\n private readonly _tabList = viewChild.required<unknown, ElementRef<HTMLDivElement>>('tabList', {\n read: ElementRef<HTMLDivElement>,\n });\n private readonly _tabListScrollDirective = viewChild.required('tabList', {\n read: NgnScrollAmount,\n });\n private readonly _tabListScroll = computed(() => this._tabListScrollDirective().scrollLeft());\n private readonly _tabListSize = elementSizeSignal(this._tabList);\n\n private readonly _renderedTabHeaders = viewChildren<ElementRef<HTMLButtonElement>>('tabHeader');\n private readonly _headerElements = computed(() =>\n this._renderedTabHeaders().map(header => header.nativeElement)\n );\n private readonly _headerSizes = elementsSizesSignal(this._headerElements);\n\n protected readonly headers = computed(() =>\n this._tabs().map(tab => ({\n id: tab.tabId(),\n template: tab.header(),\n }))\n );\n\n protected readonly contents = computed(() =>\n this._tabs().map(tab => ({\n id: tab.tabId(),\n template: tab.content(),\n }))\n );\n\n /**\n * Inter-header gap (theme-defined — e.g. shade renders the header row as a padded tray with a\n * `gap` between pills). Read from the resolved column-gap and re-evaluated whenever the list\n * resizes or its header set changes (covers theme swaps). Included in the width math below so\n * overflow detection isn't thrown off by the spacing between headers.\n */\n private readonly _platform = inject(Platform);\n private readonly _headerGap = computed(() => {\n // getComputedStyle is browser-only; on the server there is no layout, so the gap is irrelevant.\n if (!this._platform.isBrowser) {\n return 0;\n }\n this._tabListSize();\n this._headerSizes();\n const gap = parseFloat(getComputedStyle(this._tabList().nativeElement).columnGap);\n return Number.isFinite(gap) ? gap : 0;\n });\n\n private readonly _totalTabsWidth = computed(() => {\n const sizes = this._headerSizes();\n const totalWidth = sizes.reduce((sum, size) => sum + size.width, 0);\n // Gaps sit between headers: N headers → N-1 gaps. Without this the summed header widths\n // under-report the real scroll width and the right arrow hides while content still overflows.\n return totalWidth + this._headerGap() * Math.max(0, sizes.length - 1);\n });\n\n protected readonly tabsOverflowingRight = computed(() => {\n const tabListWidth = this._tabListSize().width;\n const scrollAmount = this._tabListScroll();\n // Use the signal-tracked total width instead of reading scrollWidth\n // directly, which would force a synchronous layout.\n const totalHeadersWidth = this._totalTabsWidth();\n\n return totalHeadersWidth - scrollAmount > tabListWidth + 0.5;\n });\n\n protected readonly tabsOverflowingLeft = computed(() => this._tabListScroll() > 0);\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n if (!this.activeTab() || !this._tabs().find(tab => tab.safeTabId() === this.activeTab())) {\n this.activeTab.set(this._tabs()[0]?.tabId() ?? '');\n }\n });\n\n effect(() => {\n const activeTabIndex = this._tabs().findIndex(tab => tab.safeTabId() === this.activeTab());\n\n const headersizes = this._headerSizes();\n const headerSizesBeforeActive = headersizes\n .slice(0, activeTabIndex)\n .map(size => size.width)\n .reduce((partialSum, a) => partialSum + a, 0);\n\n this.indicatorWidth.set(headersizes[activeTabIndex]?.width ?? 0);\n this.indicatorLeft.set(headerSizesBeforeActive);\n });\n }\n\n public ngAfterViewInit() {\n if (!this.activeTab()) {\n this.activeTab.set(this._tabs()[0]?.tabId() ?? '');\n }\n setTimeout(() => {\n this.isFirstRender.set(false);\n });\n }\n\n protected selectTab(tabId: string) {\n this.activeTab.set(tabId);\n this.ensureTabHeaderIsScrolledIntoView(\n this._tabs().findIndex(tab => tab.safeTabId() === tabId)\n );\n }\n\n protected handleTabKeyPress(event: KeyboardEvent, tabId: string) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectTab(tabId);\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n event.preventDefault();\n\n const focussedTabElement = this._headerElements().findIndex(\n element => element === document.activeElement\n );\n\n const indexOfCurrentTab =\n focussedTabElement !== -1\n ? focussedTabElement\n : this._tabs().findIndex(tab => tab.safeTabId() === tabId);\n if (indexOfCurrentTab === -1) {\n return;\n }\n\n const nextIndex = event.key === 'ArrowRight' ? indexOfCurrentTab + 1 : indexOfCurrentTab - 1;\n // overflow\n const safeNextIndex = (nextIndex + this._tabs().length) % this._tabs().length;\n\n this.ensureTabHeaderIsScrolledIntoView(safeNextIndex);\n\n const tabElement = document.getElementById(\n `${this.elementId}_tab_${this._tabs()[safeNextIndex]?.safeTabId()}`\n ) as HTMLElement;\n if (tabElement) {\n tabElement.focus();\n }\n }\n }\n\n private ensureTabHeaderIsScrolledIntoView(index: number) {\n const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } =\n this.getCutOffTabHeaders();\n const tablistElement = this._tabList().nativeElement;\n if (index <= leftCutOffTabHeaderIndex) {\n const newScrollLeft = this.calculateHeaderSliceWidth(0, index) - PADDING_FOR_STICKY_ELEMENTS;\n setTimeout(() => {\n tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\n });\n } else if (index >= rightCutOffTabHeaderIndex && rightCutOffTabHeaderIndex >= 0) {\n const rightCutOffHeader = this._headerSizes()[rightCutOffTabHeaderIndex];\n if (!rightCutOffHeader) {\n throw new NgnError(\n 'NgnTabs',\n `Right cut off header is undefined for index ${rightCutOffTabHeaderIndex}`\n );\n }\n const newScrollLeft =\n this.calculateHeaderSliceWidth(0, index) -\n this._tabListSize().width +\n rightCutOffHeader.width +\n PADDING_FOR_STICKY_ELEMENTS;\n setTimeout(() => {\n tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\n });\n }\n }\n\n private calculateHeaderSliceWidth(fromIndex: number, toIndex: number) {\n const headers = this._headerSizes().map(s => s.width);\n return headers.slice(fromIndex, toIndex).reduce((a, b) => a + b, 0);\n }\n\n private getCutOffTabHeaders() {\n const headers = this._headerSizes().map(s => s.width);\n const tabListElement = this._tabList().nativeElement;\n\n const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding\n\n const scrollAmount = this._tabListScroll();\n let leftCutOffTabHeaderIndex = -1;\n let rightCutOffTabHeaderIndex = -1;\n let cumulativeWidth = PADDING_FOR_STICKY_ELEMENTS; // account for left padding\n\n headers.forEach(header => {\n for (let i = 0; i < headers.length; i++) {\n const headerStart = cumulativeWidth;\n const headerEnd = cumulativeWidth + header;\n cumulativeWidth = headerEnd;\n\n if (leftCutOffTabHeaderIndex === -1 && headerEnd > scrollAmount) {\n leftCutOffTabHeaderIndex = i;\n }\n if (\n rightCutOffTabHeaderIndex === -1 &&\n headerStart < scrollAmount + tabListWidth &&\n headerEnd > scrollAmount + tabListWidth\n ) {\n rightCutOffTabHeaderIndex = i;\n }\n }\n });\n return {\n left: leftCutOffTabHeaderIndex,\n right: rightCutOffTabHeaderIndex,\n };\n }\n\n protected scrollHeaders(direction: 'left' | 'right') {\n const tabListElement = this._tabList().nativeElement;\n const headers = this._headerSizes().map(s => s.width);\n\n const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding\n\n const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } =\n this.getCutOffTabHeaders();\n\n if (direction === 'right') {\n const newScrollAmount = this.calculateHeaderSliceWidth(0, rightCutOffTabHeaderIndex);\n\n const scrollAmountFixed =\n newScrollAmount >= tabListElement.scrollWidth\n ? newScrollAmount\n : newScrollAmount - PADDING_FOR_STICKY_ELEMENTS;\n tabListElement.scrollTo({ left: scrollAmountFixed, behavior: 'smooth' });\n } else {\n let usedUpSpace = 0;\n let indexOfFirstVisibleTab = leftCutOffTabHeaderIndex;\n while (\n usedUpSpace < tabListWidth - PADDING_FOR_STICKY_ELEMENTS * 2 &&\n indexOfFirstVisibleTab >= 0\n ) {\n usedUpSpace += headers[indexOfFirstVisibleTab] ?? 0;\n indexOfFirstVisibleTab--;\n }\n\n const scrollTo =\n indexOfFirstVisibleTab < 0\n ? 0\n : headers.slice(0, indexOfFirstVisibleTab + 2).reduce((a, b) => a + b, 0) -\n PADDING_FOR_STICKY_ELEMENTS;\n\n tabListElement.scrollTo({ left: scrollTo, behavior: 'smooth' });\n }\n }\n}\n","<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\n <div\n ngnScrollAmount\n ngnDragScroll\n #tabList\n role=\"tablist\"\n [ptInt]=\"this\"\n [ptClass]=\"'headers'\"\n [id]=\"elementId + '_tablist'\"\n >\n @if (tabsOverflowingLeft()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-left'\"\n (click)=\"scrollHeaders('left')\"\n >\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'tabs-scroll-left'\" />\n </button>\n }\n\n @for (header of headers(); track header.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [aria-selected]=\"header.id === activeTab()\"\n [id]=\"elementId + '_tab_' + header.id\"\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\n (keydown)=\"handleTabKeyPress($event, header.id)\"\n #tabHeader\n [ptInt]=\"this\"\n [ptClass]=\"{\n header: true,\n 'header-active': header.id === activeTab(),\n }\"\n (click)=\"selectTab(header.id)\"\n >\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\n </button>\n }\n @if (tabsOverflowingRight()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-right'\"\n (click)=\"scrollHeaders('right')\"\n >\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'tabs-scroll-right'\" />\n </button>\n }\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'header-active-indicator'\"\n [style.width.px]=\"indicatorWidth()\"\n [style.left.px]=\"indicatorLeft()\"\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\n ></div>\n </div>\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\n</div>\n@for (content of contents(); track content.id; let i = $index) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: content.id === activeTab() }\"\n [id]=\"elementId + '_tabpanel_' + content.id\"\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\n >\n <ngn-defer\n [lazyContent]=\"content.template\"\n [open]=\"content.id === activeTab()\"\n [cache]=\"cache()\"\n [lazy]=\"lazy()\"\n />\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-tabs.mjs","sources":["../../src/tabs/tab.ts","../../src/tabs/tabs-templates.ts","../../src/tabs/tabs.ts","../../src/tabs/tabs.html","../../src/tabs/ngneers-controls-tabs.ts"],"sourcesContent":["import {\n afterRenderEffect,\n Component,\n contentChild,\n input,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-tab',\n imports: [],\n template: '',\n\n providers: [provideSelf(NgnTab)],\n})\nexport class NgnTab extends NgnBase<'tabs'> {\n protected readonly theme = null;\n /**\n * The unique identifier for the tab.\n */\n public readonly tabId = input.required<string>();\n\n /**\n * Useful for accessing the {@link tabId} in a safe way, without worrying about timing.\n */\n public readonly safeTabId = signal<string | null>(null);\n\n public readonly content = contentChild<TemplateRef<unknown>>('content');\n public readonly header = contentChild<TemplateRef<unknown>>('header');\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n this.safeTabId.set(this.tabId());\n });\n }\n}\n","import { computed, contentChild, Directive, input, TemplateRef } from '@angular/core';\nimport { NgnBase } from '@ngneers/controls/base';\n\n@Directive()\nexport abstract class TabsTemplates extends NgnBase<'tabs'> {\n // Header left template\n private readonly _userHeaderLeftTemplate = contentChild<TemplateRef<unknown>>('headerLeft');\n /**\n * Set a custom template for the left side of the tabs header.\n * Can also be set using an `<ng-template>` element with `#headerLeft` template reference variable.\n */\n public readonly templateHeaderLeft = input<TemplateRef<unknown> | null>(null);\n protected readonly headerLeftTemplate = computed(\n () => this._userHeaderLeftTemplate() ?? this.templateHeaderLeft()\n );\n\n // Header right template\n private readonly _userHeaderRightTemplate = contentChild<TemplateRef<unknown>>('headerRight');\n /**\n * Set a custom template for the right side of the tabs header.\n * Can also be set using an `<ng-template>` element with `#headerRight` template reference variable.\n */\n public readonly templateHeaderRight = input<TemplateRef<unknown> | null>(null);\n protected readonly headerRightTemplate = computed(\n () => this._userHeaderRightTemplate() ?? this.templateHeaderRight()\n );\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n type AfterViewInit,\n booleanAttribute,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { elementSizeSignal, elementsSizesSignal, Platform } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnDefer } from '@ngneers/controls/defer';\nimport { NgnDragScroll, NgnScrollAmount } from '@ngneers/controls/directives';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnError } from '@ngneers/controls/utils';\nimport { generateElementId } from '@ngneers/controls/utils-ng';\nimport { tabsControlTemplate } from '@ngneers/controls-themes/templates/tabs';\n\nimport { NgnTab } from './tab';\nimport { TabsTemplates } from './tabs-templates';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\nconst PADDING_FOR_STICKY_ELEMENTS = 15;\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-tabs',\n imports: [NgTemplateOutlet, NgnPt, NgnDefer, NgnScrollAmount, NgnDragScroll, NgnIcon],\n templateUrl: './tabs.html',\n\n providers: [provideSelf(NgnTabs)],\n})\nexport class NgnTabs extends TabsTemplates implements AfterViewInit {\n protected readonly theme = this.injectThemeTemplate(tabsControlTemplate, 'root');\n /**\n * Whether to lazy load the tab contents when they become visible.\n * @default false\n */\n public readonly lazy = input(false, { transform: booleanAttribute });\n /**\n * Whether to cache the tab contents. Only applies to {@link lazy} loaded tabs.\n * @default false\n */\n public readonly cache = input(false, { transform: booleanAttribute });\n /**\n * Get or set the active tab ID.\n */\n public readonly activeTab = model<string>('');\n /**\n * Icon for the left scroll button.\n */\n public readonly iconScrollLeft = input<IconType>();\n /**\n * Icon for the right scroll button.\n */\n public readonly iconScrollRight = input<IconType>();\n\n protected readonly isFirstRender = signal(true);\n\n protected readonly elementId = generateElementId();\n protected readonly indicatorWidth = signal(0);\n protected readonly indicatorLeft = signal(0);\n\n private readonly _tabs = contentChildren(NgnTab);\n private readonly _tabList = viewChild.required<unknown, ElementRef<HTMLDivElement>>('tabList', {\n read: ElementRef<HTMLDivElement>,\n });\n private readonly _tabListScrollDirective = viewChild.required('tabList', {\n read: NgnScrollAmount,\n });\n private readonly _tabListScroll = computed(() => this._tabListScrollDirective().scrollLeft());\n private readonly _tabListSize = elementSizeSignal(this._tabList);\n\n private readonly _renderedTabHeaders = viewChildren<ElementRef<HTMLButtonElement>>('tabHeader');\n private readonly _headerElements = computed(() =>\n this._renderedTabHeaders().map(header => header.nativeElement)\n );\n private readonly _headerSizes = elementsSizesSignal(this._headerElements);\n\n protected readonly headers = computed(() =>\n this._tabs().map(tab => ({\n id: tab.tabId(),\n template: tab.header(),\n }))\n );\n\n protected readonly contents = computed(() =>\n this._tabs().map(tab => ({\n id: tab.tabId(),\n template: tab.content(),\n }))\n );\n\n /**\n * Inter-header gap (theme-defined — e.g. shade renders the header row as a padded tray with a\n * `gap` between pills). Read from the resolved column-gap and re-evaluated whenever the list\n * resizes or its header set changes (covers theme swaps). Included in the width math below so\n * overflow detection isn't thrown off by the spacing between headers.\n */\n private readonly _platform = inject(Platform);\n private readonly _headerGap = computed(() => {\n // getComputedStyle is browser-only; on the server there is no layout, so the gap is irrelevant.\n if (!this._platform.isBrowser) {\n return 0;\n }\n this._tabListSize();\n this._headerSizes();\n const gap = parseFloat(getComputedStyle(this._tabList().nativeElement).columnGap);\n return Number.isFinite(gap) ? gap : 0;\n });\n\n private readonly _totalTabsWidth = computed(() => {\n const sizes = this._headerSizes();\n const totalWidth = sizes.reduce((sum, size) => sum + size.width, 0);\n // Gaps sit between headers: N headers → N-1 gaps. Without this the summed header widths\n // under-report the real scroll width and the right arrow hides while content still overflows.\n return totalWidth + this._headerGap() * Math.max(0, sizes.length - 1);\n });\n\n protected readonly tabsOverflowingRight = computed(() => {\n const tabListWidth = this._tabListSize().width;\n const scrollAmount = this._tabListScroll();\n // Use the signal-tracked total width instead of reading scrollWidth\n // directly, which would force a synchronous layout.\n const totalHeadersWidth = this._totalTabsWidth();\n\n return totalHeadersWidth - scrollAmount > tabListWidth + 0.5;\n });\n\n protected readonly tabsOverflowingLeft = computed(() => this._tabListScroll() > 0);\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n if (!this.activeTab() || !this._tabs().find(tab => tab.safeTabId() === this.activeTab())) {\n this.activeTab.set(this._tabs()[0]?.tabId() ?? '');\n }\n });\n\n effect(() => {\n const activeTabIndex = this._tabs().findIndex(tab => tab.safeTabId() === this.activeTab());\n\n const headersizes = this._headerSizes();\n const headerSizesBeforeActive = headersizes\n .slice(0, activeTabIndex)\n .map(size => size.width)\n .reduce((partialSum, a) => partialSum + a, 0);\n\n this.indicatorWidth.set(headersizes[activeTabIndex]?.width ?? 0);\n this.indicatorLeft.set(headerSizesBeforeActive);\n });\n }\n\n public ngAfterViewInit() {\n if (!this.activeTab()) {\n this.activeTab.set(this._tabs()[0]?.tabId() ?? '');\n }\n setTimeout(() => {\n this.isFirstRender.set(false);\n });\n }\n\n protected selectTab(tabId: string) {\n this.activeTab.set(tabId);\n this.ensureTabHeaderIsScrolledIntoView(\n this._tabs().findIndex(tab => tab.safeTabId() === tabId)\n );\n }\n\n protected handleTabKeyPress(event: KeyboardEvent, tabId: string) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectTab(tabId);\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n event.preventDefault();\n\n const focussedTabElement = this._headerElements().findIndex(\n element => element === document.activeElement\n );\n\n const indexOfCurrentTab =\n focussedTabElement !== -1\n ? focussedTabElement\n : this._tabs().findIndex(tab => tab.safeTabId() === tabId);\n if (indexOfCurrentTab === -1) {\n return;\n }\n\n const nextIndex = event.key === 'ArrowRight' ? indexOfCurrentTab + 1 : indexOfCurrentTab - 1;\n // overflow\n const safeNextIndex = (nextIndex + this._tabs().length) % this._tabs().length;\n\n this.ensureTabHeaderIsScrolledIntoView(safeNextIndex);\n\n const tabElement = document.getElementById(\n `${this.elementId}_tab_${this._tabs()[safeNextIndex]?.safeTabId()}`\n ) as HTMLElement;\n if (tabElement) {\n tabElement.focus();\n }\n }\n }\n\n private ensureTabHeaderIsScrolledIntoView(index: number) {\n const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } =\n this.getCutOffTabHeaders();\n const tablistElement = this._tabList().nativeElement;\n if (index <= leftCutOffTabHeaderIndex) {\n const newScrollLeft = this.calculateHeaderSliceWidth(0, index) - PADDING_FOR_STICKY_ELEMENTS;\n setTimeout(() => {\n tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\n });\n } else if (index >= rightCutOffTabHeaderIndex && rightCutOffTabHeaderIndex >= 0) {\n const rightCutOffHeader = this._headerSizes()[rightCutOffTabHeaderIndex];\n if (!rightCutOffHeader) {\n throw new NgnError(\n 'NgnTabs',\n `Right cut off header is undefined for index ${rightCutOffTabHeaderIndex}`\n );\n }\n const newScrollLeft =\n this.calculateHeaderSliceWidth(0, index) -\n this._tabListSize().width +\n rightCutOffHeader.width +\n PADDING_FOR_STICKY_ELEMENTS;\n setTimeout(() => {\n tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\n });\n }\n }\n\n private calculateHeaderSliceWidth(fromIndex: number, toIndex: number) {\n const headers = this._headerSizes().map(s => s.width);\n return headers.slice(fromIndex, toIndex).reduce((a, b) => a + b, 0);\n }\n\n private getCutOffTabHeaders() {\n const headers = this._headerSizes().map(s => s.width);\n const tabListElement = this._tabList().nativeElement;\n\n const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding\n\n const scrollAmount = this._tabListScroll();\n let leftCutOffTabHeaderIndex = -1;\n let rightCutOffTabHeaderIndex = -1;\n let cumulativeWidth = PADDING_FOR_STICKY_ELEMENTS; // account for left padding\n\n headers.forEach(header => {\n for (let i = 0; i < headers.length; i++) {\n const headerStart = cumulativeWidth;\n const headerEnd = cumulativeWidth + header;\n cumulativeWidth = headerEnd;\n\n if (leftCutOffTabHeaderIndex === -1 && headerEnd > scrollAmount) {\n leftCutOffTabHeaderIndex = i;\n }\n if (\n rightCutOffTabHeaderIndex === -1 &&\n headerStart < scrollAmount + tabListWidth &&\n headerEnd > scrollAmount + tabListWidth\n ) {\n rightCutOffTabHeaderIndex = i;\n }\n }\n });\n return {\n left: leftCutOffTabHeaderIndex,\n right: rightCutOffTabHeaderIndex,\n };\n }\n\n protected scrollHeaders(direction: 'left' | 'right') {\n const tabListElement = this._tabList().nativeElement;\n const headers = this._headerSizes().map(s => s.width);\n\n const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding\n\n const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } =\n this.getCutOffTabHeaders();\n\n if (direction === 'right') {\n const newScrollAmount = this.calculateHeaderSliceWidth(0, rightCutOffTabHeaderIndex);\n\n const scrollAmountFixed =\n newScrollAmount >= tabListElement.scrollWidth\n ? newScrollAmount\n : newScrollAmount - PADDING_FOR_STICKY_ELEMENTS;\n tabListElement.scrollTo({ left: scrollAmountFixed, behavior: 'smooth' });\n } else {\n let usedUpSpace = 0;\n let indexOfFirstVisibleTab = leftCutOffTabHeaderIndex;\n while (\n usedUpSpace < tabListWidth - PADDING_FOR_STICKY_ELEMENTS * 2 &&\n indexOfFirstVisibleTab >= 0\n ) {\n usedUpSpace += headers[indexOfFirstVisibleTab] ?? 0;\n indexOfFirstVisibleTab--;\n }\n\n const scrollTo =\n indexOfFirstVisibleTab < 0\n ? 0\n : headers.slice(0, indexOfFirstVisibleTab + 2).reduce((a, b) => a + b, 0) -\n PADDING_FOR_STICKY_ELEMENTS;\n\n tabListElement.scrollTo({ left: scrollTo, behavior: 'smooth' });\n }\n }\n}\n","<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\n <div\n ngnScrollAmount\n ngnDragScroll\n #tabList\n role=\"tablist\"\n [ptInt]=\"this\"\n [ptClass]=\"'headers'\"\n [id]=\"elementId + '_tablist'\"\n >\n @if (tabsOverflowingLeft()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-left'\"\n (click)=\"scrollHeaders('left')\"\n >\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'tabs-scroll-left'\" />\n </button>\n }\n\n @for (header of headers(); track header.id; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [aria-selected]=\"header.id === activeTab()\"\n [id]=\"elementId + '_tab_' + header.id\"\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\n (keydown)=\"handleTabKeyPress($event, header.id)\"\n #tabHeader\n [ptInt]=\"this\"\n [ptClass]=\"{\n header: true,\n 'header-active': header.id === activeTab(),\n }\"\n (click)=\"selectTab(header.id)\"\n >\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\n </button>\n }\n @if (tabsOverflowingRight()) {\n <button\n tabindex=\"-1\"\n [ptInt]=\"this\"\n [ptClass]=\"'scroll-right'\"\n (click)=\"scrollHeaders('right')\"\n >\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'tabs-scroll-right'\" />\n </button>\n }\n <div\n [ptInt]=\"this\"\n [ptClass]=\"'header-active-indicator'\"\n [style.width.px]=\"indicatorWidth()\"\n [style.left.px]=\"indicatorLeft()\"\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\n ></div>\n </div>\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\n</div>\n@for (content of contents(); track content.id; let i = $index) {\n @if (content.template) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: content.id === activeTab() }\"\n [id]=\"elementId + '_tabpanel_' + content.id\"\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\n >\n <ngn-defer\n [lazyContent]=\"content.template\"\n [open]=\"content.id === activeTab()\"\n [cache]=\"cache()\"\n [lazy]=\"lazy()\"\n />\n </div>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ class NgnToggleButton extends ValueControlBase {
11
11
  theme = this.injectThemeTemplate(toggleButtonControlTemplate, {
12
12
  root: true,
13
13
  active: () => this.value(),
14
- invalid: () => this.invalid(),
14
+ invalid: () => this.invalidState(),
15
15
  });
16
16
  /**
17
17
  * Optional labels for on and off states.
@@ -55,11 +55,11 @@ class NgnToggleButton extends ValueControlBase {
55
55
  this.value.update(v => !v);
56
56
  }
57
57
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnToggleButton, deps: null, target: i0.ɵɵFactoryTarget.Component });
58
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnToggleButton, isStandalone: true, selector: "ngn-toggle-button", inputs: { labelOn: { classPropertyName: "labelOn", publicName: "labelOn", isSignal: true, isRequired: false, transformFunction: null }, labelOff: { classPropertyName: "labelOff", publicName: "labelOff", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconOn: { classPropertyName: "iconOn", publicName: "iconOn", isSignal: true, isRequired: false, transformFunction: null }, iconOff: { classPropertyName: "iconOff", publicName: "iconOff", isSignal: true, isRequired: false, transformFunction: null }, fixedWidth: { classPropertyName: "fixedWidth", publicName: "fixedWidth", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnToggleButton)], usesInheritance: true, ngImport: i0, template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }] });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnToggleButton, isStandalone: true, selector: "ngn-toggle-button", inputs: { labelOn: { classPropertyName: "labelOn", publicName: "labelOn", isSignal: true, isRequired: false, transformFunction: null }, labelOff: { classPropertyName: "labelOff", publicName: "labelOff", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconOn: { classPropertyName: "iconOn", publicName: "iconOn", isSignal: true, isRequired: false, transformFunction: null }, iconOff: { classPropertyName: "iconOff", publicName: "iconOff", isSignal: true, isRequired: false, transformFunction: null }, fixedWidth: { classPropertyName: "fixedWidth", publicName: "fixedWidth", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnToggleButton)], usesInheritance: true, ngImport: i0, template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n (blur)=\"markTouched()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }] });
59
59
  }
60
60
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnToggleButton, decorators: [{
61
61
  type: Component,
62
- args: [{ selector: 'ngn-toggle-button', providers: [provideSelf(NgnToggleButton)], imports: [NgnPt, NgnIcon], template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n" }]
62
+ args: [{ selector: 'ngn-toggle-button', providers: [provideSelf(NgnToggleButton)], imports: [NgnPt, NgnIcon], template: "<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n (blur)=\"markTouched()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n" }]
63
63
  }], propDecorators: { labelOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelOn", required: false }] }], labelOff: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelOff", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconOn: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOn", required: false }] }], iconOff: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOff", required: false }] }], fixedWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fixedWidth", required: false }] }] } });
64
64
 
65
65
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-toggle-button.mjs","sources":["../../src/toggle-button/toggle-button.ts","../../src/toggle-button/toggle-button.html","../../src/toggle-button/ngneers-controls-toggle-button.ts"],"sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { provideSelf, ValueControlBase, NgnPt } from '@ngneers/controls/base';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { toggleButtonControlTemplate } from '@ngneers/controls-themes/templates/toggle-button';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-toggle-button',\n providers: [provideSelf(NgnToggleButton)],\n\n imports: [NgnPt, NgnIcon],\n templateUrl: './toggle-button.html',\n})\nexport class NgnToggleButton extends ValueControlBase<'toggleButton', boolean> {\n protected readonly theme = this.injectThemeTemplate(toggleButtonControlTemplate, {\n root: true,\n active: () => this.value(),\n invalid: () => this.invalid(),\n });\n\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOn = input<string>();\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOff = input<string>();\n /**\n * Optional icon for the button. Can be used instead of the label or in combination with it.\n * If {@link iconOn} and {@link iconOff} are provided, they will take precedence over this input for their respective states.\n */\n public readonly icon = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOn = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOff = input<IconType>();\n /**\n * If true, the button will always have the width of the longest possible content.\n * @default false\n */\n public readonly fixedWidth = input(false, { transform: booleanAttribute });\n\n public toggle() {\n if (this.disabled() || this.readonly()) {\n return;\n }\n this.value.update(v => !v);\n }\n}\n","<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n (blur)=\"touched.set(true)\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-toggle-button.mjs","sources":["../../src/toggle-button/toggle-button.ts","../../src/toggle-button/toggle-button.html","../../src/toggle-button/ngneers-controls-toggle-button.ts"],"sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { provideSelf, ValueControlBase, NgnPt } from '@ngneers/controls/base';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { toggleButtonControlTemplate } from '@ngneers/controls-themes/templates/toggle-button';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-toggle-button',\n providers: [provideSelf(NgnToggleButton)],\n\n imports: [NgnPt, NgnIcon],\n templateUrl: './toggle-button.html',\n})\nexport class NgnToggleButton extends ValueControlBase<'toggleButton', boolean> {\n protected readonly theme = this.injectThemeTemplate(toggleButtonControlTemplate, {\n root: true,\n active: () => this.value(),\n invalid: () => this.invalidState(),\n });\n\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOn = input<string>();\n /**\n * Optional labels for on and off states.\n * If not provided, the {@link label} input will be used.\n */\n public readonly labelOff = input<string>();\n /**\n * Optional icon for the button. Can be used instead of the label or in combination with it.\n * If {@link iconOn} and {@link iconOff} are provided, they will take precedence over this input for their respective states.\n */\n public readonly icon = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOn = input<IconType>();\n /**\n * Optional icons for on and off states.\n * If not provided, the {@link icon} input will be used.\n */\n public readonly iconOff = input<IconType>();\n /**\n * If true, the button will always have the width of the longest possible content.\n * @default false\n */\n public readonly fixedWidth = input(false, { transform: booleanAttribute });\n\n public toggle() {\n if (this.disabled() || this.readonly()) {\n return;\n }\n this.value.update(v => !v);\n }\n}\n","<button\n [ptInt]=\"this\"\n [ptClass]=\"'button'\"\n role=\"switch\"\n (click)=\"toggle()\"\n (blur)=\"markTouched()\"\n [disabled]=\"disabled()\"\n [attr.aria-readonly]=\"readonly()\"\n [attr.aria-checked]=\"value()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n @let renderedIcon = (value() ? iconOn() : iconOff()) ?? icon();\n @if (renderedIcon) {\n <ngn-icon [icon]=\"renderedIcon\" />\n }\n {{ (value() ? labelOn() : labelOff()) ?? label() }}\n </span>\n @if (fixedWidth()) {\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder-active'\">\n @let renderedIconOn = iconOn() ?? icon();\n @if (renderedIconOn) {\n <ngn-icon [icon]=\"renderedIconOn\" />\n }\n {{ labelOn() ?? label() }}\n </span>\n <span inert [ptInt]=\"this\" [ptClass]=\"'placeholder'\">\n @let renderedIconOff = iconOff() ?? icon();\n @if (renderedIconOff) {\n <ngn-icon [icon]=\"renderedIconOff\" />\n }\n {{ labelOff() ?? label() }}\n </span>\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, ViewContainerRef, signal, input, computed, effect, afterRenderEffect, TemplateRef, Directive, viewChild, DOCUMENT, Component } from '@angular/core';
3
- import { NGN_CONFIG, abortSignalOnDestroy, autoPositionElement, splitPlacement, roundByDpr } from '@ngneers/controls/api/ng';
3
+ import { NGN_CONFIG, domEventHandler, autoPositionElement, splitPlacement, roundByDpr } from '@ngneers/controls/api/ng';
4
4
  import { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';
5
5
  import { NgnDefer } from '@ngneers/controls/defer';
6
6
  import { getTimeSpanMilliseconds, notNullish } from '@ngneers/controls/utils';
@@ -152,19 +152,11 @@ class NgnTooltip extends NgnBase {
152
152
  ...(ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []));
153
153
  constructor() {
154
154
  super();
155
- const abortSignal = abortSignalOnDestroy();
156
- this.element.nativeElement.addEventListener('mouseenter', this.onMouseEnter.bind(this), {
157
- signal: abortSignal,
158
- });
159
- this.element.nativeElement.addEventListener('mouseleave', this.onMouseLeave.bind(this), {
160
- signal: abortSignal,
161
- });
162
- this.element.nativeElement.addEventListener('focus', this.onFocus.bind(this), {
163
- signal: abortSignal,
164
- });
165
- this.element.nativeElement.addEventListener('blur', this.onBlur.bind(this), {
166
- signal: abortSignal,
167
- });
155
+ const el = this.element.nativeElement;
156
+ domEventHandler(el, 'mouseenter', () => this.onMouseEnter());
157
+ domEventHandler(el, 'mouseleave', () => this.onMouseLeave());
158
+ domEventHandler(el, 'focus', () => this.onFocus());
159
+ domEventHandler(el, 'blur', () => this.onBlur());
168
160
  effect(() => {
169
161
  const tooltip = this._tooltip();
170
162
  if (tooltip)
@@ -355,8 +347,14 @@ class TooltipComponent extends NgnBase {
355
347
  disableSettingStyles: true,
356
348
  strategy: 'fixed',
357
349
  onPositionChange: ({ x, y, placement, middlewareData }) => {
358
- this.relativeAnchorElementPosition.set(middlewareData[relativeAnchorElementPosition.name]);
359
- this.position.set({ x, y });
350
+ // Whole-pixel placement: sub-pixel coords jitter on resize/DPR, re-firing the RO and tripping NG0100 on the left/top/--anchor-* bindings.
351
+ const anchor = middlewareData[relativeAnchorElementPosition.name];
352
+ this.relativeAnchorElementPosition.set(anchor && {
353
+ start: Math.round(anchor.start),
354
+ center: Math.round(anchor.center),
355
+ end: Math.round(anchor.end),
356
+ });
357
+ this.position.set({ x: Math.round(x), y: Math.round(y) });
360
358
  this.positionClass.set(splitPlacement(placement)
361
359
  .filter(notNullish)
362
360
  .map(x => this.theme.class(x))
@@ -364,22 +362,12 @@ class TooltipComponent extends NgnBase {
364
362
  },
365
363
  });
366
364
  });
367
- // Stable reference so addEventListener/removeEventListener target the same
368
- // handler; `.bind()` returns a new function each call, which would leak
369
- // listeners (remove never matches, add re-registers on every effect run).
370
- onDocumentKeyDownBound = (event) => this.onDocumentKeyDown(event);
371
365
  constructor() {
372
366
  super();
373
367
  const document = inject(DOCUMENT);
374
- const destroyAbortSignal = abortSignalOnDestroy();
375
- effect(() => {
368
+ domEventHandler(document, 'keydown', event => {
376
369
  if (this.isShown() && !this.isClosing()) {
377
- document.addEventListener('keydown', this.onDocumentKeyDownBound, {
378
- signal: destroyAbortSignal,
379
- });
380
- }
381
- else {
382
- document.removeEventListener('keydown', this.onDocumentKeyDownBound);
370
+ this.onDocumentKeyDown(event);
383
371
  }
384
372
  });
385
373
  effect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-tooltip.mjs","sources":["../../src/tooltip/relative-anchor-element-position.ts","../../src/tooltip/tooltip.ts","../../src/tooltip/tooltip.html","../../src/tooltip/ngneers-controls-tooltip.ts"],"sourcesContent":["import type { Middleware, Placement } from '@floating-ui/dom';\n\nexport type RelativeAnchorElementPositionData = {\n start: number;\n center: number;\n end: number;\n};\n\nexport const relativeAnchorElementPosition: Middleware = {\n name: 'relativeAnchorElementPosition',\n async fn(state) {\n const { placement, rects } = state;\n\n const axis = getAxis(placement);\n const axisSize = axis === 'x' ? 'width' : 'height';\n\n return {\n data: {\n start: rects.reference[axis] - state[axis],\n center: rects.reference[axis] + rects.reference[axisSize] / 2 - state[axis],\n end: rects.reference[axis] + rects.reference[axisSize] - state[axis],\n } satisfies RelativeAnchorElementPositionData,\n };\n },\n};\n\nfunction getAxis(placement: Placement): 'x' | 'y' {\n switch (placement.split('-')[0]) {\n case 'top':\n case 'bottom':\n return 'x';\n case 'left':\n case 'right':\n return 'y';\n default:\n throw new Error(`Unknown placement: ${placement}`);\n }\n}\n","import {\n Component,\n ComponentRef,\n computed,\n Directive,\n DOCUMENT,\n effect,\n inject,\n input,\n type OnDestroy,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n afterRenderEffect,\n} from '@angular/core';\nimport {\n abortSignalOnDestroy,\n autoPositionElement,\n type AutoPositioningHandle,\n NGN_CONFIG,\n type PositioningSizeConstraints,\n roundByDpr,\n splitPlacement,\n type TooltipOptions,\n} from '@ngneers/controls/api/ng';\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\nimport { NgnDefer } from '@ngneers/controls/defer';\nimport { getTimeSpanMilliseconds, notNullish, type TimeSpan } from '@ngneers/controls/utils';\nimport { computedWithPrevious, generateElementId } from '@ngneers/controls/utils-ng';\nimport { tooltipControlTemplate } from '@ngneers/controls-themes/templates/tooltip';\n\nimport {\n relativeAnchorElementPosition,\n type RelativeAnchorElementPositionData,\n} from './relative-anchor-element-position';\n\nimport type { Placement } from '@floating-ui/dom';\n\n/**\n * @category control\n */\n@Directive({\n selector: '[ngnTooltip]',\n exportAs: 'ngnTooltip',\n providers: [provideSelf(NgnTooltip)],\n})\nexport class NgnTooltip extends NgnBase<'tooltip'> implements OnDestroy {\n protected readonly theme = null;\n private readonly _viewContainerRef = inject(ViewContainerRef);\n private readonly _config = inject(NGN_CONFIG);\n private readonly _tooltip = signal<ComponentRef<TooltipComponent> | null>(null);\n\n /**\n * The content of the tooltip, can be a string or a TemplateRef.\n * If the value is falsy, the tooltip will not be shown.\n * @alias ngnTooltip\n */\n public readonly content = input<TemplateRef<unknown> | string | null | undefined>(null, {\n alias: 'ngnTooltip',\n });\n /**\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\n * @alias ngnTooltipShowOnlyIfTruncated\n * @default false\n */\n public readonly showOnlyIfTruncated = input<boolean | ''>(false, {\n alias: 'ngnTooltipShowOnlyIfTruncated',\n });\n /**\n * The size constraints for the tooltip.\n * This can be used to limit the width and height of the tooltip.\n * If not provided, the tooltip is only constrained by the size of the screen.\n * @alias ngnTooltipSize\n */\n public readonly size = input<PositioningSizeConstraints | null | undefined>(null, {\n alias: 'ngnTooltipSize',\n });\n\n /**\n * The options for the tooltip.\n * This is a shorthand for setting multiple options at once.\n * The individual options take precedence over the options set here.\n * @alias ngnTooltipOptions\n */\n public readonly options = input<Partial<TooltipOptions> | null | undefined>(null, {\n alias: 'ngnTooltipOptions',\n });\n /**\n * The placement of the tooltip relative to the anchor element.\n * @alias ngnTooltipPlacement\n * @default 'bottom'\n */\n public readonly placement = input<Placement | null | undefined>(null, {\n alias: 'ngnTooltipPlacement',\n });\n /**\n * The offset in Pixels of the tooltip from the anchor element.\n * @alias ngnTooltipOffset\n * @default 4\n */\n public readonly offset = input<number | null | undefined>(null, {\n alias: 'ngnTooltipOffset',\n });\n /**\n * The delay before the tooltip is shown. If a number is provided, it is interpreted as milliseconds.\n * @alias ngnTooltipShowDelay\n * @default '0.5s'\n */\n public readonly showDelay = input<TimeSpan | null | undefined>(null, {\n alias: 'ngnTooltipShowDelay',\n });\n /**\n * The delay before the tooltip is hidden. If a number is provided, it is interpreted as milliseconds.\n * @alias ngnTooltipHideDelay\n * @default '0.1s'\n */\n public readonly hideDelay = input<TimeSpan | null | undefined>(null, {\n alias: 'ngnTooltipHideDelay',\n });\n /**\n * Whether to show an arrow pointing to the anchor element. `\"\"` is equivalent to `true`.\n * @alias ngnTooltipShowArrow\n * @default true\n */\n public readonly showArrow = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipShowArrow',\n });\n /**\n * Shows the tooltip on hover.\n * @alias ngnTooltipShowOnHover\n * @default true\n */\n public readonly showOnHover = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipShowOnHover',\n });\n /**\n * Shows the tooltip on focus.\n * @alias ngnTooltipShowOnFocus\n * @default true\n */\n public readonly showOnFocus = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipShowOnFocus',\n });\n /**\n * Hides the tooltip (without delay) when the mouse hovers over the tooltip.\n * @alias ngnTooltipHideOnTooltipHover\n * @default false\n */\n public readonly hideOnTooltipHover = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipHideOnTooltipHover',\n });\n /**\n * Hides the tooltip (without delay) when the user clicks on the tooltip.\n * @alias ngnTooltipHideOnClick\n * @default true\n */\n public readonly hideOnClick = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipHideOnClick',\n });\n /**\n * Whether to automatically manage ARIA attributes for the tooltip.\n * @alias ngnTooltipAutoAriaMode\n * @default 'description'\n */\n public readonly autoAriaMode = input<'label' | 'description' | 'none' | null | undefined>(null, {\n alias: 'ngnTooltipAutoAriaMode',\n });\n\n public readonly effectiveOptions = computed<TooltipOptions>(() => {\n const defaults = this._config.defaults.tooltip;\n return {\n placement: this.placement() ?? this.options()?.placement ?? defaults.placement,\n offset: this.offset() ?? this.options()?.offset ?? defaults.offset,\n showDelay: this.showDelay() ?? this.options()?.showDelay ?? defaults.showDelay,\n hideDelay: this.hideDelay() ?? this.options()?.hideDelay ?? defaults.hideDelay,\n showArrow: (this.showArrow() ?? this.options()?.showArrow ?? defaults.showArrow) !== false,\n showOnHover:\n (this.showOnHover() ?? this.options()?.showOnHover ?? defaults.showOnHover) !== false,\n showOnFocus:\n (this.showOnFocus() ?? this.options()?.showOnFocus ?? defaults.showOnFocus) !== false,\n hideOnTooltipHover:\n (this.hideOnTooltipHover() ??\n this.options()?.hideOnTooltipHover ??\n defaults.hideOnTooltipHover) !== false,\n hideOnClick:\n (this.hideOnClick() ?? this.options()?.hideOnClick ?? defaults.hideOnClick) !== false,\n autoAriaMode: this.autoAriaMode() ?? this.options()?.autoAriaMode ?? defaults.autoAriaMode,\n };\n });\n\n public readonly tooltip = computed(() => this._tooltip()?.instance);\n\n constructor() {\n super();\n\n const abortSignal = abortSignalOnDestroy();\n this.element.nativeElement.addEventListener('mouseenter', this.onMouseEnter.bind(this), {\n signal: abortSignal,\n });\n this.element.nativeElement.addEventListener('mouseleave', this.onMouseLeave.bind(this), {\n signal: abortSignal,\n });\n this.element.nativeElement.addEventListener('focus', this.onFocus.bind(this), {\n signal: abortSignal,\n });\n this.element.nativeElement.addEventListener('blur', this.onBlur.bind(this), {\n signal: abortSignal,\n });\n\n effect(() => {\n const tooltip = this._tooltip();\n if (tooltip) this.updateContent(tooltip);\n });\n effect(() => this._tooltip()?.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated()));\n effect(() => this._tooltip()?.setInput('size', this.size()));\n effect(() => this._tooltip()?.setInput('options', this.effectiveOptions()));\n\n afterRenderEffect(() => {\n const el = this.element.nativeElement;\n const content = this.content();\n const autoAriaMode = this.effectiveOptions().autoAriaMode;\n\n el.removeAttribute('aria-label');\n el.removeAttribute('aria-description');\n el.removeAttribute('aria-labelledby');\n el.removeAttribute('aria-describedby');\n\n if (autoAriaMode === 'none' || !content) {\n return;\n }\n\n const tooltip = this.tooltip();\n const isShown = tooltip?.isShown() ?? false;\n\n if (typeof content === 'string') {\n if (isShown && tooltip) {\n const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';\n el.setAttribute(attr, tooltip.id);\n } else {\n const attr = autoAriaMode === 'label' ? 'aria-label' : 'aria-description';\n el.setAttribute(attr, content);\n }\n } else if (content instanceof TemplateRef && isShown && tooltip) {\n const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';\n el.setAttribute(attr, tooltip.id);\n }\n });\n }\n\n public ngOnDestroy(): void {\n this._tooltip()?.destroy();\n this._tooltip.set(null);\n }\n\n public show(): void {\n const tooltip = this._tooltip();\n if (tooltip) {\n tooltip.instance.show();\n } else {\n const tooltip = this.getTooltip();\n if (tooltip) {\n requestAnimationFrame(() => tooltip.show());\n }\n }\n }\n\n public hide(): void {\n this._tooltip()?.instance.hide();\n }\n\n protected onMouseEnter() {\n if (this.effectiveOptions().showOnHover) {\n this.show();\n }\n }\n\n protected onMouseLeave() {\n if (this.effectiveOptions().showOnHover) {\n this.hide();\n }\n }\n\n protected onFocus() {\n if (this.effectiveOptions().showOnFocus) {\n this.show();\n }\n }\n\n protected onBlur() {\n if (this.effectiveOptions().showOnFocus) {\n this.hide();\n }\n }\n\n private getTooltip(): TooltipComponent | undefined {\n let tooltip = this._tooltip();\n if (!tooltip && this.content()) {\n tooltip = this._viewContainerRef.createComponent(TooltipComponent);\n tooltip.setInput('anchor', this.element.nativeElement);\n this.updateContent(tooltip);\n tooltip.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated());\n tooltip.setInput('size', this.size());\n tooltip.setInput('options', this.effectiveOptions());\n this._tooltip.set(tooltip);\n }\n return tooltip?.instance;\n }\n\n private updateContent(tooltip: ComponentRef<TooltipComponent>) {\n const content = this.content();\n if (content instanceof TemplateRef) {\n tooltip.setInput('text', null);\n tooltip.setInput('content', content);\n } else {\n tooltip.setInput('text', content);\n tooltip.setInput('content', null);\n }\n }\n}\n\n@Component({\n selector: 'ngn-tooltip',\n templateUrl: './tooltip.html',\n imports: [NgnPt, NgnDefer],\n providers: [provideSelf(TooltipComponent)],\n host: {\n '[class]': `positionClass()`,\n '[style.--anchor-start]': `toPixels(relativeAnchorElementPosition()?.start)`,\n '[style.--anchor-center]': `toPixels(relativeAnchorElementPosition()?.center)`,\n '[style.--anchor-end]': `toPixels(relativeAnchorElementPosition()?.end)`,\n '[style.left]': `toPixels(position().x)`,\n '[style.top]': `toPixels(position().y)`,\n '[attr.popover]': `'hint'`,\n '[attr.id]': `id`,\n '[attr.role]': `'tooltip'`,\n '(toggle)': 'onToggle($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(click)': 'onClick($event)',\n '[attr.aria-hidden]': `isShown() ? null : true`,\n },\n})\nexport class TooltipComponent extends NgnBase<'tooltip'> {\n private _showHideTimeout?: ReturnType<typeof setTimeout>;\n protected readonly theme = this.injectThemeTemplate(tooltipControlTemplate, {\n root: true,\n closing: () => this.isClosing(),\n 'with-arrow': () => this.options().showArrow !== false,\n });\n private readonly _config = inject(NGN_CONFIG);\n\n /**\n * The anchor element to which the tooltip is attached.\n */\n public readonly anchor = input.required<HTMLElement>();\n /**\n * The text content of the tooltip.\n */\n public readonly text = input<string | null>();\n /**\n * The content template of the tooltip.\n */\n public readonly content = input<TemplateRef<unknown>>();\n /**\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\n * @default `false`\n */\n public readonly showOnlyIfTruncated = input<boolean | ''>(false);\n /**\n * The size constraints for the tooltip.\n * This can be used to limit the width and height of the tooltip.\n * If not provided, the tooltip is only constrained by the size of the screen.\n */\n public readonly size = input<PositioningSizeConstraints | null>();\n /**\n * The options for the tooltip.\n *\n */\n public readonly options = input<TooltipOptions>(this._config.defaults.tooltip);\n\n protected readonly showDelayMs = computed(() =>\n getTimeSpanMilliseconds(this.options().showDelay)\n );\n protected readonly hideDelayMs = computed(() =>\n getTimeSpanMilliseconds(this.options().hideDelay)\n );\n\n protected readonly position = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n protected readonly positionClass = signal<string>('');\n protected readonly relativeAnchorElementPosition = signal<\n RelativeAnchorElementPositionData | undefined\n >(undefined);\n\n private readonly _isShown = signal(false);\n private readonly _isClosing = signal(false);\n\n public readonly id = generateElementId();\n public readonly isShown = this._isShown.asReadonly();\n public readonly isClosing = this._isClosing.asReadonly();\n\n private readonly _defaultContentTemplate =\n viewChild.required<TemplateRef<unknown>>('defaultContentTemplate');\n protected readonly contentTemplate = computed(\n () => this.content() ?? this._defaultContentTemplate()\n );\n\n private readonly _autoPos = computedWithPrevious<AutoPositioningHandle | undefined>(prev => {\n prev?.stop();\n const element = this.element.nativeElement;\n if (!element) {\n return undefined;\n }\n return autoPositionElement(this.anchor(), element, {\n injector: this.injector,\n stopped: true,\n resize: false,\n sizeConstraints: this.size() ?? undefined,\n placement: this.options().placement,\n offset: this.options().offset,\n middleware: [relativeAnchorElementPosition],\n disableSettingStyles: true,\n strategy: 'fixed',\n onPositionChange: ({ x, y, placement, middlewareData }) => {\n this.relativeAnchorElementPosition.set(middlewareData[relativeAnchorElementPosition.name]);\n this.position.set({ x, y });\n this.positionClass.set(\n splitPlacement(placement)\n .filter(notNullish)\n .map(x => this.theme.class(x))\n .join(' ')\n );\n },\n });\n });\n\n // Stable reference so addEventListener/removeEventListener target the same\n // handler; `.bind()` returns a new function each call, which would leak\n // listeners (remove never matches, add re-registers on every effect run).\n private readonly onDocumentKeyDownBound = (event: KeyboardEvent): void =>\n this.onDocumentKeyDown(event);\n\n constructor() {\n super();\n const document = inject(DOCUMENT);\n const destroyAbortSignal = abortSignalOnDestroy();\n effect(() => {\n if (this.isShown() && !this.isClosing()) {\n document.addEventListener('keydown', this.onDocumentKeyDownBound, {\n signal: destroyAbortSignal,\n });\n } else {\n document.removeEventListener('keydown', this.onDocumentKeyDownBound);\n }\n });\n effect(() => {\n if (this.isShown()) {\n this._autoPos()?.start();\n } else {\n this._autoPos()?.stop();\n }\n });\n }\n\n public show(skipDelay = false) {\n clearTimeout(this._showHideTimeout);\n\n const delay = skipDelay ? 0 : this.showDelayMs();\n if (delay <= 0) {\n this.onShow();\n } else {\n this._showHideTimeout = setTimeout(() => this.onShow(), delay);\n }\n }\n\n public hide(skipDelay = false) {\n clearTimeout(this._showHideTimeout);\n\n const delay = skipDelay ? 0 : this.hideDelayMs();\n if (delay <= 0) {\n this.onHide();\n } else {\n this._showHideTimeout = setTimeout(() => this.onHide(), delay);\n }\n }\n\n protected onMouseEnter() {\n if (this.options().hideOnTooltipHover) {\n this.hide(true);\n } else {\n this.show(true);\n }\n }\n\n protected onMouseLeave() {\n this.hide();\n }\n\n protected onClick(event: PointerEvent) {\n if (this.options().hideOnClick) {\n this.hide(true);\n }\n event.stopPropagation();\n }\n\n protected onDocumentKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.hide(true);\n event.preventDefault();\n }\n }\n\n protected onShow() {\n if (!this.content() && !this.text()) {\n return;\n }\n if (this.showOnlyIfTruncated() !== false && !isElementTruncated(this.anchor())) {\n return;\n }\n\n this._isShown.set(true);\n this.element.nativeElement.showPopover();\n }\n\n protected onHide() {\n this._isClosing.set(true);\n requestAnimationFrame(() => {\n Promise.all(this.element.nativeElement.getAnimations().map(a => a.finished))\n .then(() => this.element.nativeElement.hidePopover())\n .catch(() => {})\n .finally(() => this._isClosing.set(false));\n });\n }\n\n protected onToggle(event: Event) {\n const evt = event as ToggleEvent;\n if (evt.newState === 'closed') {\n this._isShown.set(false);\n } else {\n this._isShown.set(true);\n }\n }\n\n protected toPixels(value: number | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return `${roundByDpr(this.element.nativeElement, value)}px`;\n }\n}\n\nfunction isElementTruncated(element: HTMLElement): boolean {\n return (\n element.clientWidth < element.scrollWidth || // horizontal overflow\n element.clientHeight < element.scrollHeight || // vertical overflow\n element.offsetWidth < element.scrollWidth || // single-line ellipsis\n element.offsetHeight < element.scrollHeight // multi-line ellipsis (line-clamp)\n );\n}\n","<div [ptInt]=\"this\" [ptClass]=\"'content'\">\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\n</div>\n\n<ng-template #defaultContentTemplate>\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-tooltip.mjs","sources":["../../src/tooltip/relative-anchor-element-position.ts","../../src/tooltip/tooltip.ts","../../src/tooltip/tooltip.html","../../src/tooltip/ngneers-controls-tooltip.ts"],"sourcesContent":["import type { Middleware, Placement } from '@floating-ui/dom';\n\nexport type RelativeAnchorElementPositionData = {\n start: number;\n center: number;\n end: number;\n};\n\nexport const relativeAnchorElementPosition: Middleware = {\n name: 'relativeAnchorElementPosition',\n async fn(state) {\n const { placement, rects } = state;\n\n const axis = getAxis(placement);\n const axisSize = axis === 'x' ? 'width' : 'height';\n\n return {\n data: {\n start: rects.reference[axis] - state[axis],\n center: rects.reference[axis] + rects.reference[axisSize] / 2 - state[axis],\n end: rects.reference[axis] + rects.reference[axisSize] - state[axis],\n } satisfies RelativeAnchorElementPositionData,\n };\n },\n};\n\nfunction getAxis(placement: Placement): 'x' | 'y' {\n switch (placement.split('-')[0]) {\n case 'top':\n case 'bottom':\n return 'x';\n case 'left':\n case 'right':\n return 'y';\n default:\n throw new Error(`Unknown placement: ${placement}`);\n }\n}\n","import {\n Component,\n ComponentRef,\n computed,\n Directive,\n DOCUMENT,\n effect,\n inject,\n input,\n type OnDestroy,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n afterRenderEffect,\n} from '@angular/core';\nimport {\n autoPositionElement,\n type AutoPositioningHandle,\n domEventHandler,\n NGN_CONFIG,\n type PositioningSizeConstraints,\n roundByDpr,\n splitPlacement,\n type TooltipOptions,\n} from '@ngneers/controls/api/ng';\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\nimport { NgnDefer } from '@ngneers/controls/defer';\nimport { getTimeSpanMilliseconds, notNullish, type TimeSpan } from '@ngneers/controls/utils';\nimport { computedWithPrevious, generateElementId } from '@ngneers/controls/utils-ng';\nimport { tooltipControlTemplate } from '@ngneers/controls-themes/templates/tooltip';\n\nimport {\n relativeAnchorElementPosition,\n type RelativeAnchorElementPositionData,\n} from './relative-anchor-element-position';\n\nimport type { Placement } from '@floating-ui/dom';\n\n/**\n * @category control\n */\n@Directive({\n selector: '[ngnTooltip]',\n exportAs: 'ngnTooltip',\n providers: [provideSelf(NgnTooltip)],\n})\nexport class NgnTooltip extends NgnBase<'tooltip'> implements OnDestroy {\n protected readonly theme = null;\n private readonly _viewContainerRef = inject(ViewContainerRef);\n private readonly _config = inject(NGN_CONFIG);\n private readonly _tooltip = signal<ComponentRef<TooltipComponent> | null>(null);\n\n /**\n * The content of the tooltip, can be a string or a TemplateRef.\n * If the value is falsy, the tooltip will not be shown.\n * @alias ngnTooltip\n */\n public readonly content = input<TemplateRef<unknown> | string | null | undefined>(null, {\n alias: 'ngnTooltip',\n });\n /**\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\n * @alias ngnTooltipShowOnlyIfTruncated\n * @default false\n */\n public readonly showOnlyIfTruncated = input<boolean | ''>(false, {\n alias: 'ngnTooltipShowOnlyIfTruncated',\n });\n /**\n * The size constraints for the tooltip.\n * This can be used to limit the width and height of the tooltip.\n * If not provided, the tooltip is only constrained by the size of the screen.\n * @alias ngnTooltipSize\n */\n public readonly size = input<PositioningSizeConstraints | null | undefined>(null, {\n alias: 'ngnTooltipSize',\n });\n\n /**\n * The options for the tooltip.\n * This is a shorthand for setting multiple options at once.\n * The individual options take precedence over the options set here.\n * @alias ngnTooltipOptions\n */\n public readonly options = input<Partial<TooltipOptions> | null | undefined>(null, {\n alias: 'ngnTooltipOptions',\n });\n /**\n * The placement of the tooltip relative to the anchor element.\n * @alias ngnTooltipPlacement\n * @default 'bottom'\n */\n public readonly placement = input<Placement | null | undefined>(null, {\n alias: 'ngnTooltipPlacement',\n });\n /**\n * The offset in Pixels of the tooltip from the anchor element.\n * @alias ngnTooltipOffset\n * @default 4\n */\n public readonly offset = input<number | null | undefined>(null, {\n alias: 'ngnTooltipOffset',\n });\n /**\n * The delay before the tooltip is shown. If a number is provided, it is interpreted as milliseconds.\n * @alias ngnTooltipShowDelay\n * @default '0.5s'\n */\n public readonly showDelay = input<TimeSpan | null | undefined>(null, {\n alias: 'ngnTooltipShowDelay',\n });\n /**\n * The delay before the tooltip is hidden. If a number is provided, it is interpreted as milliseconds.\n * @alias ngnTooltipHideDelay\n * @default '0.1s'\n */\n public readonly hideDelay = input<TimeSpan | null | undefined>(null, {\n alias: 'ngnTooltipHideDelay',\n });\n /**\n * Whether to show an arrow pointing to the anchor element. `\"\"` is equivalent to `true`.\n * @alias ngnTooltipShowArrow\n * @default true\n */\n public readonly showArrow = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipShowArrow',\n });\n /**\n * Shows the tooltip on hover.\n * @alias ngnTooltipShowOnHover\n * @default true\n */\n public readonly showOnHover = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipShowOnHover',\n });\n /**\n * Shows the tooltip on focus.\n * @alias ngnTooltipShowOnFocus\n * @default true\n */\n public readonly showOnFocus = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipShowOnFocus',\n });\n /**\n * Hides the tooltip (without delay) when the mouse hovers over the tooltip.\n * @alias ngnTooltipHideOnTooltipHover\n * @default false\n */\n public readonly hideOnTooltipHover = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipHideOnTooltipHover',\n });\n /**\n * Hides the tooltip (without delay) when the user clicks on the tooltip.\n * @alias ngnTooltipHideOnClick\n * @default true\n */\n public readonly hideOnClick = input<boolean | '' | null | undefined>(null, {\n alias: 'ngnTooltipHideOnClick',\n });\n /**\n * Whether to automatically manage ARIA attributes for the tooltip.\n * @alias ngnTooltipAutoAriaMode\n * @default 'description'\n */\n public readonly autoAriaMode = input<'label' | 'description' | 'none' | null | undefined>(null, {\n alias: 'ngnTooltipAutoAriaMode',\n });\n\n public readonly effectiveOptions = computed<TooltipOptions>(() => {\n const defaults = this._config.defaults.tooltip;\n return {\n placement: this.placement() ?? this.options()?.placement ?? defaults.placement,\n offset: this.offset() ?? this.options()?.offset ?? defaults.offset,\n showDelay: this.showDelay() ?? this.options()?.showDelay ?? defaults.showDelay,\n hideDelay: this.hideDelay() ?? this.options()?.hideDelay ?? defaults.hideDelay,\n showArrow: (this.showArrow() ?? this.options()?.showArrow ?? defaults.showArrow) !== false,\n showOnHover:\n (this.showOnHover() ?? this.options()?.showOnHover ?? defaults.showOnHover) !== false,\n showOnFocus:\n (this.showOnFocus() ?? this.options()?.showOnFocus ?? defaults.showOnFocus) !== false,\n hideOnTooltipHover:\n (this.hideOnTooltipHover() ??\n this.options()?.hideOnTooltipHover ??\n defaults.hideOnTooltipHover) !== false,\n hideOnClick:\n (this.hideOnClick() ?? this.options()?.hideOnClick ?? defaults.hideOnClick) !== false,\n autoAriaMode: this.autoAriaMode() ?? this.options()?.autoAriaMode ?? defaults.autoAriaMode,\n };\n });\n\n public readonly tooltip = computed(() => this._tooltip()?.instance);\n\n constructor() {\n super();\n\n const el = this.element.nativeElement;\n domEventHandler(el, 'mouseenter', () => this.onMouseEnter());\n domEventHandler(el, 'mouseleave', () => this.onMouseLeave());\n domEventHandler(el, 'focus', () => this.onFocus());\n domEventHandler(el, 'blur', () => this.onBlur());\n\n effect(() => {\n const tooltip = this._tooltip();\n if (tooltip) this.updateContent(tooltip);\n });\n effect(() => this._tooltip()?.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated()));\n effect(() => this._tooltip()?.setInput('size', this.size()));\n effect(() => this._tooltip()?.setInput('options', this.effectiveOptions()));\n\n afterRenderEffect(() => {\n const el = this.element.nativeElement;\n const content = this.content();\n const autoAriaMode = this.effectiveOptions().autoAriaMode;\n\n el.removeAttribute('aria-label');\n el.removeAttribute('aria-description');\n el.removeAttribute('aria-labelledby');\n el.removeAttribute('aria-describedby');\n\n if (autoAriaMode === 'none' || !content) {\n return;\n }\n\n const tooltip = this.tooltip();\n const isShown = tooltip?.isShown() ?? false;\n\n if (typeof content === 'string') {\n if (isShown && tooltip) {\n const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';\n el.setAttribute(attr, tooltip.id);\n } else {\n const attr = autoAriaMode === 'label' ? 'aria-label' : 'aria-description';\n el.setAttribute(attr, content);\n }\n } else if (content instanceof TemplateRef && isShown && tooltip) {\n const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';\n el.setAttribute(attr, tooltip.id);\n }\n });\n }\n\n public ngOnDestroy(): void {\n this._tooltip()?.destroy();\n this._tooltip.set(null);\n }\n\n public show(): void {\n const tooltip = this._tooltip();\n if (tooltip) {\n tooltip.instance.show();\n } else {\n const tooltip = this.getTooltip();\n if (tooltip) {\n requestAnimationFrame(() => tooltip.show());\n }\n }\n }\n\n public hide(): void {\n this._tooltip()?.instance.hide();\n }\n\n protected onMouseEnter() {\n if (this.effectiveOptions().showOnHover) {\n this.show();\n }\n }\n\n protected onMouseLeave() {\n if (this.effectiveOptions().showOnHover) {\n this.hide();\n }\n }\n\n protected onFocus() {\n if (this.effectiveOptions().showOnFocus) {\n this.show();\n }\n }\n\n protected onBlur() {\n if (this.effectiveOptions().showOnFocus) {\n this.hide();\n }\n }\n\n private getTooltip(): TooltipComponent | undefined {\n let tooltip = this._tooltip();\n if (!tooltip && this.content()) {\n tooltip = this._viewContainerRef.createComponent(TooltipComponent);\n tooltip.setInput('anchor', this.element.nativeElement);\n this.updateContent(tooltip);\n tooltip.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated());\n tooltip.setInput('size', this.size());\n tooltip.setInput('options', this.effectiveOptions());\n this._tooltip.set(tooltip);\n }\n return tooltip?.instance;\n }\n\n private updateContent(tooltip: ComponentRef<TooltipComponent>) {\n const content = this.content();\n if (content instanceof TemplateRef) {\n tooltip.setInput('text', null);\n tooltip.setInput('content', content);\n } else {\n tooltip.setInput('text', content);\n tooltip.setInput('content', null);\n }\n }\n}\n\n@Component({\n selector: 'ngn-tooltip',\n templateUrl: './tooltip.html',\n imports: [NgnPt, NgnDefer],\n providers: [provideSelf(TooltipComponent)],\n host: {\n '[class]': `positionClass()`,\n '[style.--anchor-start]': `toPixels(relativeAnchorElementPosition()?.start)`,\n '[style.--anchor-center]': `toPixels(relativeAnchorElementPosition()?.center)`,\n '[style.--anchor-end]': `toPixels(relativeAnchorElementPosition()?.end)`,\n '[style.left]': `toPixels(position().x)`,\n '[style.top]': `toPixels(position().y)`,\n '[attr.popover]': `'hint'`,\n '[attr.id]': `id`,\n '[attr.role]': `'tooltip'`,\n '(toggle)': 'onToggle($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n '(click)': 'onClick($event)',\n '[attr.aria-hidden]': `isShown() ? null : true`,\n },\n})\nexport class TooltipComponent extends NgnBase<'tooltip'> {\n private _showHideTimeout?: ReturnType<typeof setTimeout>;\n protected readonly theme = this.injectThemeTemplate(tooltipControlTemplate, {\n root: true,\n closing: () => this.isClosing(),\n 'with-arrow': () => this.options().showArrow !== false,\n });\n private readonly _config = inject(NGN_CONFIG);\n\n /**\n * The anchor element to which the tooltip is attached.\n */\n public readonly anchor = input.required<HTMLElement>();\n /**\n * The text content of the tooltip.\n */\n public readonly text = input<string | null>();\n /**\n * The content template of the tooltip.\n */\n public readonly content = input<TemplateRef<unknown>>();\n /**\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\n * @default `false`\n */\n public readonly showOnlyIfTruncated = input<boolean | ''>(false);\n /**\n * The size constraints for the tooltip.\n * This can be used to limit the width and height of the tooltip.\n * If not provided, the tooltip is only constrained by the size of the screen.\n */\n public readonly size = input<PositioningSizeConstraints | null>();\n /**\n * The options for the tooltip.\n *\n */\n public readonly options = input<TooltipOptions>(this._config.defaults.tooltip);\n\n protected readonly showDelayMs = computed(() =>\n getTimeSpanMilliseconds(this.options().showDelay)\n );\n protected readonly hideDelayMs = computed(() =>\n getTimeSpanMilliseconds(this.options().hideDelay)\n );\n\n protected readonly position = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n protected readonly positionClass = signal<string>('');\n protected readonly relativeAnchorElementPosition = signal<\n RelativeAnchorElementPositionData | undefined\n >(undefined);\n\n private readonly _isShown = signal(false);\n private readonly _isClosing = signal(false);\n\n public readonly id = generateElementId();\n public readonly isShown = this._isShown.asReadonly();\n public readonly isClosing = this._isClosing.asReadonly();\n\n private readonly _defaultContentTemplate =\n viewChild.required<TemplateRef<unknown>>('defaultContentTemplate');\n protected readonly contentTemplate = computed(\n () => this.content() ?? this._defaultContentTemplate()\n );\n\n private readonly _autoPos = computedWithPrevious<AutoPositioningHandle | undefined>(prev => {\n prev?.stop();\n const element = this.element.nativeElement;\n if (!element) {\n return undefined;\n }\n return autoPositionElement(this.anchor(), element, {\n injector: this.injector,\n stopped: true,\n resize: false,\n sizeConstraints: this.size() ?? undefined,\n placement: this.options().placement,\n offset: this.options().offset,\n middleware: [relativeAnchorElementPosition],\n disableSettingStyles: true,\n strategy: 'fixed',\n onPositionChange: ({ x, y, placement, middlewareData }) => {\n // Whole-pixel placement: sub-pixel coords jitter on resize/DPR, re-firing the RO and tripping NG0100 on the left/top/--anchor-* bindings.\n const anchor = middlewareData[relativeAnchorElementPosition.name];\n this.relativeAnchorElementPosition.set(\n anchor && {\n start: Math.round(anchor.start),\n center: Math.round(anchor.center),\n end: Math.round(anchor.end),\n }\n );\n this.position.set({ x: Math.round(x), y: Math.round(y) });\n this.positionClass.set(\n splitPlacement(placement)\n .filter(notNullish)\n .map(x => this.theme.class(x))\n .join(' ')\n );\n },\n });\n });\n\n constructor() {\n super();\n const document = inject(DOCUMENT);\n domEventHandler(document, 'keydown', event => {\n if (this.isShown() && !this.isClosing()) {\n this.onDocumentKeyDown(event);\n }\n });\n effect(() => {\n if (this.isShown()) {\n this._autoPos()?.start();\n } else {\n this._autoPos()?.stop();\n }\n });\n }\n\n public show(skipDelay = false) {\n clearTimeout(this._showHideTimeout);\n\n const delay = skipDelay ? 0 : this.showDelayMs();\n if (delay <= 0) {\n this.onShow();\n } else {\n this._showHideTimeout = setTimeout(() => this.onShow(), delay);\n }\n }\n\n public hide(skipDelay = false) {\n clearTimeout(this._showHideTimeout);\n\n const delay = skipDelay ? 0 : this.hideDelayMs();\n if (delay <= 0) {\n this.onHide();\n } else {\n this._showHideTimeout = setTimeout(() => this.onHide(), delay);\n }\n }\n\n protected onMouseEnter() {\n if (this.options().hideOnTooltipHover) {\n this.hide(true);\n } else {\n this.show(true);\n }\n }\n\n protected onMouseLeave() {\n this.hide();\n }\n\n protected onClick(event: PointerEvent) {\n if (this.options().hideOnClick) {\n this.hide(true);\n }\n event.stopPropagation();\n }\n\n protected onDocumentKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape' || event.key === 'Esc') {\n this.hide(true);\n event.preventDefault();\n }\n }\n\n protected onShow() {\n if (!this.content() && !this.text()) {\n return;\n }\n if (this.showOnlyIfTruncated() !== false && !isElementTruncated(this.anchor())) {\n return;\n }\n\n this._isShown.set(true);\n this.element.nativeElement.showPopover();\n }\n\n protected onHide() {\n this._isClosing.set(true);\n requestAnimationFrame(() => {\n Promise.all(this.element.nativeElement.getAnimations().map(a => a.finished))\n .then(() => this.element.nativeElement.hidePopover())\n .catch(() => {})\n .finally(() => this._isClosing.set(false));\n });\n }\n\n protected onToggle(event: Event) {\n const evt = event as ToggleEvent;\n if (evt.newState === 'closed') {\n this._isShown.set(false);\n } else {\n this._isShown.set(true);\n }\n }\n\n protected toPixels(value: number | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return `${roundByDpr(this.element.nativeElement, value)}px`;\n }\n}\n\nfunction isElementTruncated(element: HTMLElement): boolean {\n return (\n element.clientWidth < element.scrollWidth || // horizontal overflow\n element.clientHeight < element.scrollHeight || // vertical overflow\n element.offsetWidth < element.scrollWidth || // single-line ellipsis\n element.offsetHeight < element.scrollHeight // multi-line ellipsis (line-clamp)\n );\n}\n","<div [ptInt]=\"this\" [ptClass]=\"'content'\">\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\n</div>\n\n<ng-template #defaultContentTemplate>\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -145,7 +145,7 @@ class NgnTree extends TreeTemplates {
145
145
  i18n = inject(I18n).translations;
146
146
  theme = this.injectThemeTemplate(treeControlTemplate, {
147
147
  root: true,
148
- invalid: () => this.invalid(),
148
+ invalid: () => this.invalidState(),
149
149
  empty: () => !this.flatNodes().length,
150
150
  });
151
151
  _scroller = viewChild.required(NgnScroller);
@@ -435,7 +435,7 @@ class NgnTree extends TreeTemplates {
435
435
  this.value.set(value);
436
436
  }
437
437
  this.itemClicked.emit(value);
438
- this.touched.set(true);
438
+ this.markTouched();
439
439
  }
440
440
  scrollToIndex(index) {
441
441
  this._scroller().scrollToIndex(index);