@frame-ui-ng/components 0.3.0-beta.0 → 0.4.1

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 (172) hide show
  1. package/button/src/styles/button.css +5 -1
  2. package/button-group/src/styles/button-group.css +6 -0
  3. package/confirm-popover/src/styles/confirm-popover.css +20 -0
  4. package/drag-drop/src/styles/_vars.css +28 -0
  5. package/drag-drop/src/styles/drag-drop.css +132 -0
  6. package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
  7. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  8. package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
  9. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  10. package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
  11. package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
  12. package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
  13. package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
  14. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
  15. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  16. package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
  17. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
  19. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
  21. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
  23. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
  25. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
  27. package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
  29. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-combobox.mjs +113 -68
  31. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
  33. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +165 -0
  35. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -0
  36. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
  37. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
  38. package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
  39. package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
  41. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
  43. package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
  44. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +74 -37
  45. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
  47. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
  49. package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
  51. package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
  53. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-input-otp.mjs +69 -69
  55. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
  57. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
  59. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
  61. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-modal.mjs +221 -129
  63. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
  65. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-pagination.mjs +45 -36
  67. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
  69. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-progress.mjs +4 -1
  71. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
  73. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-resizable.mjs +22 -26
  75. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
  77. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
  79. package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components-sheet.mjs +118 -104
  81. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  82. package/fesm2022/frame-ui-ng-components-sidebar.mjs +45 -24
  83. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  84. package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
  85. package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
  86. package/fesm2022/frame-ui-ng-components-slider.mjs +82 -75
  87. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  88. package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
  89. package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
  90. package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
  91. package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
  92. package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
  93. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  94. package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
  95. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  96. package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
  97. package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
  98. package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
  99. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  100. package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
  101. package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
  102. package/fesm2022/frame-ui-ng-components-tooltip.mjs +74 -25
  103. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  104. package/fesm2022/frame-ui-ng-components-utils.mjs +20 -0
  105. package/fesm2022/frame-ui-ng-components-utils.mjs.map +1 -0
  106. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +36 -20
  107. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  108. package/fesm2022/frame-ui-ng-components.mjs +1737 -845
  109. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  110. package/item/src/styles/item.css +188 -187
  111. package/modal/src/styles/modal.css +10 -1
  112. package/package.json +18 -2
  113. package/popover/src/styles/popover.css +106 -101
  114. package/sidebar/src/styles/sidebar.css +10 -4
  115. package/src/styles/blueprint.css +98 -0
  116. package/src/styles/components.css +2 -0
  117. package/styles/blueprint.css +98 -0
  118. package/styles/components.css +2 -0
  119. package/styles.css +2 -0
  120. package/tooltip/src/styles/tooltip.css +4 -4
  121. package/types/frame-ui-ng-components-accordion.d.ts +11 -4
  122. package/types/frame-ui-ng-components-alert.d.ts +4 -0
  123. package/types/frame-ui-ng-components-avatar.d.ts +7 -0
  124. package/types/frame-ui-ng-components-badge.d.ts +4 -0
  125. package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
  126. package/types/frame-ui-ng-components-button-group.d.ts +1 -0
  127. package/types/frame-ui-ng-components-button.d.ts +5 -0
  128. package/types/frame-ui-ng-components-calendar.d.ts +1 -0
  129. package/types/frame-ui-ng-components-card.d.ts +8 -3
  130. package/types/frame-ui-ng-components-carousel.d.ts +11 -2
  131. package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
  132. package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
  133. package/types/frame-ui-ng-components-combobox.d.ts +33 -4
  134. package/types/frame-ui-ng-components-command.d.ts +26 -4
  135. package/types/frame-ui-ng-components-confirm-modal.d.ts +50 -0
  136. package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
  137. package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
  138. package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
  139. package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
  140. package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
  141. package/types/frame-ui-ng-components-empty.d.ts +6 -0
  142. package/types/frame-ui-ng-components-field.d.ts +9 -0
  143. package/types/frame-ui-ng-components-forms.d.ts +1 -0
  144. package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
  145. package/types/frame-ui-ng-components-input-otp.d.ts +5 -1
  146. package/types/frame-ui-ng-components-input.d.ts +13 -0
  147. package/types/frame-ui-ng-components-item.d.ts +10 -0
  148. package/types/frame-ui-ng-components-menubar.d.ts +15 -0
  149. package/types/frame-ui-ng-components-modal.d.ts +30 -7
  150. package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
  151. package/types/frame-ui-ng-components-pagination.d.ts +8 -0
  152. package/types/frame-ui-ng-components-popover.d.ts +14 -2
  153. package/types/frame-ui-ng-components-progress.d.ts +2 -0
  154. package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
  155. package/types/frame-ui-ng-components-resizable.d.ts +3 -0
  156. package/types/frame-ui-ng-components-select.d.ts +23 -2
  157. package/types/frame-ui-ng-components-separator.d.ts +1 -0
  158. package/types/frame-ui-ng-components-sheet.d.ts +13 -0
  159. package/types/frame-ui-ng-components-sidebar.d.ts +23 -2
  160. package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
  161. package/types/frame-ui-ng-components-slider.d.ts +5 -2
  162. package/types/frame-ui-ng-components-spinner.d.ts +1 -0
  163. package/types/frame-ui-ng-components-switch.d.ts +6 -0
  164. package/types/frame-ui-ng-components-table.d.ts +26 -0
  165. package/types/frame-ui-ng-components-tabs.d.ts +4 -0
  166. package/types/frame-ui-ng-components-textarea.d.ts +1 -0
  167. package/types/frame-ui-ng-components-toast.d.ts +2 -0
  168. package/types/frame-ui-ng-components-toggle.d.ts +8 -2
  169. package/types/frame-ui-ng-components-tooltip.d.ts +11 -2
  170. package/types/frame-ui-ng-components-utils.d.ts +5 -0
  171. package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
  172. package/types/frame-ui-ng-components.d.ts +525 -96
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-collapsible.mjs","sources":["../../../projects/components/collapsible/src/collapsible.tokens.ts","../../../projects/components/collapsible/src/collapsible.content.ts","../../../projects/components/collapsible/src/collapsible.root.ts","../../../projects/components/collapsible/src/collapsible.trigger.ts","../../../projects/components/collapsible/collapsible.module.ts","../../../projects/components/collapsible/frame-ui-ng-components-collapsible.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\nexport interface FrCollapsibleContext {\n readonly contentId: Signal<string>;\n readonly disabled: Signal<boolean>;\n readonly open: Signal<boolean>;\n readonly triggerId: Signal<string>;\n toggle(): void;\n}\n\nexport const FR_COLLAPSIBLE = new InjectionToken<FrCollapsibleContext>('FrCollapsible');\n","import { Directive, ElementRef, effect, inject } from '@angular/core';\n\nimport { FR_COLLAPSIBLE } from './collapsible.tokens';\n\n@Directive({\n selector: '[frCollapsibleContent]',\n standalone: true,\n host: {\n class: 'frame-collapsible__content',\n '[attr.aria-hidden]': 'collapsible.open() ? \"false\" : \"true\"',\n '[attr.aria-labelledby]': 'collapsible.triggerId()',\n '[attr.data-state]': 'collapsible.open() ? \"open\" : \"closed\"',\n '[attr.id]': 'collapsible.contentId()',\n '(transitionend)': 'onTransitionEnd($event)',\n role: 'region',\n },\n})\nexport class FrCollapsibleContent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly collapsible = inject(FR_COLLAPSIBLE);\n private initialized = false;\n private rafId = -1;\n\n constructor() {\n effect((onCleanup) => {\n const open = this.collapsible.open();\n\n this.cancelAnimationFrame();\n\n if (!this.initialized) {\n this.applyStaticState(open);\n this.initialized = true;\n return;\n }\n\n this.animate(open);\n onCleanup(() => this.cancelAnimationFrame());\n });\n }\n\n onTransitionEnd(event: TransitionEvent): void {\n if (event.target !== this.host.nativeElement || event.propertyName !== 'height') {\n return;\n }\n\n if (!this.collapsible.open()) {\n this.host.nativeElement.style.visibility = 'hidden';\n return;\n }\n\n this.host.nativeElement.style.height = 'auto';\n }\n\n private animate(open: boolean): void {\n const element = this.host.nativeElement;\n\n if (open) {\n element.style.visibility = 'visible';\n element.style.height = '0px';\n element.style.opacity = '0';\n\n this.rafId = requestAnimationFrame(() => {\n element.style.height = `${element.scrollHeight}px`;\n element.style.opacity = '1';\n });\n return;\n }\n\n element.style.height = `${element.scrollHeight}px`;\n element.style.opacity = '1';\n\n this.rafId = requestAnimationFrame(() => {\n element.style.height = '0px';\n element.style.opacity = '0';\n });\n }\n\n private applyStaticState(open: boolean): void {\n const element = this.host.nativeElement;\n\n element.style.height = open ? 'auto' : '0px';\n element.style.opacity = open ? '1' : '0';\n element.style.visibility = open ? 'visible' : 'hidden';\n }\n\n private cancelAnimationFrame(): void {\n if (this.rafId === -1) {\n return;\n }\n\n cancelAnimationFrame(this.rafId);\n this.rafId = -1;\n }\n}\n","import {\n Directive,\n booleanAttribute,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { FR_COLLAPSIBLE } from './collapsible.tokens';\n\nlet collapsibleId = 0;\n\n@Directive({\n selector: '[frCollapsible], frame-collapsible',\n exportAs: 'frCollapsible',\n standalone: true,\n providers: [{ provide: FR_COLLAPSIBLE, useExisting: FrCollapsible }],\n host: {\n class: 'frame-collapsible',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n },\n})\nexport class FrCollapsible {\n private readonly collapsibleId = ++collapsibleId;\n private readonly internalOpen = signal(false);\n\n readonly defaultOpen = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly openInput = input<boolean | undefined>(undefined, { alias: 'open' });\n readonly openChange = output<boolean>();\n\n readonly open = computed(() => this.openInput() ?? this.internalOpen());\n readonly triggerId = computed(() => `frame-collapsible-trigger-${this.collapsibleId}`);\n readonly contentId = computed(() => `frame-collapsible-content-${this.collapsibleId}`);\n\n constructor() {\n effect(() => {\n if (this.openInput() === undefined) {\n this.internalOpen.set(this.defaultOpen());\n }\n });\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n\n this.setOpen(!this.open());\n }\n\n setOpen(open: boolean): void {\n if (this.disabled() || open === this.open()) {\n return;\n }\n\n if (this.openInput() === undefined) {\n this.internalOpen.set(open);\n }\n\n this.openChange.emit(open);\n }\n}\n","import { Directive, inject } from '@angular/core';\n\nimport { FR_COLLAPSIBLE } from './collapsible.tokens';\n\n@Directive({\n selector: 'button[frCollapsibleTrigger]',\n standalone: true,\n host: {\n class: 'frame-collapsible__trigger',\n '[attr.aria-controls]': 'collapsible.contentId()',\n '[attr.aria-expanded]': 'collapsible.open() ? \"true\" : \"false\"',\n '[attr.data-disabled]': 'collapsible.disabled() ? \"\" : null',\n '[attr.data-state]': 'collapsible.open() ? \"open\" : \"closed\"',\n '[attr.disabled]': 'collapsible.disabled() ? \"\" : null',\n '[attr.id]': 'collapsible.triggerId()',\n type: 'button',\n '(click)': 'collapsible.toggle()',\n },\n})\nexport class FrCollapsibleTrigger {\n protected readonly collapsible = inject(FR_COLLAPSIBLE);\n}\n","import { NgModule } from '@angular/core';\nimport {\n FrCollapsible,\n FrCollapsibleContent,\n FrCollapsibleTrigger,\n} from './src/collapsible';\n\n@NgModule({\n imports: [\n FrCollapsible,\n FrCollapsibleContent,\n FrCollapsibleTrigger,\n ],\n exports: [\n FrCollapsible,\n FrCollapsibleContent,\n FrCollapsibleTrigger,\n ],\n})\nexport class FrCollapsibleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-ui-ng-components-collapsible.mjs","sources":["../../../projects/components/collapsible/src/collapsible.tokens.ts","../../../projects/components/collapsible/src/collapsible.content.ts","../../../projects/components/collapsible/src/collapsible.root.ts","../../../projects/components/collapsible/src/collapsible.trigger.ts","../../../projects/components/collapsible/collapsible.module.ts","../../../projects/components/collapsible/frame-ui-ng-components-collapsible.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\nexport interface FrCollapsibleContext {\n readonly contentId: Signal<string>;\n readonly disabled: Signal<boolean>;\n readonly open: Signal<boolean>;\n readonly triggerId: Signal<string>;\n toggle(): void;\n}\n\nexport const FR_COLLAPSIBLE = new InjectionToken<FrCollapsibleContext>('FrCollapsible');\n","import { AfterViewInit, Directive, DoCheck, ElementRef, OnDestroy, inject } from '@angular/core';\r\n\r\nimport { FR_COLLAPSIBLE } from './collapsible.tokens';\r\n\r\n/** Content slot for collapsible. */\r\n@Directive({\r\n selector: '[frCollapsibleContent]',\r\n standalone: true,\r\n host: {\r\n class: 'frame-collapsible__content',\r\n '[attr.aria-hidden]': 'collapsible.open() ? \"false\" : \"true\"',\r\n '[attr.aria-labelledby]': 'collapsible.triggerId()',\r\n '[attr.data-state]': 'collapsible.open() ? \"open\" : \"closed\"',\r\n '[attr.id]': 'collapsible.contentId()',\r\n '(transitionend)': 'onTransitionEnd($event)',\r\n role: 'region',\r\n },\r\n})\r\nexport class FrCollapsibleContent implements AfterViewInit, DoCheck, OnDestroy {\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n protected readonly collapsible = inject(FR_COLLAPSIBLE);\r\n private initialized = false;\r\n private lastOpen = false;\r\n private rafId = -1;\r\n\r\n ngAfterViewInit(): void {\r\n this.lastOpen = this.collapsible.open();\r\n this.applyStaticState(this.lastOpen);\r\n this.initialized = true;\r\n }\r\n\r\n ngDoCheck(): void {\r\n const open = this.collapsible.open();\r\n\r\n if (!this.initialized || open === this.lastOpen) {\r\n return;\r\n }\r\n\r\n this.cancelAnimationFrame();\r\n this.lastOpen = open;\r\n this.animate(open);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cancelAnimationFrame();\r\n }\r\n\r\n onTransitionEnd(event: TransitionEvent): void {\r\n if (event.target !== this.host.nativeElement || event.propertyName !== 'height') {\r\n return;\r\n }\r\n\r\n if (!this.collapsible.open()) {\r\n this.host.nativeElement.style.visibility = 'hidden';\r\n return;\r\n }\r\n\r\n this.host.nativeElement.style.height = 'auto';\r\n }\r\n\r\n private animate(open: boolean): void {\r\n const element = this.host.nativeElement;\r\n\r\n if (open) {\r\n element.style.visibility = 'visible';\r\n element.style.height = '0px';\r\n element.style.opacity = '0';\r\n\r\n this.rafId = requestAnimationFrame(() => {\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.opacity = '1';\r\n });\r\n return;\r\n }\r\n\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.opacity = '1';\r\n\r\n this.rafId = requestAnimationFrame(() => {\r\n element.style.height = '0px';\r\n element.style.opacity = '0';\r\n });\r\n }\r\n\r\n private applyStaticState(open: boolean): void {\r\n const element = this.host.nativeElement;\r\n\r\n element.style.height = open ? 'auto' : '0px';\r\n element.style.opacity = open ? '1' : '0';\r\n element.style.visibility = open ? 'visible' : 'hidden';\r\n }\r\n\r\n private cancelAnimationFrame(): void {\r\n if (this.rafId === -1) {\r\n return;\r\n }\r\n\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = -1;\r\n }\r\n}\r\n","import {\r\n Directive,\r\n booleanAttribute,\r\n computed,\r\n input,\r\n linkedSignal,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { FR_COLLAPSIBLE } from './collapsible.tokens';\r\n\r\nlet collapsibleId = 0;\r\n\r\n/** Root controller for expandable collapsible content. */\r\n@Directive({\r\n selector: '[frCollapsible], frame-collapsible',\r\n exportAs: 'frCollapsible',\r\n standalone: true,\r\n providers: [{ provide: FR_COLLAPSIBLE, useExisting: FrCollapsible }],\r\n host: {\r\n class: 'frame-collapsible',\r\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\r\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\r\n },\r\n})\r\nexport class FrCollapsible {\r\n private readonly collapsibleId = ++collapsibleId;\r\n private readonly internalOpen = linkedSignal(() => this.defaultOpen());\r\n\r\n readonly defaultOpen = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly openInput = input<boolean | undefined>(undefined, { alias: 'open' });\r\n readonly openChange = output<boolean>();\r\n\r\n readonly open = computed(() => this.openInput() ?? this.internalOpen());\r\n readonly triggerId = computed(() => `frame-collapsible-trigger-${this.collapsibleId}`);\r\n readonly contentId = computed(() => `frame-collapsible-content-${this.collapsibleId}`);\r\n\r\n toggle(): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n this.setOpen(!this.open());\r\n }\r\n\r\n setOpen(open: boolean): void {\r\n if (this.disabled() || open === this.open()) {\r\n return;\r\n }\r\n\r\n if (this.openInput() === undefined) {\r\n this.internalOpen.set(open);\r\n }\r\n\r\n this.openChange.emit(open);\r\n }\r\n}\r\n\r\n","import { Directive, inject } from '@angular/core';\r\n\r\nimport { FR_COLLAPSIBLE } from './collapsible.tokens';\r\n\r\n/** Trigger control for collapsible. */\r\n@Directive({\r\n selector: 'button[frCollapsibleTrigger]',\r\n standalone: true,\r\n host: {\r\n class: 'frame-collapsible__trigger',\r\n '[attr.aria-controls]': 'collapsible.contentId()',\r\n '[attr.aria-expanded]': 'collapsible.open() ? \"true\" : \"false\"',\r\n '[attr.data-disabled]': 'collapsible.disabled() ? \"\" : null',\r\n '[attr.data-state]': 'collapsible.open() ? \"open\" : \"closed\"',\r\n '[attr.disabled]': 'collapsible.disabled() ? \"\" : null',\r\n '[attr.id]': 'collapsible.triggerId()',\r\n type: 'button',\r\n '(click)': 'collapsible.toggle()',\r\n },\r\n})\r\nexport class FrCollapsibleTrigger {\r\n protected readonly collapsible = inject(FR_COLLAPSIBLE);\r\n}\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCollapsible,\n FrCollapsibleContent,\n FrCollapsibleTrigger,\n} from './src/collapsible';\n\n@NgModule({\n imports: [\n FrCollapsible,\n FrCollapsibleContent,\n FrCollapsibleTrigger,\n ],\n exports: [\n FrCollapsible,\n FrCollapsibleContent,\n FrCollapsibleTrigger,\n ],\n})\nexport class FrCollapsibleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, TemplateRef, Directive, DestroyRef, ElementRef, signal, contentChild, input, booleanAttribute, model, computed, effect, afterNextRender, ViewChild, Component, Renderer2, NgModule } from '@angular/core';
3
- import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
2
+ import { inject, TemplateRef, Directive, DestroyRef, ElementRef, signal, viewChild, contentChild, input, booleanAttribute, model, computed, Component, afterNextRender, Renderer2, NgModule } from '@angular/core';
3
+ import { CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
4
4
  import { NgTemplateOutlet } from '@angular/common';
5
5
  import { FrControlValueAccessor, provideDsValueAccessor } from '@frame-ui-ng/components/forms';
6
6
 
7
+ /** Content slot for combobox. */
7
8
  class FrComboboxContent {
8
9
  templateRef = inject((TemplateRef));
9
10
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -16,6 +17,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
16
17
  exportAs: 'frComboboxContent',
17
18
  }]
