@ngneers/controls 0.0.1-pre4 → 0.0.1-pre6

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 (122) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +32 -32
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-ng.mjs +19 -19
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
  6. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-avatar.mjs +13 -13
  8. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
  9. package/fesm2022/ngneers-controls-base.mjs +89 -64
  10. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-breadcrumb.mjs +18 -18
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-button-group.mjs +8 -8
  14. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-button.mjs +16 -10
  16. package/fesm2022/ngneers-controls-button.mjs.map +1 -1
  17. package/fesm2022/{ngneers-controls-calendar-time-C7UnIFzU.mjs → ngneers-controls-calendar-time-Bzlv9Vkn.mjs} +9 -9
  18. package/fesm2022/{ngneers-controls-calendar-time-C7UnIFzU.mjs.map → ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map} +1 -1
  19. package/fesm2022/ngneers-controls-calendar.mjs +54 -54
  20. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
  22. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-chip.mjs +6 -6
  24. package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-defer.mjs +10 -10
  26. package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-dialog.mjs +37 -39
  28. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-directives.mjs +45 -39
  30. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-drawer.mjs +28 -28
  32. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -15
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-filter.mjs +192 -44
  36. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  37. package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
  38. package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
  39. package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
  40. package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
  41. package/fesm2022/ngneers-controls-i18n.mjs +5 -5
  42. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-icon.mjs +10 -10
  44. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-inplace.mjs +18 -18
  46. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
  47. package/fesm2022/ngneers-controls-input-field.mjs +15 -15
  48. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
  50. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-input.mjs +7 -6
  52. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  53. package/fesm2022/ngneers-controls-item-view.mjs +33 -33
  54. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-list-box.mjs +31 -31
  56. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-menu.mjs +32 -32
  58. package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-message.mjs +4 -4
  60. package/fesm2022/ngneers-controls-message.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-paginator.mjs +12 -12
  62. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-popover.mjs +13 -13
  64. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-progress.mjs +16 -16
  66. package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
  67. package/fesm2022/ngneers-controls-scroller.mjs +74 -39
  68. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-select-button.mjs +6 -6
  70. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-select.mjs +46 -46
  72. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-slider.mjs +12 -12
  74. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-spinner.mjs +7 -7
  76. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-splitter.mjs +141 -328
  78. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  80. package/fesm2022/ngneers-controls-table.mjs +1520 -80
  81. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  82. package/fesm2022/ngneers-controls-tabs.mjs +40 -39
  83. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  84. package/fesm2022/ngneers-controls-tag.mjs +4 -4
  85. package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
  86. package/fesm2022/ngneers-controls-toast.mjs +18 -18
  87. package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
  88. package/fesm2022/ngneers-controls-toggle-button.mjs +9 -9
  89. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  90. package/fesm2022/ngneers-controls-tooltip.mjs +37 -45
  91. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  92. package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
  93. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
  94. package/package.json +14 -10
  95. package/types/ngneers-controls-api-ng.d.ts +2 -2
  96. package/types/ngneers-controls-api-resize.d.ts +318 -0
  97. package/types/ngneers-controls-base.d.ts +8 -0
  98. package/types/ngneers-controls-breadcrumb.d.ts +1 -1
  99. package/types/ngneers-controls-button.d.ts +13 -8
  100. package/types/ngneers-controls-calendar.d.ts +5 -1
  101. package/types/ngneers-controls-checkbox.d.ts +1 -1
  102. package/types/ngneers-controls-directives.d.ts +7 -1
  103. package/types/ngneers-controls-drawer.d.ts +4 -0
  104. package/types/ngneers-controls-edit-inplace.d.ts +4 -0
  105. package/types/ngneers-controls-filter.d.ts +53 -4
  106. package/types/ngneers-controls-i18n.d.ts +4 -0
  107. package/types/ngneers-controls-icon.d.ts +1 -1
  108. package/types/ngneers-controls-input-field.d.ts +4 -0
  109. package/types/ngneers-controls-input.d.ts +1 -1
  110. package/types/ngneers-controls-list-box.d.ts +5 -1
  111. package/types/ngneers-controls-menu.d.ts +1 -1
  112. package/types/ngneers-controls-paginator.d.ts +4 -0
  113. package/types/ngneers-controls-popover.d.ts +1 -1
  114. package/types/ngneers-controls-scroller.d.ts +12 -2
  115. package/types/ngneers-controls-select.d.ts +6 -2
  116. package/types/ngneers-controls-spinner.d.ts +1 -1
  117. package/types/ngneers-controls-splitter.d.ts +29 -59
  118. package/types/ngneers-controls-table.d.ts +392 -24
  119. package/types/ngneers-controls-toast.d.ts +1 -1
  120. package/types/ngneers-controls-tooltip.d.ts +1 -7
  121. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
  122. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-base.mjs","sources":["../../src/base/passthrough/pt-engine.ts","../../src/base/passthrough/pt.ts","../../src/base/ngn-instance.ts","../../src/base/base.ts","../../src/base/value-control-base.ts","../../src/base/ngneers-controls-base.ts"],"sourcesContent":["import { computed, ElementRef, inject, type Signal, signal } from '@angular/core';\r\nimport {\r\n type ControlTemplateInfo,\r\n type AppliedThemeClassCfg,\r\n getAppliedClasses,\r\n} from '@ngneers/controls/api/ng';\r\nimport { getPropertyIfExists, objectKeys } from '@ngneers/controls/utils';\r\nimport { classSignal, effectWithPrevious } from '@ngneers/controls/utils-ng';\r\n\r\nimport type { AnyNgnPassthrough, PassthroughValue } from './types';\r\nimport type { NgnBase, NgnBaseSafe } from '../base';\r\nimport type { ControlName, ControlTemplate } from '@ngneers/controls-themes';\r\n\r\nexport class NgnPtEngine<T extends NgnBaseSafe<Name>, Name extends ControlName> {\r\n private readonly pt: Signal<NgnBase<Name>>;\r\n private readonly ptClass: Signal<\r\n AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>\r\n >;\r\n\r\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly classes = computed(() => {\r\n const pt = this.pt();\r\n if ('theme' in pt) {\r\n const theme = pt['theme'] as ControlTemplateInfo<ControlTemplate<Name>>;\r\n const res = getAppliedClasses(this.ptClass(), theme);\r\n return res;\r\n }\r\n return [];\r\n });\r\n\r\n private readonly _appliedPts = computed(() => {\r\n const pt = this.pt()?.pt() as AnyNgnPassthrough;\r\n if (!pt) {\r\n return;\r\n }\r\n const classes = this.classes();\r\n return classes.map(({ name: ptClass }) => {\r\n const classPt = getPropertyIfExists(pt, ptClass);\r\n return classPt;\r\n });\r\n });\r\n\r\n constructor(\r\n pt: Signal<T> | T,\r\n ptClass:\r\n | Signal<\r\n AppliedThemeClassCfg<\r\n T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never\r\n >\r\n >\r\n | AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>\r\n ) {\r\n const sigPt = typeof pt === 'function' ? pt : signal(pt);\r\n const sigPtClass = typeof ptClass === 'function' ? ptClass : signal(ptClass);\r\n\r\n this.pt = sigPt as unknown as Signal<NgnBase<Name>>;\r\n this.ptClass = sigPtClass;\r\n\r\n const classes = computed(() => this.classes().map(c => c.class));\r\n classSignal(this._elementRef.nativeElement, classes);\r\n\r\n effectWithPrevious(this._appliedPts, (current, previous) => {\r\n if (previous) {\r\n for (const classPt of previous) {\r\n if (!classPt) {\r\n continue;\r\n }\r\n this.removePreviousPtValues(classPt);\r\n }\r\n }\r\n if (current) {\r\n for (const classPt of current) {\r\n if (!classPt) {\r\n continue;\r\n }\r\n this.setNewPtValues(classPt);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private setNewPtValues(classPt: PassthroughValue) {\r\n if (classPt.$styles) {\r\n const keys = objectKeys(classPt.$styles);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.style[key as any] = (classPt.$styles?.[key] as string) || '';\r\n });\r\n }\r\n if (classPt.$attributes) {\r\n const keys = objectKeys(classPt.$attributes);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.setAttribute(\r\n key as string,\r\n (classPt.$attributes?.[key] as string) || ''\r\n );\r\n });\r\n }\r\n if (classPt.$classes) {\r\n const arrayOfClasses = Array.isArray(classPt.$classes)\r\n ? classPt.$classes.flatMap(c => c.split(' '))\r\n : classPt.$classes.split(' ');\r\n arrayOfClasses.forEach(cls => {\r\n try {\r\n this._elementRef.nativeElement.classList.add(cls);\r\n } catch {\r\n console.warn(`Could not add class '${cls}' to element`, this._elementRef.nativeElement);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private removePreviousPtValues(classPt: PassthroughValue) {\r\n if (classPt.$styles) {\r\n const keys = objectKeys(classPt.$styles);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.style[key as any] = '';\r\n });\r\n }\r\n if (classPt.$attributes) {\r\n const keys = objectKeys(classPt.$attributes);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.removeAttribute(key as string);\r\n });\r\n }\r\n if (classPt.$classes) {\r\n const arrayOfClasses = Array.isArray(classPt.$classes)\r\n ? classPt.$classes.flatMap(c => c.split(' '))\r\n : classPt.$classes.split(' ');\r\n arrayOfClasses.forEach(cls => {\r\n try {\r\n this._elementRef.nativeElement.classList.remove(cls);\r\n } catch {\r\n console.warn(\r\n `Could not remove class '${cls}' from element`,\r\n this._elementRef.nativeElement\r\n );\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { Directive, input } from '@angular/core';\r\n\r\nimport { NgnPtEngine } from './pt-engine';\r\n\r\nimport type { NgnBaseSafe } from '../base';\r\nimport type { AppliedThemeClassCfg } from '@ngneers/controls/api/ng';\r\nimport type { ControlName } from '@ngneers/controls-themes';\r\n\r\n// eslint-disable-next-line @angular-eslint/directive-selector\r\n@Directive({ selector: '[ptInt]' })\r\nexport class NgnPt<T extends NgnBaseSafe<Name>, Name extends ControlName> {\r\n public readonly ptInt = input.required<T>();\r\n public readonly ptClass =\r\n input.required<\r\n AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>\r\n >();\r\n\r\n private readonly _engine = new NgnPtEngine(this.ptInt, this.ptClass);\r\n}\r\n","import { afterNextRender, DestroyRef, inject, signal, type Signal, Type } from '@angular/core';\r\n\r\nimport type { AnyNgnBase, FullAnyNgnBase } from './base';\r\n\r\nconst NGN_INSTANCE_KEY = '__ngneers_control_instance__';\r\n\r\nfunction elementWithInstance(\r\n element: HTMLElement\r\n): HTMLElement & { [NGN_INSTANCE_KEY]?: AnyNgnBase } {\r\n return element as HTMLElement & { [NGN_INSTANCE_KEY]?: FullAnyNgnBase };\r\n}\r\n\r\nexport function setNgnInstance(element: HTMLElement, instance: AnyNgnBase): void {\r\n elementWithInstance(element)[NGN_INSTANCE_KEY] = instance;\r\n inject(DestroyRef).onDestroy(() => {\r\n delete elementWithInstance(element)[NGN_INSTANCE_KEY];\r\n });\r\n}\r\n\r\nexport function getNgnInstance(element: HTMLElement): FullAnyNgnBase {\r\n return elementWithInstance(element)[NGN_INSTANCE_KEY] as FullAnyNgnBase;\r\n}\r\n\r\nexport function getNearestNgnInstance<T extends Type<Omit<AnyNgnBase, 'kind'>>>(\r\n element: HTMLElement,\r\n kind?: T\r\n): InstanceType<T> | null {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n const instance = elementWithInstance(current)[NGN_INSTANCE_KEY] as FullAnyNgnBase | undefined;\r\n if (instance && (!kind || instance instanceof kind)) {\r\n return instance as InstanceType<T>;\r\n }\r\n current = current.parentElement;\r\n }\r\n return null;\r\n}\r\n\r\nexport function getNearestNgnInstanceSig<T extends Type<AnyNgnBase>>(\r\n element: HTMLElement,\r\n kind?: T\r\n): Signal<InstanceType<T> | null> {\r\n const sig = signal<InstanceType<T> | null>(null);\r\n afterNextRender(() => {\r\n sig.set(getNearestNgnInstance(element, kind));\r\n });\r\n return sig;\r\n}\r\n","import {\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n DestroyRef,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n InjectionToken,\r\n Injector,\r\n input,\r\n type InputSignal,\r\n type Provider,\r\n signal,\r\n type Signal,\r\n Type,\r\n viewChildren,\r\n} from '@angular/core';\r\nimport {\r\n type ControlTemplateInfo,\r\n injectThemeTemplate,\r\n injectThemeControlKinds,\r\n injectThemeColors,\r\n type AppliedThemeClassCfg,\r\n} from '@ngneers/controls/api/ng';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { effectWithPrevious, setInputSignalValue } from '@ngneers/controls/utils-ng';\r\n\r\nimport { setNgnInstance } from './ngn-instance';\r\nimport { type NgnPassthrough, NgnPtEngine } from './passthrough';\r\n\r\nimport type { CustomColor, CustomKind } from '@ngneers/controls-custom-types';\r\nimport type { ControlTemplate } from '@ngneers/controls-themes';\r\nimport type { ControlName, ThemeTemplate } from '@ngneers/controls-themes/templates';\r\n\r\nexport const NGN_CONTROL = new InjectionToken<NgnBase<never>>('NGN_CONTROL');\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type AnyNgnBase = NgnBaseSafe<any>;\r\nexport type NgnBaseSafe<T extends ControlName | null> = Omit<\r\n NgnBase<T>,\r\n 'kind' | 'appliedKind' | 'pt'\r\n>;\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nexport type FullAnyNgnBase = Omit<NgnBase<any>, 'kind' | 'appliedKind' | 'pt'> & {\r\n kind: InputSignal<CustomKind<any> | undefined>;\r\n appliedKind: InputSignal<CustomKind<any> | undefined>;\r\n pt: InputSignal<NgnPassthrough<any> | undefined>;\r\n};\r\n/* eslint-enable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * @internal\r\n * Provides the control itself for dependency injection.\r\n * @param control - The control class to provide.\r\n * @returns A provider for the control itself.\r\n */\r\nexport function provideSelf(control: Type<unknown>): Provider {\r\n return { provide: NGN_CONTROL, useExisting: forwardRef(() => control) };\r\n}\r\n\r\n@Directive({\r\n host: { class: 'ngn-control ngn-control-initializing' },\r\n})\r\nexport abstract class NgnBase<T extends ControlName | null> {\r\n protected abstract theme: ControlTemplateInfo<never> | null;\r\n\r\n private readonly _defaultKind = signal<CustomKind<T> | undefined>(undefined);\r\n private readonly _defaultColor = signal<CustomColor | undefined>(undefined);\r\n\r\n /**\r\n * The element reference for the host element.\r\n */\r\n public readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n /**\r\n * The injector for the component.\r\n */\r\n public readonly injector = inject(Injector);\r\n /**\r\n * If true, the control will not apply any theme styles.\r\n * The base styles of the control will still be applied.\r\n * @default false\r\n */\r\n public readonly unstyled = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Some controls support custom kinds for styling purposes.\r\n * The available kinds depend on the control and the theme used.\r\n *\r\n * TODO: link to custom types documentation\r\n */\r\n public readonly kind = input<CustomKind<T> | undefined>(undefined as never);\r\n public readonly color = input<CustomColor | undefined>(undefined as never);\r\n\r\n public readonly appliedKind = computed<CustomKind<T> | undefined>(\r\n () => this.kind() ?? this._defaultKind()\r\n );\r\n public readonly appliedColor = computed<CustomColor | undefined>(\r\n () => this.color() ?? this._defaultColor()\r\n );\r\n\r\n /**\r\n * Custom passthrough attributes to apply to the control's theme classes and its dependencies.\r\n * This allows for fine-grained customization of attributes, styles and more.\r\n */\r\n public readonly pt = input<T extends string ? NgnPassthrough<T> : never>();\r\n\r\n private readonly _childNgnControls = viewChildren(NGN_CONTROL);\r\n private readonly _afterLeaveCbs: (() => void)[] = [];\r\n\r\n constructor() {\r\n setNgnInstance(this.element.nativeElement, this);\r\n this.prepareAfterLeaveHook();\r\n effect(() => {\r\n // Propagate unstyled state to direct child controls, does not affect\r\n // custom user content passed into ng-content or projected templates.\r\n this._childNgnControls().forEach(child => {\r\n setInputSignalValue(child.unstyled, this.unstyled());\r\n });\r\n });\r\n\r\n this.initializeKindAndColorClasses();\r\n\r\n afterNextRender(() => {\r\n // Remove the initializing class after the first render to prevent FOUC.\r\n this.element.nativeElement.classList.remove('ngn-control-initializing');\r\n });\r\n }\r\n\r\n /**\r\n * Prepares the after leave hook to be called when the control is destroyed\r\n * and its leave animation has finished.\r\n */\r\n private prepareAfterLeaveHook() {\r\n inject(DestroyRef).onDestroy(() => {\r\n if (typeof this.element.nativeElement.getAnimations !== 'function') {\r\n this.afterLeaveInternal();\r\n } else {\r\n /**\r\n * Recursively searches for a leave animation on the element and its parents.\r\n * @param element The element to search for leave animations.\r\n * @returns The leave animation if found, otherwise null.\r\n */\r\n function findLeaveAnimationRecursive(element: HTMLElement): Animation | null {\r\n const animations = element.getAnimations();\r\n const leaveAnimation = animations.find(\r\n a => a instanceof CSSAnimation && a.animationName.endsWith('-leave')\r\n );\r\n if (leaveAnimation) {\r\n return leaveAnimation;\r\n }\r\n if (element.parentElement) {\r\n return findLeaveAnimationRecursive(element.parentElement);\r\n }\r\n return null;\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n const leaveAnimation = findLeaveAnimationRecursive(this.element.nativeElement);\r\n if (!leaveAnimation) {\r\n this.afterLeaveInternal();\r\n } else {\r\n leaveAnimation.finished\r\n .catch(() => {\r\n // ignore errors from animations being cancelled\r\n })\r\n .finally(() => {\r\n this.afterLeaveInternal();\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n private afterLeaveInternal() {\r\n /**\r\n * After the control is hidden/removed from the DOM,\r\n * manually wipe the innerHTML to ensure no detached children remain\r\n * mapped to this component's LView slots in the browser's memory.\r\n * This is especially important for controls that use ng-content\r\n * or dynamically render child components.\r\n */\r\n this.element.nativeElement.innerHTML = '';\r\n this._afterLeaveCbs.forEach(cb => cb());\r\n this.afterLeave();\r\n }\r\n /**\r\n * Lifecycle hook that is called after the control has left (been removed from) the DOM.\r\n * Can be overridden by subclasses to perform custom actions after the leave animation.\r\n */\r\n protected afterLeave() {\r\n // Can be overridden by subclasses\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected injectThemeTemplate<External extends boolean = false>(\r\n template: External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never,\r\n hostClass?: null extends T ? never : AppliedThemeClassCfg<T & string>\r\n ): ControlTemplateInfo<\r\n External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never\r\n > {\r\n const opts = { unstyled: this.unstyled };\r\n const theme = injectThemeTemplate(template, opts);\r\n\r\n const kinds = injectThemeControlKinds(theme.scope);\r\n if (kinds.length) {\r\n this._defaultKind.set(kinds[0] as CustomKind<T>);\r\n }\r\n const colors = injectThemeColors(theme.scope);\r\n if (colors.length) {\r\n this._defaultColor.set(colors[0] as CustomColor);\r\n }\r\n\r\n if (hostClass !== undefined) {\r\n new NgnPtEngine(this, hostClass);\r\n }\r\n\r\n return theme as ControlTemplateInfo<\r\n External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never\r\n >;\r\n }\r\n\r\n /**\r\n * Toggles the kind and color theme classes based on the current values of the kind and color inputs.\r\n */\r\n private initializeKindAndColorClasses() {\r\n this.initializeAutoThemeClasses('kind', this.appliedKind);\r\n this.initializeAutoThemeClasses('color', this.appliedColor);\r\n }\r\n\r\n /**\r\n * Initializes automatic theme class toggling for a given prefix based on the provided string signal.\r\n *\r\n * ⚠️ Caution: This method assumes that the control's theme supports classes with the given prefix.\r\n *\r\n * ⚠️ Caution: Make sure the signal provides only string or nullish values.\r\n *\r\n * @param prefix The prefix for the theme class (e.g., 'kind' or 'color').\r\n * @param signal The signal that provides the current string value for the theme class.\r\n */\r\n protected initializeAutoThemeClasses(prefix: string, signal: Signal<unknown | undefined>) {\r\n const element = this.element.nativeElement;\r\n\r\n type ThemeClassToken = Parameters<ControlTemplateInfo<never>['class']>[0];\r\n /**\r\n * We can't know here whether the control has any kind or color classes,\r\n * so we cast explicitly to ThemeClassToken. In practice, controls without\r\n * kind or color classes will simply not toggle any classes as the input type does not allow it.\r\n */\r\n const classToken = (value: string): ThemeClassToken => value as unknown as ThemeClassToken;\r\n\r\n const togglePrefixedThemeClass = (prefix: string, value: unknown, enabled: boolean): void => {\r\n if (!value) {\r\n return;\r\n }\r\n const theme = this.theme;\r\n if (!theme) {\r\n return;\r\n }\r\n toggleClass(element, theme.class(classToken(`${prefix}-${value}`)), enabled);\r\n };\r\n\r\n effectWithPrevious(signal, (current, previous) => {\r\n togglePrefixedThemeClass(prefix, previous, false);\r\n togglePrefixedThemeClass(prefix, current, true);\r\n });\r\n\r\n this._afterLeaveCbs.push(() => {\r\n togglePrefixedThemeClass(prefix, signal(), false);\r\n });\r\n }\r\n}\r\n","import { booleanAttribute, Directive, input, model } from '@angular/core';\r\nimport { generateElementId } from '@ngneers/controls/utils-ng';\r\n\r\nimport { NgnBase } from './base';\r\n\r\nimport type { FormValueControl } from '@angular/forms/signals';\r\nimport type { ControlName } from '@ngneers/controls-themes/templates';\r\n\r\n@Directive()\r\nexport abstract class ValueControlBase<C extends ControlName, T>\r\n extends NgnBase<C>\r\n implements FormValueControl<T>\r\n{\r\n /**\r\n * The label for the control.\r\n */\r\n public readonly label = input<string | null>(null);\r\n /**\r\n * Sets the `aria-labelledby` attribute on the control.\r\n * @default null\r\n */\r\n public readonly labelledBy = input<string | null>(null);\r\n /**\r\n * The ID for the control\r\n * @default generateElementId()\r\n */\r\n public readonly inputId = input<string>(generateElementId());\r\n /**\r\n * Explicitly apply invalid state styling\r\n * @default false\r\n */\r\n public readonly invalid = input(false, { transform: booleanAttribute });\r\n /**\r\n * The value of the control.\r\n */\r\n public readonly value = model<T>(undefined as T);\r\n /**\r\n * Set the disabled state of the control.\r\n */\r\n public readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n public readonly readonly = input(false, { transform: booleanAttribute });\r\n\r\n public readonly touched = model(false);\r\n\r\n public readonly dirty = input(false, { transform: booleanAttribute });\r\n}\r\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-base.mjs","sources":["../../src/base/passthrough/pt-engine.ts","../../src/base/passthrough/pt.ts","../../src/base/ngn-instance.ts","../../src/base/base.ts","../../src/base/value-control-base.ts","../../src/base/ngneers-controls-base.ts"],"sourcesContent":["import { computed, ElementRef, inject, type Signal, signal } from '@angular/core';\r\nimport {\r\n type ControlTemplateInfo,\r\n type AppliedThemeClassCfg,\r\n getAppliedClasses,\r\n} from '@ngneers/controls/api/ng';\r\nimport { getPropertyIfExists, objectKeys } from '@ngneers/controls/utils';\r\nimport { classSignal, effectWithPrevious } from '@ngneers/controls/utils-ng';\r\n\r\nimport type { AnyNgnPassthrough, PassthroughValue } from './types';\r\nimport type { NgnBase, NgnBaseSafe } from '../base';\r\nimport type { ControlName, ControlTemplate } from '@ngneers/controls-themes';\r\n\r\nexport class NgnPtEngine<T extends NgnBaseSafe<Name>, Name extends ControlName> {\r\n private readonly pt: Signal<NgnBase<Name>>;\r\n private readonly ptClass: Signal<\r\n AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>\r\n >;\r\n\r\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly classes = computed(() => {\r\n const pt = this.pt();\r\n if ('theme' in pt) {\r\n const theme = pt['theme'] as ControlTemplateInfo<ControlTemplate<Name>>;\r\n const res = getAppliedClasses(this.ptClass(), theme);\r\n return res;\r\n }\r\n return [];\r\n });\r\n\r\n private readonly _appliedPts = computed(() => {\r\n const pt = this.pt()?.pt() as AnyNgnPassthrough;\r\n if (!pt) {\r\n return;\r\n }\r\n const classes = this.classes();\r\n return classes.map(({ name: ptClass }) => {\r\n const classPt = getPropertyIfExists(pt, ptClass);\r\n return classPt;\r\n });\r\n });\r\n\r\n constructor(\r\n pt: Signal<T> | T,\r\n ptClass:\r\n | Signal<\r\n AppliedThemeClassCfg<\r\n T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never\r\n >\r\n >\r\n | AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>\r\n ) {\r\n const sigPt = typeof pt === 'function' ? pt : signal(pt);\r\n const sigPtClass = typeof ptClass === 'function' ? ptClass : signal(ptClass);\r\n\r\n this.pt = sigPt as unknown as Signal<NgnBase<Name>>;\r\n this.ptClass = sigPtClass;\r\n\r\n const classes = computed(() => this.classes().map(c => c.class));\r\n classSignal(this._elementRef.nativeElement, classes);\r\n\r\n effectWithPrevious(this._appliedPts, (current, previous) => {\r\n if (previous) {\r\n for (const classPt of previous) {\r\n if (!classPt) {\r\n continue;\r\n }\r\n this.removePreviousPtValues(classPt);\r\n }\r\n }\r\n if (current) {\r\n for (const classPt of current) {\r\n if (!classPt) {\r\n continue;\r\n }\r\n this.setNewPtValues(classPt);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private setNewPtValues(classPt: PassthroughValue) {\r\n if (classPt.$styles) {\r\n const keys = objectKeys(classPt.$styles);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.style[key as any] = (classPt.$styles?.[key] as string) || '';\r\n });\r\n }\r\n if (classPt.$attributes) {\r\n const keys = objectKeys(classPt.$attributes);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.setAttribute(\r\n key as string,\r\n (classPt.$attributes?.[key] as string) || ''\r\n );\r\n });\r\n }\r\n if (classPt.$classes) {\r\n const arrayOfClasses = Array.isArray(classPt.$classes)\r\n ? classPt.$classes.flatMap(c => c.split(' '))\r\n : classPt.$classes.split(' ');\r\n arrayOfClasses.forEach(cls => {\r\n try {\r\n this._elementRef.nativeElement.classList.add(cls);\r\n } catch {\r\n console.warn(`Could not add class '${cls}' to element`, this._elementRef.nativeElement);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private removePreviousPtValues(classPt: PassthroughValue) {\r\n if (classPt.$styles) {\r\n const keys = objectKeys(classPt.$styles);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.style[key as any] = '';\r\n });\r\n }\r\n if (classPt.$attributes) {\r\n const keys = objectKeys(classPt.$attributes);\r\n keys.forEach(key => {\r\n this._elementRef.nativeElement.removeAttribute(key as string);\r\n });\r\n }\r\n if (classPt.$classes) {\r\n const arrayOfClasses = Array.isArray(classPt.$classes)\r\n ? classPt.$classes.flatMap(c => c.split(' '))\r\n : classPt.$classes.split(' ');\r\n arrayOfClasses.forEach(cls => {\r\n try {\r\n this._elementRef.nativeElement.classList.remove(cls);\r\n } catch {\r\n console.warn(\r\n `Could not remove class '${cls}' from element`,\r\n this._elementRef.nativeElement\r\n );\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { Directive, input } from '@angular/core';\r\n\r\nimport { NgnPtEngine } from './pt-engine';\r\n\r\nimport type { NgnBaseSafe } from '../base';\r\nimport type { AppliedThemeClassCfg } from '@ngneers/controls/api/ng';\r\nimport type { ControlName } from '@ngneers/controls-themes';\r\n\r\n// eslint-disable-next-line @angular-eslint/directive-selector\r\n@Directive({ selector: '[ptInt]' })\r\nexport class NgnPt<T extends NgnBaseSafe<Name>, Name extends ControlName> {\r\n public readonly ptInt = input.required<T>();\r\n public readonly ptClass =\r\n input.required<\r\n AppliedThemeClassCfg<T extends NgnBaseSafe<infer A> ? (A extends null ? never : A) : never>\r\n >();\r\n\r\n private readonly _engine = new NgnPtEngine(this.ptInt, this.ptClass);\r\n}\r\n","import { afterNextRender, DestroyRef, inject, signal, type Signal, Type } from '@angular/core';\r\n\r\nimport type { AnyNgnBase, FullAnyNgnBase } from './base';\r\n\r\nconst NGN_INSTANCE_KEY = '__ngneers_control_instance__';\r\n\r\nfunction elementWithInstance(\r\n element: HTMLElement\r\n): HTMLElement & { [NGN_INSTANCE_KEY]?: AnyNgnBase } {\r\n return element as HTMLElement & { [NGN_INSTANCE_KEY]?: FullAnyNgnBase };\r\n}\r\n\r\nexport function setNgnInstance(element: HTMLElement, instance: AnyNgnBase): void {\r\n elementWithInstance(element)[NGN_INSTANCE_KEY] = instance;\r\n inject(DestroyRef).onDestroy(() => {\r\n delete elementWithInstance(element)[NGN_INSTANCE_KEY];\r\n });\r\n}\r\n\r\nexport function getNgnInstance(element: HTMLElement): FullAnyNgnBase {\r\n return elementWithInstance(element)[NGN_INSTANCE_KEY] as FullAnyNgnBase;\r\n}\r\n\r\nexport function getNearestNgnInstance<T extends Type<Omit<AnyNgnBase, 'kind'>>>(\r\n element: HTMLElement,\r\n kind?: T\r\n): InstanceType<T> | null {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n const instance = elementWithInstance(current)[NGN_INSTANCE_KEY] as FullAnyNgnBase | undefined;\r\n if (instance && (!kind || instance instanceof kind)) {\r\n return instance as InstanceType<T>;\r\n }\r\n current = current.parentElement;\r\n }\r\n return null;\r\n}\r\n\r\nexport function getNearestNgnInstanceSig<T extends Type<AnyNgnBase>>(\r\n element: HTMLElement,\r\n kind?: T\r\n): Signal<InstanceType<T> | null> {\r\n const sig = signal<InstanceType<T> | null>(null);\r\n afterNextRender(() => {\r\n sig.set(getNearestNgnInstance(element, kind));\r\n });\r\n return sig;\r\n}\r\n","import {\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n DestroyRef,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n InjectionToken,\r\n Injector,\r\n input,\r\n type InputSignal,\r\n type Provider,\r\n signal,\r\n type Signal,\r\n Type,\r\n viewChildren,\r\n} from '@angular/core';\r\nimport {\r\n type ControlTemplateInfo,\r\n injectThemeTemplate,\r\n injectThemeControlKinds,\r\n injectThemeColors,\r\n type AppliedThemeClassCfg,\r\n} from '@ngneers/controls/api/ng';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { effectWithPrevious, setInputSignalValue } from '@ngneers/controls/utils-ng';\r\n\r\nimport { setNgnInstance } from './ngn-instance';\r\nimport { type NgnPassthrough, NgnPtEngine } from './passthrough';\r\n\r\nimport type { CustomColor, CustomKind } from '@ngneers/controls-custom-types';\r\nimport type { ControlTemplate } from '@ngneers/controls-themes';\r\nimport type { ControlName, ThemeTemplate } from '@ngneers/controls-themes/templates';\r\n\r\nexport const NGN_CONTROL = new InjectionToken<NgnBase<never>>('NGN_CONTROL');\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type AnyNgnBase = NgnBaseSafe<any>;\r\nexport type NgnBaseSafe<T extends ControlName | null> = Omit<\r\n NgnBase<T>,\r\n 'kind' | 'appliedKind' | 'pt'\r\n>;\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nexport type FullAnyNgnBase = Omit<NgnBase<any>, 'kind' | 'appliedKind' | 'pt'> & {\r\n kind: InputSignal<CustomKind<any> | undefined>;\r\n appliedKind: InputSignal<CustomKind<any> | undefined>;\r\n pt: InputSignal<NgnPassthrough<any> | undefined>;\r\n};\r\n/* eslint-enable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * @internal\r\n * Provides the control itself for dependency injection.\r\n * @param control - The control class to provide.\r\n * @returns A provider for the control itself.\r\n */\r\nexport function provideSelf(control: Type<unknown>): Provider {\r\n return { provide: NGN_CONTROL, useExisting: forwardRef(() => control) };\r\n}\r\n\r\n@Directive({\r\n host: { class: 'ngn-control ngn-control-initializing' },\r\n})\r\nexport abstract class NgnBase<T extends ControlName | null> {\r\n protected abstract theme: ControlTemplateInfo<never> | null;\r\n\r\n private readonly _defaultKind = signal<CustomKind<T> | undefined>(undefined);\r\n private readonly _defaultColor = signal<CustomColor | undefined>(undefined);\r\n\r\n /**\r\n * The element reference for the host element.\r\n */\r\n public readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n /**\r\n * The injector for the component.\r\n */\r\n public readonly injector = inject(Injector);\r\n /**\r\n * If true, the control will not apply any theme styles.\r\n * The base styles of the control will still be applied.\r\n * @default false\r\n */\r\n public readonly unstyled = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Some controls support custom kinds for styling purposes.\r\n * The available kinds depend on the control and the theme used.\r\n *\r\n * TODO: link to custom types documentation\r\n */\r\n public readonly kind = input<CustomKind<T> | undefined>(undefined as never);\r\n public readonly color = input<CustomColor | undefined>(undefined as never);\r\n\r\n public readonly appliedKind = computed<CustomKind<T> | undefined>(\r\n () => this.kind() ?? this._defaultKind()\r\n );\r\n public readonly appliedColor = computed<CustomColor | undefined>(\r\n () => this.color() ?? this._defaultColor()\r\n );\r\n\r\n /**\r\n * Custom passthrough attributes to apply to the control's theme classes and its dependencies.\r\n * This allows for fine-grained customization of attributes, styles and more.\r\n */\r\n public readonly pt = input<T extends string ? NgnPassthrough<T> : never>();\r\n\r\n private readonly _childNgnControls = viewChildren(NGN_CONTROL);\r\n private readonly _afterLeaveCbs: (() => void)[] = [];\r\n\r\n constructor() {\r\n setNgnInstance(this.element.nativeElement, this);\r\n this.prepareAfterLeaveHook();\r\n effect(() => {\r\n // Propagate unstyled state to direct child controls, does not affect\r\n // custom user content passed into ng-content or projected templates.\r\n this._childNgnControls().forEach(child => {\r\n setInputSignalValue(child.unstyled, this.unstyled());\r\n });\r\n });\r\n\r\n this.initializeKindAndColorClasses();\r\n\r\n afterNextRender(() => {\r\n // Remove the initializing class after the first render to prevent FOUC.\r\n this.element.nativeElement.classList.remove('ngn-control-initializing');\r\n });\r\n }\r\n\r\n /**\r\n * Prepares the after leave hook to be called when the control is destroyed\r\n * and its leave animation has finished.\r\n */\r\n private prepareAfterLeaveHook() {\r\n inject(DestroyRef).onDestroy(() => {\r\n if (typeof this.element.nativeElement.getAnimations !== 'function') {\r\n this.afterLeaveInternal();\r\n } else {\r\n NgnBase._enqueueLeaveCheck(this.element.nativeElement, () => this.afterLeaveInternal());\r\n }\r\n });\r\n }\r\n\r\n // --- Batched leave animation checking ---\r\n // Collects all destroyed components in the same frame into one queue,\r\n // then processes them in a single rAF to avoid layout thrashing from\r\n // interleaved getAnimations() calls and DOM mutations.\r\n\r\n private static _leaveQueue: { element: HTMLElement; callback: () => void }[] = [];\r\n private static _leaveRafScheduled = false;\r\n\r\n private static _enqueueLeaveCheck(element: HTMLElement, callback: () => void): void {\r\n NgnBase._leaveQueue.push({ element, callback });\r\n if (!NgnBase._leaveRafScheduled) {\r\n NgnBase._leaveRafScheduled = true;\r\n requestAnimationFrame(() => NgnBase._processLeaveQueue());\r\n }\r\n }\r\n\r\n private static _processLeaveQueue(): void {\r\n const queue = NgnBase._leaveQueue;\r\n NgnBase._leaveQueue = [];\r\n NgnBase._leaveRafScheduled = false;\r\n\r\n // Phase 1: Read all animations (batched queries — no interleaved mutations)\r\n const results: { animation: Animation | null; callback: () => void }[] = [];\r\n for (const { element, callback } of queue) {\r\n results.push({\r\n animation: NgnBase._findLeaveAnimation(element),\r\n callback,\r\n });\r\n }\r\n\r\n // Phase 2: Process results (no more style queries needed)\r\n for (const { animation, callback } of results) {\r\n if (!animation) {\r\n callback();\r\n } else {\r\n animation.finished\r\n .catch(() => {\r\n // ignore errors from animations being cancelled\r\n })\r\n .finally(() => {\r\n callback();\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively searches for a leave animation on the element and its parents.\r\n */\r\n private static _findLeaveAnimation(element: HTMLElement): Animation | null {\r\n const animations = element.getAnimations();\r\n const leaveAnimation = animations.find(\r\n a => a instanceof CSSAnimation && a.animationName.endsWith('-leave')\r\n );\r\n if (leaveAnimation) {\r\n return leaveAnimation;\r\n }\r\n if (element.parentElement) {\r\n return NgnBase._findLeaveAnimation(element.parentElement);\r\n }\r\n return null;\r\n }\r\n\r\n private afterLeaveInternal() {\r\n /**\r\n * After the control is hidden/removed from the DOM,\r\n * manually wipe the innerHTML to ensure no detached children remain\r\n * mapped to this component's LView slots in the browser's memory.\r\n * This is especially important for controls that use ng-content\r\n * or dynamically render child components.\r\n */\r\n this.element.nativeElement.innerHTML = '';\r\n this._afterLeaveCbs.forEach(cb => cb());\r\n this.afterLeave();\r\n }\r\n /**\r\n * Lifecycle hook that is called after the control has left (been removed from) the DOM.\r\n * Can be overridden by subclasses to perform custom actions after the leave animation.\r\n */\r\n protected afterLeave() {\r\n // Can be overridden by subclasses\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected injectThemeTemplate<External extends boolean = false>(\r\n template: External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never,\r\n hostClass?: null extends T ? never : AppliedThemeClassCfg<T & string>\r\n ): ControlTemplateInfo<\r\n External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never\r\n > {\r\n const opts = { unstyled: this.unstyled };\r\n const theme = injectThemeTemplate(template, opts);\r\n\r\n const kinds = injectThemeControlKinds(theme.scope);\r\n if (kinds.length) {\r\n this._defaultKind.set(kinds[0] as CustomKind<T>);\r\n }\r\n const colors = injectThemeColors(theme.scope);\r\n if (colors.length) {\r\n this._defaultColor.set(colors[0] as CustomColor);\r\n }\r\n\r\n if (hostClass !== undefined) {\r\n new NgnPtEngine(this, hostClass);\r\n }\r\n\r\n return theme as ControlTemplateInfo<\r\n External extends true ? ControlTemplate : T extends string ? ThemeTemplate[T] : never\r\n >;\r\n }\r\n\r\n /**\r\n * Toggles the kind and color theme classes based on the current values of the kind and color inputs.\r\n */\r\n private initializeKindAndColorClasses() {\r\n this.initializeAutoThemeClasses('kind', this.appliedKind);\r\n this.initializeAutoThemeClasses('color', this.appliedColor);\r\n }\r\n\r\n /**\r\n * Initializes automatic theme class toggling for a given prefix based on the provided string signal.\r\n *\r\n * ⚠️ Caution: This method assumes that the control's theme supports classes with the given prefix.\r\n *\r\n * ⚠️ Caution: Make sure the signal provides only string or nullish values.\r\n *\r\n * @param prefix The prefix for the theme class (e.g., 'kind' or 'color').\r\n * @param signal The signal that provides the current string value for the theme class.\r\n */\r\n protected initializeAutoThemeClasses(prefix: string, signal: Signal<unknown | undefined>) {\r\n const element = this.element.nativeElement;\r\n\r\n type ThemeClassToken = Parameters<ControlTemplateInfo<never>['class']>[0];\r\n /**\r\n * We can't know here whether the control has any kind or color classes,\r\n * so we cast explicitly to ThemeClassToken. In practice, controls without\r\n * kind or color classes will simply not toggle any classes as the input type does not allow it.\r\n */\r\n const classToken = (value: string): ThemeClassToken => value as unknown as ThemeClassToken;\r\n\r\n const togglePrefixedThemeClass = (prefix: string, value: unknown, enabled: boolean): void => {\r\n if (!value) {\r\n return;\r\n }\r\n const theme = this.theme;\r\n if (!theme) {\r\n return;\r\n }\r\n toggleClass(element, theme.class(classToken(`${prefix}-${value}`)), enabled);\r\n };\r\n\r\n effectWithPrevious(signal, (current, previous) => {\r\n togglePrefixedThemeClass(prefix, previous, false);\r\n togglePrefixedThemeClass(prefix, current, true);\r\n });\r\n\r\n this._afterLeaveCbs.push(() => {\r\n togglePrefixedThemeClass(prefix, signal(), false);\r\n });\r\n }\r\n}\r\n","import { booleanAttribute, Directive, input, model } from '@angular/core';\r\nimport { generateElementId } from '@ngneers/controls/utils-ng';\r\n\r\nimport { NgnBase } from './base';\r\n\r\nimport type { FormValueControl } from '@angular/forms/signals';\r\nimport type { ControlName } from '@ngneers/controls-themes/templates';\r\n\r\n@Directive()\r\nexport abstract class ValueControlBase<C extends ControlName, T>\r\n extends NgnBase<C>\r\n implements FormValueControl<T>\r\n{\r\n /**\r\n * The label for the control.\r\n */\r\n public readonly label = input<string | null>(null);\r\n /**\r\n * Sets the `aria-labelledby` attribute on the control.\r\n * @default null\r\n */\r\n public readonly labelledBy = input<string | null>(null);\r\n /**\r\n * The ID for the control\r\n * @default generateElementId()\r\n */\r\n public readonly inputId = input<string>(generateElementId());\r\n /**\r\n * Explicitly apply invalid state styling\r\n * @default false\r\n */\r\n public readonly invalid = input(false, { transform: booleanAttribute });\r\n /**\r\n * The value of the control.\r\n */\r\n public readonly value = model<T>(undefined as T);\r\n /**\r\n * Set the disabled state of the control.\r\n */\r\n public readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n public readonly readonly = input(false, { transform: booleanAttribute });\r\n\r\n public readonly touched = model(false);\r\n\r\n public readonly dirty = input(false, { transform: booleanAttribute });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -13,39 +13,39 @@ import { breadcrumbControlTemplate } from '@ngneers/controls-themes/templates/br
13
13
  class BreadcrumbTemplates extends NgnBase {
14
14
  // Item template
15
15
  _defaultItemTemplate = viewChild.required('defaultItemTemplate');
16
- _userItemTemplate = contentChild('item', ...(ngDevMode ? [{ debugName: "_userItemTemplate" }] : []));
16
+ _userItemTemplate = contentChild('item', ...(ngDevMode ? [{ debugName: "_userItemTemplate" }] : /* istanbul ignore next */ []));
17
17
  /**
18
18
  * Set a custom template for an item.
19
19
  * Can also be set using an `<ng-template>` element with `#item` template reference variable.
20
20
  */
21
- templateItem = input(null, ...(ngDevMode ? [{ debugName: "templateItem" }] : []));
22
- itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate(), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : []));
21
+ templateItem = input(null, ...(ngDevMode ? [{ debugName: "templateItem" }] : /* istanbul ignore next */ []));
22
+ itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate(), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
23
23
  // Separator template
24
24
  _defaultSeparatorTemplate = viewChild.required('defaultSeparatorTemplate');
25
- _userSeparatorTemplate = contentChild('separator', ...(ngDevMode ? [{ debugName: "_userSeparatorTemplate" }] : []));
25
+ _userSeparatorTemplate = contentChild('separator', ...(ngDevMode ? [{ debugName: "_userSeparatorTemplate" }] : /* istanbul ignore next */ []));
26
26
  /**
27
27
  * Set a custom template for a separator.
28
28
  * Can also be set using an `<ng-template>` element with `#separator` template reference variable.
29
29
  */
30
- templateSeparator = input(null, ...(ngDevMode ? [{ debugName: "templateSeparator" }] : []));
31
- separatorTemplate = computed(() => this._userSeparatorTemplate() ?? this.templateSeparator() ?? this._defaultSeparatorTemplate(), ...(ngDevMode ? [{ debugName: "separatorTemplate" }] : []));
30
+ templateSeparator = input(null, ...(ngDevMode ? [{ debugName: "templateSeparator" }] : /* istanbul ignore next */ []));
31
+ separatorTemplate = computed(() => this._userSeparatorTemplate() ?? this.templateSeparator() ?? this._defaultSeparatorTemplate(), ...(ngDevMode ? [{ debugName: "separatorTemplate" }] : /* istanbul ignore next */ []));
32
32
  // Overflow template
33
33
  _defaultOverflowTemplate = viewChild.required('defaultOverflowTemplate');
34
- _userOverflowTemplate = contentChild('overflow', ...(ngDevMode ? [{ debugName: "_userOverflowTemplate" }] : []));
34
+ _userOverflowTemplate = contentChild('overflow', ...(ngDevMode ? [{ debugName: "_userOverflowTemplate" }] : /* istanbul ignore next */ []));
35
35
  /**
36
36
  * Set a custom template for the overflowing items.
37
37
  * Can also be set using an `<ng-template>` element with `#overflow` template reference variable.
38
38
  */
39
- templateOverflow = input(null, ...(ngDevMode ? [{ debugName: "templateOverflow" }] : []));
40
- overflowTemplate = computed(() => this._userOverflowTemplate() ?? this.templateOverflow() ?? this._defaultOverflowTemplate(), ...(ngDevMode ? [{ debugName: "overflowTemplate" }] : []));
39
+ templateOverflow = input(null, ...(ngDevMode ? [{ debugName: "templateOverflow" }] : /* istanbul ignore next */ []));
40
+ overflowTemplate = computed(() => this._userOverflowTemplate() ?? this.templateOverflow() ?? this._defaultOverflowTemplate(), ...(ngDevMode ? [{ debugName: "overflowTemplate" }] : /* istanbul ignore next */ []));
41
41
  /**
42
42
  * Types for the breadcrumb templates.
43
43
  */
44
44
  templateTypes = templateTypesFn();
45
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: BreadcrumbTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
46
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: BreadcrumbTemplates, isStandalone: true, inputs: { templateItem: { classPropertyName: "templateItem", publicName: "templateItem", isSignal: true, isRequired: false, transformFunction: null }, templateSeparator: { classPropertyName: "templateSeparator", publicName: "templateSeparator", isSignal: true, isRequired: false, transformFunction: null }, templateOverflow: { classPropertyName: "templateOverflow", publicName: "templateOverflow", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userItemTemplate", first: true, predicate: ["item"], descendants: true, isSignal: true }, { propertyName: "_userSeparatorTemplate", first: true, predicate: ["separator"], descendants: true, isSignal: true }, { propertyName: "_userOverflowTemplate", first: true, predicate: ["overflow"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultSeparatorTemplate", first: true, predicate: ["defaultSeparatorTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultOverflowTemplate", first: true, predicate: ["defaultOverflowTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: BreadcrumbTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
46
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.2", type: BreadcrumbTemplates, isStandalone: true, inputs: { templateItem: { classPropertyName: "templateItem", publicName: "templateItem", isSignal: true, isRequired: false, transformFunction: null }, templateSeparator: { classPropertyName: "templateSeparator", publicName: "templateSeparator", isSignal: true, isRequired: false, transformFunction: null }, templateOverflow: { classPropertyName: "templateOverflow", publicName: "templateOverflow", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userItemTemplate", first: true, predicate: ["item"], descendants: true, isSignal: true }, { propertyName: "_userSeparatorTemplate", first: true, predicate: ["separator"], descendants: true, isSignal: true }, { propertyName: "_userOverflowTemplate", first: true, predicate: ["overflow"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultSeparatorTemplate", first: true, predicate: ["defaultSeparatorTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultOverflowTemplate", first: true, predicate: ["defaultOverflowTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
47
47
  }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: BreadcrumbTemplates, decorators: [{
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: BreadcrumbTemplates, decorators: [{
49
49
  type: Directive
50
50
  }], propDecorators: { _defaultItemTemplate: [{ type: i0.ViewChild, args: ['defaultItemTemplate', { isSignal: true }] }], _userItemTemplate: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], templateItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateItem", required: false }] }], _defaultSeparatorTemplate: [{ type: i0.ViewChild, args: ['defaultSeparatorTemplate', { isSignal: true }] }], _userSeparatorTemplate: [{ type: i0.ContentChild, args: ['separator', { isSignal: true }] }], templateSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateSeparator", required: false }] }], _defaultOverflowTemplate: [{ type: i0.ViewChild, args: ['defaultOverflowTemplate', { isSignal: true }] }], _userOverflowTemplate: [{ type: i0.ContentChild, args: ['overflow', { isSignal: true }] }], templateOverflow: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateOverflow", required: false }] }] } });
51
51
 
@@ -54,14 +54,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
54
54
  */
55
55
  class NgnBreadcrumb extends BreadcrumbTemplates {
56
56
  theme = this.injectThemeTemplate(breadcrumbControlTemplate, 'root');
57
- items = input.required(...(ngDevMode ? [{ debugName: "items" }] : []));
58
- iconItemSeparator = input(...(ngDevMode ? [undefined, { debugName: "iconItemSeparator" }] : []));
59
- iconOverflow = input(...(ngDevMode ? [undefined, { debugName: "iconOverflow" }] : []));
57
+ items = input.required(...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
58
+ iconItemSeparator = input(...(ngDevMode ? [undefined, { debugName: "iconItemSeparator" }] : /* istanbul ignore next */ []));
59
+ iconOverflow = input(...(ngDevMode ? [undefined, { debugName: "iconOverflow" }] : /* istanbul ignore next */ []));
60
60
  maybeCallback = maybeCallback;
61
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnBreadcrumb, deps: null, target: i0.ɵɵFactoryTarget.Component });
62
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.0", type: NgnBreadcrumb, isStandalone: true, selector: "ngn-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, iconItemSeparator: { classPropertyName: "iconItemSeparator", publicName: "iconItemSeparator", isSignal: true, isRequired: false, transformFunction: null }, iconOverflow: { classPropertyName: "iconOverflow", publicName: "iconOverflow", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnBreadcrumb)], usesInheritance: true, ngImport: i0, template: "<ngn-item-view\r\n #itemView\r\n [items]=\"items()\"\r\n [idField]=\"'id'\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateSeparator]=\"separatorTemplate()\"\r\n [templateOverflow]=\"usedOverflowTemplate\"\r\n [iconItemSeparator]=\"iconItemSeparator()\"\r\n [overflowStrategy]=\"'start'\"\r\n [overflowStrategyFreezeCount]=\"1\"\r\n/>\r\n\r\n<ng-template #usedOverflowTemplate [ngnTemplate]=\"itemView.templateTypes.overflow\" let-overflow>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: { $implicit: { icon: iconOverflow(), overflowingItems: overflow.overflowItems } }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <a\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-clickable': !!item.callback || !!item.route,\r\n }\"\r\n (click)=\"item.callback?.()\"\r\n [routerLink]=\"item.route\"\r\n >\r\n {{ maybeCallback(item.label) }}\r\n </a>\r\n</ng-template>\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\">\r\n <ngn-icon defaultIcon=\"chevron_right\" [icon]=\"separator.icon\" />\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <button #menuAnchor [ptInt]=\"this\" [ptClass]=\"'overflow'\" (click)=\"menu.show()\">\r\n <ngn-icon defaultIcon=\"ellipsis\" [icon]=\"overflow.icon\" />\r\n </button>\r\n <ngn-menu #menu [popover]=\"true\" [items]=\"overflow.overflowingItems\" [anchor]=\"menuAnchor\" />\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "component", type: NgnItemView, selector: "ngn-item-view", inputs: ["idField", "items", "separator", "iconItemSeparator", "overflowStrategy", "overflowStrategyFreezeCount", "overflowStrategyIndex", "sameWidthItems"] }, { kind: "component", type: NgnMenu, selector: "ngn-menu", inputs: ["elementId", "anchor", "items", "autoAnchorAria", "popover", "placement", "iconSubmenuIndicator", "isSubMenu", "openSubmenuOnHover", "open"], outputs: ["closed", "closing", "closeAll", "openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnBreadcrumb, deps: null, target: i0.ɵɵFactoryTarget.Component });
62
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.2", type: NgnBreadcrumb, isStandalone: true, selector: "ngn-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, iconItemSeparator: { classPropertyName: "iconItemSeparator", publicName: "iconItemSeparator", isSignal: true, isRequired: false, transformFunction: null }, iconOverflow: { classPropertyName: "iconOverflow", publicName: "iconOverflow", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnBreadcrumb)], usesInheritance: true, ngImport: i0, template: "<ngn-item-view\r\n #itemView\r\n [items]=\"items()\"\r\n [idField]=\"'id'\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateSeparator]=\"separatorTemplate()\"\r\n [templateOverflow]=\"usedOverflowTemplate\"\r\n [iconItemSeparator]=\"iconItemSeparator()\"\r\n [overflowStrategy]=\"'start'\"\r\n [overflowStrategyFreezeCount]=\"1\"\r\n/>\r\n\r\n<ng-template #usedOverflowTemplate [ngnTemplate]=\"itemView.templateTypes.overflow\" let-overflow>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: { $implicit: { icon: iconOverflow(), overflowingItems: overflow.overflowItems } }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <a\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-clickable': !!item.callback || !!item.route,\r\n }\"\r\n (click)=\"item.callback?.()\"\r\n [routerLink]=\"item.route\"\r\n >\r\n {{ maybeCallback(item.label) }}\r\n </a>\r\n</ng-template>\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\">\r\n <ngn-icon defaultIcon=\"chevron_right\" [icon]=\"separator.icon\" />\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <button #menuAnchor [ptInt]=\"this\" [ptClass]=\"'overflow'\" (click)=\"menu.show()\">\r\n <ngn-icon defaultIcon=\"ellipsis\" [icon]=\"overflow.icon\" />\r\n </button>\r\n <ngn-menu #menu [popover]=\"true\" [items]=\"overflow.overflowingItems\" [anchor]=\"menuAnchor\" />\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "component", type: NgnItemView, selector: "ngn-item-view", inputs: ["idField", "items", "separator", "iconItemSeparator", "overflowStrategy", "overflowStrategyFreezeCount", "overflowStrategyIndex", "sameWidthItems"] }, { kind: "component", type: NgnMenu, selector: "ngn-menu", inputs: ["elementId", "anchor", "items", "autoAnchorAria", "popover", "placement", "iconSubmenuIndicator", "isSubMenu", "openSubmenuOnHover", "open"], outputs: ["closed", "closing", "closeAll", "openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
63
63
  }
64
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnBreadcrumb, decorators: [{
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnBreadcrumb, decorators: [{
65
65
  type: Component,
66
66
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-breadcrumb', imports: [NgnPt, RouterLink, NgTemplateOutlet, NgnTemplate, NgnIcon, NgnItemView, NgnMenu], providers: [provideSelf(NgnBreadcrumb)], template: "<ngn-item-view\r\n #itemView\r\n [items]=\"items()\"\r\n [idField]=\"'id'\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateSeparator]=\"separatorTemplate()\"\r\n [templateOverflow]=\"usedOverflowTemplate\"\r\n [iconItemSeparator]=\"iconItemSeparator()\"\r\n [overflowStrategy]=\"'start'\"\r\n [overflowStrategyFreezeCount]=\"1\"\r\n/>\r\n\r\n<ng-template #usedOverflowTemplate [ngnTemplate]=\"itemView.templateTypes.overflow\" let-overflow>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: { $implicit: { icon: iconOverflow(), overflowingItems: overflow.overflowItems } }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <a\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-clickable': !!item.callback || !!item.route,\r\n }\"\r\n (click)=\"item.callback?.()\"\r\n [routerLink]=\"item.route\"\r\n >\r\n {{ maybeCallback(item.label) }}\r\n </a>\r\n</ng-template>\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\">\r\n <ngn-icon defaultIcon=\"chevron_right\" [icon]=\"separator.icon\" />\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <button #menuAnchor [ptInt]=\"this\" [ptClass]=\"'overflow'\" (click)=\"menu.show()\">\r\n <ngn-icon defaultIcon=\"ellipsis\" [icon]=\"overflow.icon\" />\r\n </button>\r\n <ngn-menu #menu [popover]=\"true\" [items]=\"overflow.overflowingItems\" [anchor]=\"menuAnchor\" />\r\n</ng-template>\r\n" }]
67
67
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], iconItemSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconItemSeparator", required: false }] }], iconOverflow: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOverflow", required: false }] }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-breadcrumb.mjs","sources":["../../src/breadcrumb/breadcrumb-templates.ts","../../src/breadcrumb/breadcrumb.ts","../../src/breadcrumb/breadcrumb.html","../../src/breadcrumb/ngneers-controls-breadcrumb.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { ItemTemplateType, OverflowTemplateType, SeparatorTemplateType } from './types';\r\n\r\n@Directive()\r\nexport abstract class BreadcrumbTemplates extends NgnBase<'breadcrumb'> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n\r\n // Separator template\r\n private readonly _defaultSeparatorTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.separator>\r\n >('defaultSeparatorTemplate');\r\n private readonly _userSeparatorTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.separator>>('separator');\r\n /**\r\n * Set a custom template for a separator.\r\n * Can also be set using an `<ng-template>` element with `#separator` template reference variable.\r\n */\r\n public readonly templateSeparator = input<TemplateRef<\r\n typeof this.templateTypes.separator\r\n > | null>(null);\r\n protected readonly separatorTemplate = computed(\r\n () =>\r\n this._userSeparatorTemplate() ?? this.templateSeparator() ?? this._defaultSeparatorTemplate()\r\n );\r\n\r\n // Overflow template\r\n private readonly _defaultOverflowTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.overflow>>('defaultOverflowTemplate');\r\n private readonly _userOverflowTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.overflow>>('overflow');\r\n /**\r\n * Set a custom template for the overflowing items.\r\n * Can also be set using an `<ng-template>` element with `#overflow` template reference variable.\r\n */\r\n public readonly templateOverflow = input<TemplateRef<typeof this.templateTypes.overflow> | null>(\r\n null\r\n );\r\n protected readonly overflowTemplate = computed(\r\n () => this._userOverflowTemplate() ?? this.templateOverflow() ?? this._defaultOverflowTemplate()\r\n );\r\n\r\n /**\r\n * Types for the breadcrumb templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the item template.\r\n */\r\n item: ItemTemplateType;\r\n separator: SeparatorTemplateType;\r\n overflow: OverflowTemplateType;\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnItemView } from '@ngneers/controls/item-view';\r\nimport { NgnMenu } from '@ngneers/controls/menu';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\nimport { breadcrumbControlTemplate } from '@ngneers/controls-themes/templates/breadcrumb';\r\n\r\nimport { BreadcrumbTemplates } from './breadcrumb-templates';\r\n\r\nimport type { BreadcrumbItem } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-breadcrumb',\r\n templateUrl: './breadcrumb.html',\r\n imports: [NgnPt, RouterLink, NgTemplateOutlet, NgnTemplate, NgnIcon, NgnItemView, NgnMenu],\r\n\r\n providers: [provideSelf(NgnBreadcrumb)],\r\n})\r\nexport class NgnBreadcrumb extends BreadcrumbTemplates {\r\n protected readonly theme = this.injectThemeTemplate(breadcrumbControlTemplate, 'root');\r\n\r\n public readonly items = input.required<BreadcrumbItem[]>();\r\n public readonly iconItemSeparator = input<IconType>();\r\n public readonly iconOverflow = input<IconType>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n}\r\n","<ngn-item-view\r\n #itemView\r\n [items]=\"items()\"\r\n [idField]=\"'id'\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateSeparator]=\"separatorTemplate()\"\r\n [templateOverflow]=\"usedOverflowTemplate\"\r\n [iconItemSeparator]=\"iconItemSeparator()\"\r\n [overflowStrategy]=\"'start'\"\r\n [overflowStrategyFreezeCount]=\"1\"\r\n/>\r\n\r\n<ng-template #usedOverflowTemplate [ngnTemplate]=\"itemView.templateTypes.overflow\" let-overflow>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: { $implicit: { icon: iconOverflow(), overflowingItems: overflow.overflowItems } }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <a\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-clickable': !!item.callback || !!item.route,\r\n }\"\r\n (click)=\"item.callback?.()\"\r\n [routerLink]=\"item.route\"\r\n >\r\n {{ maybeCallback(item.label) }}\r\n </a>\r\n</ng-template>\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\">\r\n <ngn-icon defaultIcon=\"chevron_right\" [icon]=\"separator.icon\" />\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <button #menuAnchor [ptInt]=\"this\" [ptClass]=\"'overflow'\" (click)=\"menu.show()\">\r\n <ngn-icon defaultIcon=\"ellipsis\" [icon]=\"overflow.icon\" />\r\n </button>\r\n <ngn-menu #menu [popover]=\"true\" [items]=\"overflow.overflowingItems\" [anchor]=\"menuAnchor\" />\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;AAOM,MAAgB,mBAAoB,SAAQ,OAAqB,CAAA;;AAEpD,IAAA,oBAAoB,GACnC,SAAS,CAAC,QAAQ,CAA8C,qBAAqB,CAAC;AACvE,IAAA,iBAAiB,GAChC,YAAY,CAA8C,MAAM,6DAAC;AACnE;;;AAGG;AACa,IAAA,YAAY,GAAG,KAAK,CAAqD,IAAI,wDAAC;IAC3E,YAAY,GAAG,QAAQ,CACxC,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACrF;;AAGgB,IAAA,yBAAyB,GAAG,SAAS,CAAC,QAAQ,CAE7D,0BAA0B,CAAC;AACZ,IAAA,sBAAsB,GACrC,YAAY,CAAmD,WAAW,kEAAC;AAC7E;;;AAGG;AACa,IAAA,iBAAiB,GAAG,KAAK,CAE/B,IAAI,6DAAC;IACI,iBAAiB,GAAG,QAAQ,CAC7C,MACE,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAChG;;AAGgB,IAAA,wBAAwB,GACvC,SAAS,CAAC,QAAQ,CAAkD,yBAAyB,CAAC;AAC/E,IAAA,qBAAqB,GACpC,YAAY,CAAkD,UAAU,iEAAC;AAC3E;;;AAGG;AACa,IAAA,gBAAgB,GAAG,KAAK,CACtC,IAAI,4DACL;IACkB,gBAAgB,GAAG,QAAQ,CAC5C,MAAM,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,wBAAwB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjG;AAED;;AAEG;IACa,aAAa,GAAG,eAAe,EAO3C;uGA3DgB,mBAAmB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,2BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,0BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBADxC;kFAImE,qBAAqB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAE3B,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAahE,0BAA0B,mFAEqC,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAeN,yBAAyB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAE/B,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC5B5E;;AAEG;AASG,MAAO,aAAc,SAAQ,mBAAmB,CAAA;IACjC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,MAAM,CAAC;AAEtE,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAoB;IAC1C,iBAAiB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;IACrC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;IAE7B,aAAa,GAAG,aAAa;uGAPrC,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFb,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBzC,isDA+CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxBY,KAAK,kFAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,8FAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,6BAAA,EAAA,uBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI9E,aAAa,EAAA,UAAA,EAAA,CAAA;kBARzB,SAAS;sCACS,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,gBAAgB,EAAA,OAAA,EAEjB,CAAC,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAA,SAAA,EAE/E,CAAC,WAAW,CAAA,aAAA,CAAe,CAAC,EAAA,QAAA,EAAA,isDAAA,EAAA;;;AEzBzC;;AAEG;;;;"}
1
+ {"version":3,"file":"ngneers-controls-breadcrumb.mjs","sources":["../../src/breadcrumb/breadcrumb-templates.ts","../../src/breadcrumb/breadcrumb.ts","../../src/breadcrumb/breadcrumb.html","../../src/breadcrumb/ngneers-controls-breadcrumb.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { ItemTemplateType, OverflowTemplateType, SeparatorTemplateType } from './types';\r\n\r\n@Directive()\r\nexport abstract class BreadcrumbTemplates extends NgnBase<'breadcrumb'> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n\r\n // Separator template\r\n private readonly _defaultSeparatorTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.separator>\r\n >('defaultSeparatorTemplate');\r\n private readonly _userSeparatorTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.separator>>('separator');\r\n /**\r\n * Set a custom template for a separator.\r\n * Can also be set using an `<ng-template>` element with `#separator` template reference variable.\r\n */\r\n public readonly templateSeparator = input<TemplateRef<\r\n typeof this.templateTypes.separator\r\n > | null>(null);\r\n protected readonly separatorTemplate = computed(\r\n () =>\r\n this._userSeparatorTemplate() ?? this.templateSeparator() ?? this._defaultSeparatorTemplate()\r\n );\r\n\r\n // Overflow template\r\n private readonly _defaultOverflowTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.overflow>>('defaultOverflowTemplate');\r\n private readonly _userOverflowTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.overflow>>('overflow');\r\n /**\r\n * Set a custom template for the overflowing items.\r\n * Can also be set using an `<ng-template>` element with `#overflow` template reference variable.\r\n */\r\n public readonly templateOverflow = input<TemplateRef<typeof this.templateTypes.overflow> | null>(\r\n null\r\n );\r\n protected readonly overflowTemplate = computed(\r\n () => this._userOverflowTemplate() ?? this.templateOverflow() ?? this._defaultOverflowTemplate()\r\n );\r\n\r\n /**\r\n * Types for the breadcrumb templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the item template.\r\n */\r\n item: ItemTemplateType;\r\n separator: SeparatorTemplateType;\r\n overflow: OverflowTemplateType;\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnItemView } from '@ngneers/controls/item-view';\r\nimport { NgnMenu } from '@ngneers/controls/menu';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\nimport { breadcrumbControlTemplate } from '@ngneers/controls-themes/templates/breadcrumb';\r\n\r\nimport { BreadcrumbTemplates } from './breadcrumb-templates';\r\n\r\nimport type { BreadcrumbItem } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-breadcrumb',\r\n templateUrl: './breadcrumb.html',\r\n imports: [NgnPt, RouterLink, NgTemplateOutlet, NgnTemplate, NgnIcon, NgnItemView, NgnMenu],\r\n\r\n providers: [provideSelf(NgnBreadcrumb)],\r\n})\r\nexport class NgnBreadcrumb extends BreadcrumbTemplates {\r\n protected readonly theme = this.injectThemeTemplate(breadcrumbControlTemplate, 'root');\r\n\r\n public readonly items = input.required<BreadcrumbItem[]>();\r\n public readonly iconItemSeparator = input<IconType>();\r\n public readonly iconOverflow = input<IconType>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n}\r\n","<ngn-item-view\r\n #itemView\r\n [items]=\"items()\"\r\n [idField]=\"'id'\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateSeparator]=\"separatorTemplate()\"\r\n [templateOverflow]=\"usedOverflowTemplate\"\r\n [iconItemSeparator]=\"iconItemSeparator()\"\r\n [overflowStrategy]=\"'start'\"\r\n [overflowStrategyFreezeCount]=\"1\"\r\n/>\r\n\r\n<ng-template #usedOverflowTemplate [ngnTemplate]=\"itemView.templateTypes.overflow\" let-overflow>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: { $implicit: { icon: iconOverflow(), overflowingItems: overflow.overflowItems } }\r\n \"\r\n ></ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <a\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-clickable': !!item.callback || !!item.route,\r\n }\"\r\n (click)=\"item.callback?.()\"\r\n [routerLink]=\"item.route\"\r\n >\r\n {{ maybeCallback(item.label) }}\r\n </a>\r\n</ng-template>\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\">\r\n <ngn-icon defaultIcon=\"chevron_right\" [icon]=\"separator.icon\" />\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <button #menuAnchor [ptInt]=\"this\" [ptClass]=\"'overflow'\" (click)=\"menu.show()\">\r\n <ngn-icon defaultIcon=\"ellipsis\" [icon]=\"overflow.icon\" />\r\n </button>\r\n <ngn-menu #menu [popover]=\"true\" [items]=\"overflow.overflowingItems\" [anchor]=\"menuAnchor\" />\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -10,14 +10,14 @@ import { buttonGroupControlTemplate } from '@ngneers/controls-themes/templates/b
10
10
  */
11
11
  class NgnButtonGroup extends NgnBase {
12
12
  theme = this.injectThemeTemplate(buttonGroupControlTemplate, 'root');
13
- _contentRef = contentChildren(NgnButton, ...(ngDevMode ? [{ debugName: "_contentRef" }] : []));
14
- _content = computed(() => this._contentRef().map(ref => ref.element.nativeElement), ...(ngDevMode ? [{ debugName: "_content" }] : []));
13
+ _contentRef = contentChildren(NgnButton, ...(ngDevMode ? [{ debugName: "_contentRef" }] : /* istanbul ignore next */ []));
14
+ _content = computed(() => this._contentRef().map(ref => ref.element.nativeElement), ...(ngDevMode ? [{ debugName: "_content" }] : /* istanbul ignore next */ []));
15
15
  _parentSize = elementSizeSignal(this.element.nativeElement);
16
16
  _contentSizes = elementsSizesSignal(this._content);
17
17
  _contentWidth = computed(() => {
18
18
  const sizes = this._contentSizes();
19
19
  return sizes.reduce((acc, size) => acc + size.width, 0);
20
- }, ...(ngDevMode ? [{ debugName: "_contentWidth" }] : []));
20
+ }, ...(ngDevMode ? [{ debugName: "_contentWidth" }] : /* istanbul ignore next */ []));
21
21
  /**
22
22
  * Defines the orientation of the button group.
23
23
  * - 'auto' - The orientation is determined based on the available space.
@@ -25,20 +25,20 @@ class NgnButtonGroup extends NgnBase {
25
25
  * - 'vertical' - The buttons are arranged vertically.
26
26
  * @default 'auto'
27
27
  */
28
- orientation = input('auto', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
28
+ orientation = input('auto', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
29
29
  appliedOrientation = computed(() => {
30
30
  if (this.orientation() === 'auto') {
31
31
  return this._contentWidth() > this._parentSize().width ? 'vertical' : 'horizontal';
32
32
  }
33
33
  return this.orientation();
34
- }, ...(ngDevMode ? [{ debugName: "appliedOrientation" }] : []));
34
+ }, ...(ngDevMode ? [{ debugName: "appliedOrientation" }] : /* istanbul ignore next */ []));
35
35
  constructor() {
36
36
  super();
37
37
  }
38
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnButtonGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
39
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.0", type: NgnButtonGroup, isStandalone: true, selector: "ngn-button-group", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnButtonGroup)], queries: [{ propertyName: "_contentRef", predicate: NgnButton, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n horizontal: appliedOrientation() === 'horizontal',\r\n vertical: appliedOrientation() === 'vertical',\r\n }\"\r\n role=\"group\"\r\n>\r\n <ng-content />\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
38
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnButtonGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
39
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.2", type: NgnButtonGroup, isStandalone: true, selector: "ngn-button-group", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnButtonGroup)], queries: [{ propertyName: "_contentRef", predicate: NgnButton, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n horizontal: appliedOrientation() === 'horizontal',\r\n vertical: appliedOrientation() === 'vertical',\r\n }\"\r\n role=\"group\"\r\n>\r\n <ng-content />\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
40
40
  }
41
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnButtonGroup, decorators: [{
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnButtonGroup, decorators: [{
42
42
  type: Component,
43
43
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-button-group', imports: [NgnPt], providers: [provideSelf(NgnButtonGroup)], template: "<div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n horizontal: appliedOrientation() === 'horizontal',\r\n vertical: appliedOrientation() === 'vertical',\r\n }\"\r\n role=\"group\"\r\n>\r\n <ng-content />\r\n</div>\r\n" }]
44
44
  }], ctorParameters: () => [], propDecorators: { _contentRef: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgnButton), { isSignal: true }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-button-group.mjs","sources":["../../src/button-group/button-group.ts","../../src/button-group/button-group.html","../../src/button-group/ngneers-controls-button-group.ts"],"sourcesContent":["import {\r\n Component,\r\n computed,\r\n contentChildren,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { elementSizeSignal, elementsSizesSignal } from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { buttonGroupControlTemplate } from '@ngneers/controls-themes/templates/button-group';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-button-group',\r\n templateUrl: './button-group.html',\r\n imports: [NgnPt],\r\n\r\n providers: [provideSelf(NgnButtonGroup)],\r\n})\r\nexport class NgnButtonGroup extends NgnBase<'buttonGroup'> {\r\n protected readonly theme = this.injectThemeTemplate(buttonGroupControlTemplate, 'root');\r\n\r\n private readonly _contentRef = contentChildren(NgnButton);\r\n private readonly _content = computed(() =>\r\n this._contentRef().map(ref => ref.element.nativeElement)\r\n );\r\n private readonly _parentSize = elementSizeSignal(this.element.nativeElement);\r\n private readonly _contentSizes = elementsSizesSignal(this._content);\r\n private readonly _contentWidth = computed(() => {\r\n const sizes = this._contentSizes();\r\n return sizes.reduce((acc, size) => acc + size.width, 0);\r\n });\r\n\r\n /**\r\n * Defines the orientation of the button group.\r\n * - 'auto' - The orientation is determined based on the available space.\r\n * - 'horizontal' - The buttons are arranged horizontally. (Default for `auto` if enough space)\r\n * - 'vertical' - The buttons are arranged vertically.\r\n * @default 'auto'\r\n */\r\n public readonly orientation = input<'auto' | 'horizontal' | 'vertical'>('auto');\r\n protected readonly appliedOrientation = computed(() => {\r\n if (this.orientation() === 'auto') {\r\n return this._contentWidth() > this._parentSize().width ? 'vertical' : 'horizontal';\r\n }\r\n return this.orientation();\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n}\r\n","<div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n horizontal: appliedOrientation() === 'horizontal',\r\n vertical: appliedOrientation() === 'vertical',\r\n }\"\r\n role=\"group\"\r\n>\r\n <ng-content />\r\n</div>\r\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-button-group.mjs","sources":["../../src/button-group/button-group.ts","../../src/button-group/button-group.html","../../src/button-group/ngneers-controls-button-group.ts"],"sourcesContent":["import {\r\n Component,\r\n computed,\r\n contentChildren,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { elementSizeSignal, elementsSizesSignal } from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { buttonGroupControlTemplate } from '@ngneers/controls-themes/templates/button-group';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-button-group',\r\n templateUrl: './button-group.html',\r\n imports: [NgnPt],\r\n\r\n providers: [provideSelf(NgnButtonGroup)],\r\n})\r\nexport class NgnButtonGroup extends NgnBase<'buttonGroup'> {\r\n protected readonly theme = this.injectThemeTemplate(buttonGroupControlTemplate, 'root');\r\n\r\n private readonly _contentRef = contentChildren(NgnButton);\r\n private readonly _content = computed(() =>\r\n this._contentRef().map(ref => ref.element.nativeElement)\r\n );\r\n private readonly _parentSize = elementSizeSignal(this.element.nativeElement);\r\n private readonly _contentSizes = elementsSizesSignal(this._content);\r\n private readonly _contentWidth = computed(() => {\r\n const sizes = this._contentSizes();\r\n return sizes.reduce((acc, size) => acc + size.width, 0);\r\n });\r\n\r\n /**\r\n * Defines the orientation of the button group.\r\n * - 'auto' - The orientation is determined based on the available space.\r\n * - 'horizontal' - The buttons are arranged horizontally. (Default for `auto` if enough space)\r\n * - 'vertical' - The buttons are arranged vertically.\r\n * @default 'auto'\r\n */\r\n public readonly orientation = input<'auto' | 'horizontal' | 'vertical'>('auto');\r\n protected readonly appliedOrientation = computed(() => {\r\n if (this.orientation() === 'auto') {\r\n return this._contentWidth() > this._parentSize().width ? 'vertical' : 'horizontal';\r\n }\r\n return this.orientation();\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n}\r\n","<div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n horizontal: appliedOrientation() === 'horizontal',\r\n vertical: appliedOrientation() === 'vertical',\r\n }\"\r\n role=\"group\"\r\n>\r\n <ng-content />\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ class NgnButton extends NgnBase {
18
18
  * Whether the button is displayed inline.
19
19
  * This will make the button height fit the current line height.
20
20
  */
21
- inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : {}), transform: booleanAttribute });
21
+ inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
22
22
  constructor() {
23
23
  super();
24
24
  toggleClass(this.element.nativeElement, this.theme.class('root'), true);
@@ -26,33 +26,39 @@ class NgnButton extends NgnBase {
26
26
  afterLeave() {
27
27
  toggleClass(this.element.nativeElement, this.theme.class('root'), false);
28
28
  }
29
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnButton, deps: [], target: i0.ɵɵFactoryTarget.Directive });
30
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgnButton, isStandalone: true, selector: "button[ngnButton], a[ngnButton]", inputs: { inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnButton)], usesInheritance: true, ngImport: i0 });
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnButton, deps: [], target: i0.ɵɵFactoryTarget.Directive });
30
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.2", type: NgnButton, isStandalone: true, selector: "button[ngnButton], a[ngnButton]", inputs: { inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnButton)], exportAs: ["ngnButton"], usesInheritance: true, ngImport: i0 });
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnButton, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnButton, decorators: [{
33
33
  type: Directive,
34
34
  args: [{
35
35
  selector: 'button[ngnButton], a[ngnButton]',
36
36
  providers: [provideSelf(NgnButton)],
37
+ exportAs: 'ngnButton',
37
38
  }]
38
39
  }], ctorParameters: () => [], propDecorators: { inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }] } });
