@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.
- package/button/src/styles/button.css +5 -1
- package/button-group/src/styles/button-group.css +6 -0
- package/confirm-popover/src/styles/confirm-popover.css +20 -0
- package/drag-drop/src/styles/_vars.css +28 -0
- package/drag-drop/src/styles/drag-drop.css +132 -0
- package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
- package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
- package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
- package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
- package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
- package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
- package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
- package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
- package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-combobox.mjs +113 -68
- package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
- package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +165 -0
- package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -0
- package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
- package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
- package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
- package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
- package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
- package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
- package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +74 -37
- package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
- package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
- package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
- package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-input-otp.mjs +69 -69
- package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
- package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
- package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
- package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-modal.mjs +221 -129
- package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
- package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-pagination.mjs +45 -36
- package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
- package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-progress.mjs +4 -1
- package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
- package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-resizable.mjs +22 -26
- package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
- package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-sheet.mjs +118 -104
- package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-sidebar.mjs +45 -24
- package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-slider.mjs +82 -75
- package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
- package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
- package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
- package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
- package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-tooltip.mjs +74 -25
- package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-utils.mjs +20 -0
- package/fesm2022/frame-ui-ng-components-utils.mjs.map +1 -0
- package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +36 -20
- package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components.mjs +1737 -845
- package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
- package/item/src/styles/item.css +188 -187
- package/modal/src/styles/modal.css +10 -1
- package/package.json +18 -2
- package/popover/src/styles/popover.css +106 -101
- package/sidebar/src/styles/sidebar.css +10 -4
- package/src/styles/blueprint.css +98 -0
- package/src/styles/components.css +2 -0
- package/styles/blueprint.css +98 -0
- package/styles/components.css +2 -0
- package/styles.css +2 -0
- package/tooltip/src/styles/tooltip.css +4 -4
- package/types/frame-ui-ng-components-accordion.d.ts +11 -4
- package/types/frame-ui-ng-components-alert.d.ts +4 -0
- package/types/frame-ui-ng-components-avatar.d.ts +7 -0
- package/types/frame-ui-ng-components-badge.d.ts +4 -0
- package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
- package/types/frame-ui-ng-components-button-group.d.ts +1 -0
- package/types/frame-ui-ng-components-button.d.ts +5 -0
- package/types/frame-ui-ng-components-calendar.d.ts +1 -0
- package/types/frame-ui-ng-components-card.d.ts +8 -3
- package/types/frame-ui-ng-components-carousel.d.ts +11 -2
- package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
- package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
- package/types/frame-ui-ng-components-combobox.d.ts +33 -4
- package/types/frame-ui-ng-components-command.d.ts +26 -4
- package/types/frame-ui-ng-components-confirm-modal.d.ts +50 -0
- package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
- package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
- package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
- package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
- package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
- package/types/frame-ui-ng-components-empty.d.ts +6 -0
- package/types/frame-ui-ng-components-field.d.ts +9 -0
- package/types/frame-ui-ng-components-forms.d.ts +1 -0
- package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
- package/types/frame-ui-ng-components-input-otp.d.ts +5 -1
- package/types/frame-ui-ng-components-input.d.ts +13 -0
- package/types/frame-ui-ng-components-item.d.ts +10 -0
- package/types/frame-ui-ng-components-menubar.d.ts +15 -0
- package/types/frame-ui-ng-components-modal.d.ts +30 -7
- package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
- package/types/frame-ui-ng-components-pagination.d.ts +8 -0
- package/types/frame-ui-ng-components-popover.d.ts +14 -2
- package/types/frame-ui-ng-components-progress.d.ts +2 -0
- package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
- package/types/frame-ui-ng-components-resizable.d.ts +3 -0
- package/types/frame-ui-ng-components-select.d.ts +23 -2
- package/types/frame-ui-ng-components-separator.d.ts +1 -0
- package/types/frame-ui-ng-components-sheet.d.ts +13 -0
- package/types/frame-ui-ng-components-sidebar.d.ts +23 -2
- package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
- package/types/frame-ui-ng-components-slider.d.ts +5 -2
- package/types/frame-ui-ng-components-spinner.d.ts +1 -0
- package/types/frame-ui-ng-components-switch.d.ts +6 -0
- package/types/frame-ui-ng-components-table.d.ts +26 -0
- package/types/frame-ui-ng-components-tabs.d.ts +4 -0
- package/types/frame-ui-ng-components-textarea.d.ts +1 -0
- package/types/frame-ui-ng-components-toast.d.ts +2 -0
- package/types/frame-ui-ng-components-toggle.d.ts +8 -2
- package/types/frame-ui-ng-components-tooltip.d.ts +11 -2
- package/types/frame-ui-ng-components-utils.d.ts +5 -0
- package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
- 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,
|
|
3
|
-
import {
|
|
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
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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 });
|