18
19
  }] });
20
+ /** Panel slot for combobox. */
19
21
  class FrComboboxPanel {
20
22
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
21
23
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxPanel, isStandalone: true, selector: "[frComboboxPanel], frame-combobox-panel", host: { attributes: { "role": "listbox" }, classAttribute: "frame-combobox__panel" }, ngImport: i0 });
@@ -30,6 +32,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
30
32
  },
31
33
  }]
32
34
  }] });
35
+ /** List slot for combobox. */
33
36
  class FrComboboxList {
34
37
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
35
38
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxList, isStandalone: true, selector: "[frComboboxList], frame-combobox-list", host: { classAttribute: "frame-combobox__list" }, ngImport: i0 });
@@ -43,6 +46,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
43
46
  },
44
47
  }]
45
48
  }] });
49
+ /** Empty-state slot for combobox results. */
46
50
  class FrComboboxEmpty {
47
51
  root = inject(FrComboboxRootLookup);
48
52
  hidden() {
@@ -61,6 +65,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
61
65
  },
62
66
  }]
63
67
  }] });
68
+ /** Group slot for combobox. */
64
69
  class FrComboboxGroup {
65
70
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
66
71
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxGroup, isStandalone: true, selector: "[frComboboxGroup], frame-combobox-group", host: { classAttribute: "frame-combobox__group" }, ngImport: i0 });
@@ -74,6 +79,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
74
79
  },