39
40
 
40
41
  class NgnActionButton extends NgnBase {
41
42
  theme = null;
42
- config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
43
+ config = input.required(...(ngDevMode ? [{ debugName: "config" }] : /* istanbul ignore next */ []));
44
+ /**
45
+ * Whether the inner button is displayed inline (line-height sized).
46
+ * @default false
47
+ */
48
+ inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
43
49
  clicked = output();
44
50
  maybeCallback = maybeCallback;
45
51
  click(event) {
46
52
  this.clicked.emit(this.config().value);
47
53
  this.config().action?.(event);
48
54
  }
49
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnActionButton, deps: null, target: i0.ɵɵFactoryTarget.Component });
50
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnActionButton, isStandalone: true, selector: "ngn-action-button", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { clicked: "clicked" }, providers: [provideSelf(NgnActionButton)], usesInheritance: true, ngImport: i0, template: "<button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"config().kind\"\r\n [color]=\"config().color\"\r\n [disabled]=\"config().disabled\"\r\n (click)=\"click($event)\"\r\n [attr.data-test-id]=\"config().testId\"\r\n [ngnTooltip]=\"config().kind === 'icon' ? maybeCallback(config().label) : null\"\r\n>\r\n @if (config().icon || config().defaultIcon) {\r\n <ngn-icon [icon]=\"config().icon\" [defaultIcon]=\"config().defaultIcon\" />\r\n } @else {\r\n {{ maybeCallback(config().label) }}\r\n }\r\n</button>\r\n", dependencies: [{ kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnTooltip, selector: "[ngnTooltip]", inputs: ["ngnTooltip", "ngnTooltipStyleClass", "ngnTooltipShowOnlyIfTruncated", "ngnTooltipSize", "ngnTooltipOptions", "ngnTooltipPlacement", "ngnTooltipOffset", "ngnTooltipShowDelay", "ngnTooltipHideDelay", "ngnTooltipShowArrow", "ngnTooltipShowOnHover", "ngnTooltipShowOnFocus", "ngnTooltipHideOnTooltipHover", "ngnTooltipHideOnClick"], exportAs: ["ngnTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
55
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnActionButton, deps: null, target: i0.ɵɵFactoryTarget.Component });
56
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.2", type: NgnActionButton, isStandalone: true, selector: "ngn-action-button", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, providers: [provideSelf(NgnActionButton)], usesInheritance: true, ngImport: i0, template: "<button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"config().kind\"\r\n [color]=\"config().color\"\r\n [inline]=\"inline()\"\r\n [disabled]=\"config().disabled\"\r\n (click)=\"click($event)\"\r\n [attr.data-test-id]=\"config().testId\"\r\n [ngnTooltip]=\"config().kind === 'icon' ? maybeCallback(config().label) : null\"\r\n>\r\n @if (config().icon || config().defaultIcon) {\r\n <ngn-icon [icon]=\"config().icon\" [defaultIcon]=\"config().defaultIcon\" />\r\n } @else {\r\n {{ maybeCallback(config().label) }}\r\n }\r\n</button>\r\n", dependencies: [{ kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"], exportAs: ["ngnButton"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnTooltip, selector: "[ngnTooltip]", inputs: ["ngnTooltip", "ngnTooltipShowOnlyIfTruncated", "ngnTooltipSize", "ngnTooltipOptions", "ngnTooltipPlacement", "ngnTooltipOffset", "ngnTooltipShowDelay", "ngnTooltipHideDelay", "ngnTooltipShowArrow", "ngnTooltipShowOnHover", "ngnTooltipShowOnFocus", "ngnTooltipHideOnTooltipHover", "ngnTooltipHideOnClick"], exportAs: ["ngnTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
51
57
  }
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnActionButton, decorators: [{
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnActionButton, decorators: [{
53
59
  type: Component,
54
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-action-button', imports: [NgnButton, NgnIcon, NgnTooltip], providers: [provideSelf(NgnActionButton)], template: "<button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"config().kind\"\r\n [color]=\"config().color\"\r\n [disabled]=\"config().disabled\"\r\n (click)=\"click($event)\"\r\n [attr.data-test-id]=\"config().testId\"\r\n [ngnTooltip]=\"config().kind === 'icon' ? maybeCallback(config().label) : null\"\r\n>\r\n @if (config().icon || config().defaultIcon) {\r\n <ngn-icon [icon]=\"config().icon\" [defaultIcon]=\"config().defaultIcon\" />\r\n } @else {\r\n {{ maybeCallback(config().label) }}\r\n }\r\n</button>\r\n" }]
55
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
60
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-action-button', imports: [NgnButton, NgnIcon, NgnTooltip], providers: [provideSelf(NgnActionButton)], template: "<button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"config().kind\"\r\n [color]=\"config().color\"\r\n [inline]=\"inline()\"\r\n [disabled]=\"config().disabled\"\r\n (click)=\"click($event)\"\r\n [attr.data-test-id]=\"config().testId\"\r\n [ngnTooltip]=\"config().kind === 'icon' ? maybeCallback(config().label) : null\"\r\n>\r\n @if (config().icon || config().defaultIcon) {\r\n <ngn-icon [icon]=\"config().icon\" [defaultIcon]=\"config().defaultIcon\" />\r\n } @else {\r\n {{ maybeCallback(config().label) }}\r\n }\r\n</button>\r\n" }]
61
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
56
62
 
57
63
  /**
58
64
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-button.mjs","sources":["../../src/button/button.ts","../../src/button/action-button.ts","../../src/button/action-button.html","../../src/button/ngneers-controls-button.ts"],"sourcesContent":["import { booleanAttribute, Directive, input } from '@angular/core';\r\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { buttonControlTemplate } from '@ngneers/controls-themes/templates/button';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Directive({\r\n selector: 'button[ngnButton], a[ngnButton]',\r\n providers: [provideSelf(NgnButton)],\r\n})\r\nexport class NgnButton extends NgnBase<'button'> {\r\n protected readonly theme = this.injectThemeTemplate(buttonControlTemplate, {\r\n root: true,\r\n inline: () => this.inline(),\r\n });\r\n\r\n /**\r\n * Whether the button is displayed inline.\r\n * This will make the button height fit the current line height.\r\n */\r\n public readonly inline = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n super();\r\n toggleClass(this.element.nativeElement, this.theme.class('root'), true);\r\n }\r\n\r\n protected override afterLeave(): void {\r\n toggleClass(this.element.nativeElement, this.theme.class('root'), false);\r\n }\r\n}\r\n","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnTooltip } from '@ngneers/controls/tooltip';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\n\r\nimport { NgnButton } from './button';\r\n\r\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-action-button',\r\n templateUrl: 'action-button.html',\r\n imports: [NgnButton, NgnIcon, NgnTooltip],\r\n providers: [provideSelf(NgnActionButton)],\r\n})\r\nexport class NgnActionButton<T> extends NgnBase<null> {\r\n protected readonly theme = null;\r\n\r\n public readonly config = input.required<NgnActionButtonConfig<T>>();\r\n public readonly clicked = output<T>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n protected click(event: PointerEvent): void {\r\n this.clicked.emit(this.config().value);\r\n this.config().action?.(event);\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"config().kind\"\r\n [color]=\"config().color\"\r\n [disabled]=\"config().disabled\"\r\n (click)=\"click($event)\"\r\n [attr.data-test-id]=\"config().testId\"\r\n [ngnTooltip]=\"config().kind === 'icon' ? maybeCallback(config().label) : null\"\r\n>\r\n @if (config().icon || config().defaultIcon) {\r\n <ngn-icon [icon]=\"config().icon\" [defaultIcon]=\"config().defaultIcon\" />\r\n } @else {\r\n {{ maybeCallback(config().label) }}\r\n }\r\n</button>\r\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-button.mjs","sources":["../../src/button/button.ts","../../src/button/action-button.ts","../../src/button/action-button.html","../../src/button/ngneers-controls-button.ts"],"sourcesContent":["import { booleanAttribute, Directive, input } from '@angular/core';\r\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { buttonControlTemplate } from '@ngneers/controls-themes/templates/button';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Directive({\r\n selector: 'button[ngnButton], a[ngnButton]',\r\n providers: [provideSelf(NgnButton)],\r\n exportAs: 'ngnButton',\r\n})\r\nexport class NgnButton extends NgnBase<'button'> {\r\n protected readonly theme = this.injectThemeTemplate(buttonControlTemplate, {\r\n root: true,\r\n inline: () => this.inline(),\r\n });\r\n\r\n /**\r\n * Whether the button is displayed inline.\r\n * This will make the button height fit the current line height.\r\n */\r\n public readonly inline = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n super();\r\n toggleClass(this.element.nativeElement, this.theme.class('root'), true);\r\n }\r\n\r\n protected override afterLeave(): void {\r\n toggleClass(this.element.nativeElement, this.theme.class('root'), false);\r\n }\r\n}\r\n","import { booleanAttribute, Component, input, output, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnTooltip } from '@ngneers/controls/tooltip';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\n\r\nimport { NgnButton } from './button';\r\n\r\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-action-button',\r\n templateUrl: 'action-button.html',\r\n imports: [NgnButton, NgnIcon, NgnTooltip],\r\n providers: [provideSelf(NgnActionButton)],\r\n})\r\nexport class NgnActionButton<T> extends NgnBase<null> {\r\n protected readonly theme = null;\r\n\r\n public readonly config = input.required<NgnActionButtonConfig<T>>();\r\n\r\n /**\r\n * Whether the inner button is displayed inline (line-height sized).\r\n * @default false\r\n */\r\n public readonly inline = input(false, { transform: booleanAttribute });\r\n\r\n public readonly clicked = output<T>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n protected click(event: PointerEvent): void {\r\n this.clicked.emit(this.config().value);\r\n this.config().action?.(event);\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n ngnButton\r\n [kind]=\"config().kind\"\r\n [color]=\"config().color\"\r\n [inline]=\"inline()\"\r\n [disabled]=\"config().disabled\"\r\n (click)=\"click($event)\"\r\n [attr.data-test-id]=\"config().testId\"\r\n [ngnTooltip]=\"config().kind === 'icon' ? maybeCallback(config().label) : null\"\r\n>\r\n @if (config().icon || config().defaultIcon) {\r\n <ngn-icon [icon]=\"config().icon\" [defaultIcon]=\"config().defaultIcon\" />\r\n } @else {\r\n {{ maybeCallback(config().label) }}\r\n }\r\n</button>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -8,11 +8,11 @@ import { MASKS, NgnInputMask } from '@ngneers/controls/input-mask';
8
8
  class CalendarTime {
9
9
  i18n = inject(I18n).translations;
10
10
  isTouchDevice = inject(Platform).isTouchDevice();
11
- component = input.required(...(ngDevMode ? [{ debugName: "component" }] : []));
12
- currentValue = input.required(...(ngDevMode ? [{ debugName: "currentValue" }] : []));
13
- showSeconds = input.required(...(ngDevMode ? [{ debugName: "showSeconds" }] : []));
11
+ component = input.required(...(ngDevMode ? [{ debugName: "component" }] : /* istanbul ignore next */ []));
12
+ currentValue = input.required(...(ngDevMode ? [{ debugName: "currentValue" }] : /* istanbul ignore next */ []));
13
+ showSeconds = input.required(...(ngDevMode ? [{ debugName: "showSeconds" }] : /* istanbul ignore next */ []));
14
14
  timeChange = output();
15
- mask = computed(() => (this.showSeconds() ? MASKS.timeSeconds : MASKS.time), ...(ngDevMode ? [{ debugName: "mask" }] : []));
15
+ mask = computed(() => (this.showSeconds() ? MASKS.timeSeconds : MASKS.time), ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
16
16
  value = computed(() => {
17
17
  const currentValue = this.currentValue();
18
18
  if (!currentValue)
@@ -24,7 +24,7 @@ class CalendarTime {
24
24
  const minutes = padZero(currentValue.getMinutes());
25
25
  const seconds = padZero(currentValue.getSeconds());
26
26
  return this.showSeconds() ? `${hours}:${minutes}:${seconds}` : `${hours}:${minutes}`;
27
- }, ...(ngDevMode ? [{ debugName: "value" }] : []));
27
+ }, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
28
28
  onValueChange(value) {
29
29
  const [hours, minutes, seconds] = value.split(':').map(Number);
30
30
  if (hours === undefined || minutes === undefined) {
@@ -51,13 +51,13 @@ class CalendarTime {
51
51
  this.timeChange.emit(newDate);
52
52
  }
53
53
  }
54
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CalendarTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: CalendarTime, isStandalone: true, selector: "ngn-calendar-time", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, currentValue: { classPropertyName: "currentValue", publicName: "currentValue", isSignal: true, isRequired: true, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { timeChange: "timeChange" }, ngImport: i0, template: "<div>\r\n @if (isTouchDevice) {\r\n <input\r\n type=\"time\"\r\n ngnInput\r\n [step]=\"showSeconds() ? 1 : 60\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onValueChange($event || '')\"\r\n />\r\n } @else {\r\n <ngn-input-mask [mask]=\"mask()\">\r\n <input\r\n #input\r\n ngnInput\r\n type=\"text\"\r\n [value]=\"value()\"\r\n (blur)=\"onValueChange(input.value || '')\"\r\n />\r\n </ngn-input-mask>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"] }, { kind: "component", type: NgnInputMask, selector: "ngn-input-mask", inputs: ["mask"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: CalendarTime, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.2", type: CalendarTime, isStandalone: true, selector: "ngn-calendar-time", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, currentValue: { classPropertyName: "currentValue", publicName: "currentValue", isSignal: true, isRequired: true, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { timeChange: "timeChange" }, ngImport: i0, template: "<div>\r\n @if (isTouchDevice) {\r\n <input\r\n type=\"time\"\r\n ngnInput\r\n [step]=\"showSeconds() ? 1 : 60\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onValueChange($event || '')\"\r\n />\r\n } @else {\r\n <ngn-input-mask [mask]=\"mask()\">\r\n <input\r\n #input\r\n ngnInput\r\n type=\"text\"\r\n [value]=\"value()\"\r\n (blur)=\"onValueChange(input.value || '')\"\r\n />\r\n </ngn-input-mask>\r\n }\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"], exportAs: ["ngnInput"] }, { kind: "component", type: NgnInputMask, selector: "ngn-input-mask", inputs: ["mask"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
56
  }
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: CalendarTime, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: CalendarTime, decorators: [{
58
58
  type: Component,
59
59
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-calendar-time', imports: [NgnInput, NgnInputMask], template: "<div>\r\n @if (isTouchDevice) {\r\n <input\r\n type=\"time\"\r\n ngnInput\r\n [step]=\"showSeconds() ? 1 : 60\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onValueChange($event || '')\"\r\n />\r\n } @else {\r\n <ngn-input-mask [mask]=\"mask()\">\r\n <input\r\n #input\r\n ngnInput\r\n type=\"text\"\r\n [value]=\"value()\"\r\n (blur)=\"onValueChange(input.value || '')\"\r\n />\r\n </ngn-input-mask>\r\n }\r\n</div>\r\n" }]
60
60
  }], propDecorators: { component: [{ type: i0.Input, args: [{ isSignal: true, alias: "component", required: true }] }], currentValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentValue", required: true }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: true }] }], timeChange: [{ type: i0.Output, args: ["timeChange"] }] } });
61
61
 
62
62
  export { CalendarTime };
63
- //# sourceMappingURL=ngneers-controls-calendar-time-C7UnIFzU.mjs.map
63
+ //# sourceMappingURL=ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map