75
80
  }]
76
81
  }] });
82
+ /** Label slot for combobox. */
77
83
  class FrComboboxLabel {
78
84
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
79
85
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxLabel, isStandalone: true, selector: "[frComboboxLabel], frame-combobox-label", host: { classAttribute: "frame-combobox__label" }, ngImport: i0 });
@@ -87,6 +93,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
87
93
  },
88
94
  }]
89
95
  }] });
96
+ /** Separator slot for combobox. */
90
97
  class FrComboboxSeparator {
91
98
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
92
99
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxSeparator, isStandalone: true, selector: "[frComboboxSeparator], frame-combobox-separator", host: { attributes: { "role": "separator" }, classAttribute: "frame-combobox__separator" }, ngImport: i0 });
@@ -101,6 +108,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
101
108
  },
102
109
  }]
103
110
  }] });
111
+ /** Collection host for combobox options. */
104
112
  class FrComboboxCollection {
105
113
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxCollection, deps: [], target: i0.ɵɵFactoryTarget.Directive });
106
114
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxCollection, isStandalone: true, selector: "[frComboboxCollection], frame-combobox-collection", host: { classAttribute: "frame-combobox__collection" }, ngImport: i0 });
@@ -115,6 +123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
115
123
  }]
116
124
  }] });
117
125
  // Resolved by the root file to avoid a circular import in decorator metadata.
126
+ /** Base API for combobox root lookup. */
118
127
  class FrComboboxRootLookup {
119
128
  }
120
129
 
@@ -134,14 +143,18 @@ const POSITIONS = [
134
143
  offsetY: -4,
135
144
  },
136
145
  ];
146
+ /** Combobox control with single and multi-value support. */
137
147
  class FrCombobox extends FrControlValueAccessor {
138
148
  destroyRef = inject(DestroyRef);
139
149
  elementRef = inject(ElementRef);
140
150
  items = new Set();
141
151
  itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
142
152
  selectedLabels = new Map();
153
+ lastAutoHighlight = false;
154
+ lastItemsVersion = -1;
155
+ lastQuery = '';
143
156
  resizeObserver = null;
144
- origin;
157
+ origin = viewChild(CdkOverlayOrigin, ...(ngDevMode ? [{ debugName: "origin" }] : /* istanbul ignore next */ []));
145
158
  content = contentChild(FrComboboxContent, ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
146
159
  autoHighlight = input(false, { ...(ngDevMode ? { debugName: "autoHighlight" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
147
160
  debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -176,18 +189,6 @@ class FrCombobox extends FrControlValueAccessor {
176
189
  hasValue = computed(() => this.selectedValues().length > 0 || this.query().length > 0, ...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
177
190
  constructor() {
178
191
  super();
179
- effect(() => {
180
- if (this.debugVisible()) {
181
- afterNextRender(() => this.open());
182
- }
183
- });
184
- effect(() => {
185
- this.query();
186
- this.itemsVersion();
187
- if (this.autoHighlight()) {
188
- this.highlightedIndex.set(0);
189
- }
190
- });
191
192
  queueMicrotask(() => {
192
193
  this.measureAnchor();
193
194
  this.attachResizeObserver();
@@ -196,6 +197,29 @@ class FrCombobox extends FrControlValueAccessor {
196
197
  this.resizeObserver?.disconnect();
197
198
  });
198
199
  }
200
+ ngAfterViewInit() {
201
+ if (this.debugVisible()) {
202
+ this.open();
203
+ }
204
+ }
205
+ ngDoCheck() {
206
+ if (this.debugVisible() && !this.isOpen()) {
207
+ this.open();
208
+ }
209
+ const autoHighlight = this.autoHighlight();
210
+ const itemsVersion = this.itemsVersion();
211
+ const query = this.query();
212
+ if (autoHighlight &&
213
+ (query !== this.lastQuery ||
214
+ itemsVersion !== this.lastItemsVersion ||
215
+ autoHighlight !== this.lastAutoHighlight)) {
216
+ // Filtering can invalidate the current index, so restart highlight at the first visible item.
217
+ this.highlightedIndex.set(0);
218
+ }
219
+ this.lastAutoHighlight = autoHighlight;
220
+ this.lastItemsVersion = itemsVersion;
221
+ this.lastQuery = query;
222
+ }
199
223
  registerItem(item) {
200
224
  this.items.add(item);
201
225
  this.bumpItems();
@@ -204,6 +228,9 @@ class FrCombobox extends FrControlValueAccessor {
204
228
  this.items.delete(item);
205
229
  this.bumpItems();
206
230
  }
231
+ refreshItems() {
232
+ this.bumpItems();
233
+ }
207
234
  visibleItems() {
208
235
  this.itemsVersion();
209
236
  return Array.from(this.items).filter((item) => item.isVisible());
@@ -308,18 +335,19 @@ class FrCombobox extends FrControlValueAccessor {
308
335
  this.itemsVersion.update((value) => value + 1);
309
336
  }
310
337
  measureAnchor() {
311
- const element = this.origin?.elementRef.nativeElement ?? this.elementRef.nativeElement;
338
+ const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
312
339
  if (typeof element?.getBoundingClientRect !== 'function') {
313
340
  this.anchorWidth.set(null);
314
341
  return;
315
342
  }
343
+ // Match the overlay width to the trigger even when content is rendered in the CDK overlay.
316
344
  this.anchorWidth.set(element.getBoundingClientRect().width || null);
317
345
  }
318
346
  attachResizeObserver() {
319
347
  if (typeof ResizeObserver === 'undefined') {
320
348
  return;
321
349
  }
322
- const element = this.origin?.elementRef.nativeElement ?? this.elementRef.nativeElement;
350
+ const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
323
351
  if (typeof element?.getBoundingClientRect !== 'function') {
324
352
  return;
325
353
  }
@@ -333,27 +361,27 @@ class FrCombobox extends FrControlValueAccessor {
333
361
  provide: FrComboboxRootLookup,
334
362
  useExisting: FrCombobox,
335
363
  },
336
- ], queries: [{ propertyName: "content", first: true, predicate: FrComboboxContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "origin", first: true, predicate: CdkOverlayOrigin, descendants: true }], exportAs: ["frCombobox"], usesInheritance: true, ngImport: i0, template: `
337
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
338
- <ng-content />
339
- </span>
340
-
341
- <ng-template
342
- cdkConnectedOverlay
343
- [cdkConnectedOverlayOrigin]="origin"
344
- [cdkConnectedOverlayOpen]="isOpen()"
345
- [cdkConnectedOverlayPositions]="positions"
346
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
347
- [cdkConnectedOverlayWidth]="overlayMinWidth()"
348
- [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
349
- (overlayOutsideClick)="close()"
350
- (positionChange)="handlePositionChange($event)"
351
- (detach)="close()"
352
- >
353
- @if (content()) {
354
- <ng-container [ngTemplateOutlet]="content()!.templateRef" />
355
- }
356
- </ng-template>
364
+ ], queries: [{ propertyName: "content", first: true, predicate: FrComboboxContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "origin", first: true, predicate: CdkOverlayOrigin, descendants: true, isSignal: true }], exportAs: ["frCombobox"], usesInheritance: true, ngImport: i0, template: `
365
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
366
+ <ng-content />
367
+ </span>
368
+
369
+ <ng-template
370
+ cdkConnectedOverlay
371
+ [cdkConnectedOverlayOrigin]="origin"
372
+ [cdkConnectedOverlayOpen]="isOpen()"
373
+ [cdkConnectedOverlayPositions]="positions"
374
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
375
+ [cdkConnectedOverlayWidth]="overlayMinWidth()"
376
+ [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
377
+ (overlayOutsideClick)="close()"
378
+ (positionChange)="handlePositionChange($event)"
379
+ (detach)="close()"
380
+ >
381
+ @if (content()) {
382
+ <ng-container [ngTemplateOutlet]="content()!.templateRef" />
383
+ }
384
+ </ng-template>
357
385
  `, isInline: true, dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
358
386
  }
359
387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCombobox, decorators: [{
@@ -374,34 +402,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
374
402
  '[attr.data-disabled]': 'disabled() ? "" : null',
375
403
  '[attr.data-invalid]': 'invalid() ? "" : null'
376
404
  },
377
- template: `
378
- <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
379
- <ng-content />
380
- </span>
381
-
382
- <ng-template
383
- cdkConnectedOverlay
384
- [cdkConnectedOverlayOrigin]="origin"
385
- [cdkConnectedOverlayOpen]="isOpen()"
386
- [cdkConnectedOverlayPositions]="positions"
387
- [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
388
- [cdkConnectedOverlayWidth]="overlayMinWidth()"
389
- [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
390
- (overlayOutsideClick)="close()"
391
- (positionChange)="handlePositionChange($event)"
392
- (detach)="close()"
393
- >
394
- @if (content()) {
395
- <ng-container [ngTemplateOutlet]="content()!.templateRef" />
396
- }
397
- </ng-template>
405
+ template: `
406
+ <span cdkOverlayOrigin #origin="cdkOverlayOrigin" class="frame-combobox__anchor">
407
+ <ng-content />
408
+ </span>
409
+
410
+ <ng-template
411
+ cdkConnectedOverlay
412
+ [cdkConnectedOverlayOrigin]="origin"
413
+ [cdkConnectedOverlayOpen]="isOpen()"
414
+ [cdkConnectedOverlayPositions]="positions"
415
+ [cdkConnectedOverlayPanelClass]="overlayPanelClasses()"
416
+ [cdkConnectedOverlayWidth]="overlayMinWidth()"
417
+ [cdkConnectedOverlayMinWidth]="overlayMinWidth()"
418
+ (overlayOutsideClick)="close()"
419
+ (positionChange)="handlePositionChange($event)"
420
+ (detach)="close()"
421
+ >
422
+ @if (content()) {
423
+ <ng-container [ngTemplateOutlet]="content()!.templateRef" />
424
+ }
425
+ </ng-template>
398
426
  `,
399
427
  }]
400
- }], ctorParameters: () => [], propDecorators: { origin: [{
401
- type: ViewChild,
402
- args: [CdkOverlayOrigin]
403
- }], content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FrComboboxContent), { isSignal: true }] }], autoHighlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHighlight", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], itemToStringValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemToStringValue", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
428
+ }], ctorParameters: () => [], propDecorators: { origin: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkOverlayOrigin), { isSignal: true }] }], content: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FrComboboxContent), { isSignal: true }] }], autoHighlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHighlight", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], itemToStringValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemToStringValue", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
404
429
 
430
+ /** Search input for combobox filtering. */
405
431
  class FrComboboxInput {
406
432
  root = inject(FrCombobox);
407
433
  elementRef = inject(ElementRef);
@@ -459,6 +485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
459
485
  },
460
486
  }]
461
487
  }] });
488
+ /** Trigger control for combobox. */
462
489
  class FrComboboxTrigger {
463
490
  root = inject(FrCombobox);
464
491
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -478,6 +505,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
478
505
  },
479
506
  }]
480
507
  }] });
508
+ /** Clear control for combobox values. */
481
509
  class FrComboboxClear {
482
510
  root = inject(FrCombobox);
483
511
  hidden() {
@@ -499,6 +527,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
499
527
  }]
500
528
  }] });
501
529
 
530
+ /** Item slot for combobox. */
502
531
  class FrComboboxItem {
503
532
  destroyRef = inject(DestroyRef);
504
533
  elementRef = inject(ElementRef);
@@ -508,6 +537,7 @@ class FrComboboxItem {
508
537
  itemLabel = input(null, { ...(ngDevMode ? { debugName: "itemLabel" } : /* istanbul ignore next */ {}), alias: 'label' });
509
538
  value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
510
539
  resolvedLabel = signal('', ...(ngDevMode ? [{ debugName: "resolvedLabel" }] : /* istanbul ignore next */ []));
540
+ lastItemStateKey = '';
511
541
  label = computed(() => this.itemLabel() ?? this.resolvedLabel(), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
512
542
  visible = computed(() => this.root.itemVisible(this.label()), ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
513
543
  constructor() {
@@ -520,11 +550,17 @@ class FrComboboxItem {
520
550
  this.refreshResolvedLabel();
521
551
  this.observeTextChanges();
522
552
  });
523
- effect(() => {
524
- if (this.root.isSelected(this.value())) {
525
- this.root.rememberItemLabel(this.value(), this.label());
526
- }
527
- });
553
+ }
554
+ ngDoCheck() {
555
+ const itemStateKey = `${this.label()}|${this.disabled()}|${this.root.isSelected(this.value())}`;
556
+ if (itemStateKey === this.lastItemStateKey) {
557
+ return;
558
+ }
559
+ this.lastItemStateKey = itemStateKey;
560
+ this.root.refreshItems();
561
+ if (this.root.isSelected(this.value())) {
562
+ this.root.rememberItemLabel(this.value(), this.label());
563
+ }
528
564
  }
529
565
  isVisible() {
530
566
  return this.visible();
@@ -551,11 +587,13 @@ class FrComboboxItem {
551
587
  }
552
588
  refreshResolvedLabel() {
553
589
  this.resolvedLabel.set(this.resolveLabel());
590
+ this.root.refreshItems();
554
591
  }
555
592
  observeTextChanges() {
556
593
  if (typeof MutationObserver === 'undefined' || this.itemLabel() !== null) {
557
594
  return;
558
595
  }
596
+ // Items without explicit labels derive filtering text from projected content.
559
597
  this.mutationObserver = new MutationObserver(() => this.refreshResolvedLabel());
560
598
  this.mutationObserver.observe(this.elementRef.nativeElement, {
561
599
  characterData: true,
@@ -584,6 +622,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
584
622
  },
585
623
  }]
586
624
  }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], itemLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }] } });
625
+ /** Indicator slot for combobox item. */
587
626
  class FrComboboxItemIndicator {
588
627
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
589
628
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxItemIndicator, isStandalone: true, selector: "[frComboboxItemIndicator]", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-combobox__item-indicator" }, ngImport: i0 });
@@ -599,6 +638,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
599
638
  }]
600
639
  }] });
601
640
 
641
+ /** Chip list for multi-value combobox selections. */
602
642
  class FrComboboxChips {
603
643
  root = inject(FrCombobox);
604
644
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxChips, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -615,6 +655,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
615
655
  },
616
656
  }]
617
657
  }] });
658
+ /** List slot for combobox value. */
618
659
  class FrComboboxValueList {
619
660
  root = inject(FrCombobox);
620
661
  values() {
@@ -633,6 +674,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
633
674
  },
634
675
  }]
635
676
  }] });
677
+ /** Selected value chip for combobox. */
636
678
  class FrComboboxChip {
637
679
  root = inject(FrCombobox);
638
680
  elementRef = inject(ElementRef);
@@ -680,6 +722,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
680
722
  },
681
723
  }]
682
724
  }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }] } });
725
+ /** Remove control for a combobox chip. */
683
726
  class FrComboboxChipRemove {
684
727
  chip = inject(FrComboboxChip);
685
728
  remove(event) {
@@ -701,6 +744,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
701
744
  },
702
745
  }]
703
746
  }] });
747
+ /** Inline text input inside combobox chips. */
704
748
  class FrComboboxChipsInput {
705
749
  root = inject(FrCombobox);
706
750
  handleInput(event) {
@@ -743,6 +787,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
743
787
  },
744
788
  }]
745
789
  }] });
790
+ /** Error slot for combobox. */
746
791
  class FrComboboxError {
747
792
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
748
793
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxError, isStandalone: true, selector: "[frComboboxError], frame-combobox-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-combobox__error" }, ngImport: i0 });