@frame-ui-ng/components 0.5.0-beta.0 → 0.6.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/src/styles/_vars.css +2 -5
- package/accordion/src/styles/accordion.css +44 -30
- package/breadcrumb/src/styles/breadcrumb.css +12 -2
- package/button/src/styles/button.css +20 -66
- package/button-group/src/styles/button-group.css +0 -38
- package/calendar/src/styles/_vars.css +4 -0
- package/calendar/src/styles/calendar.css +26 -18
- package/carousel/src/styles/carousel.css +103 -89
- package/checkbox/src/styles/checkbox.css +14 -5
- package/collapsible/src/styles/_vars.css +1 -0
- package/collapsible/src/styles/collapsible.css +15 -11
- package/combobox/src/styles/combobox.css +11 -2
- package/confirm-popover/src/styles/confirm-popover.css +0 -1
- package/date-picker/src/styles/date-picker.css +15 -10
- package/dropdown-menu/src/styles/dropdown-menu-item.css +6 -2
- package/fesm2022/frame-ui-ng-components-accordion.mjs +201 -147
- package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-alert.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +10 -2
- package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-button-group.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-button.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-calendar.mjs +202 -50
- package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-card.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-carousel.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-collapsible.mjs +80 -22
- package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-combobox.mjs +61 -6
- package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-command.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +6 -6
- package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-date-picker.mjs +75 -37
- package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-empty.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-hover-card.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-input-otp.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-input.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-item.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-menubar.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-modal.mjs +10 -4
- package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +4 -4
- package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-pagination.mjs +20 -4
- package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-popover.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-radio-group.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-resizable.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-sheet.mjs +90 -65
- package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-table.mjs +6 -5
- package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-tabs.mjs +2 -2
- package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-toast.mjs +6 -6
- package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-tooltip.mjs +6 -6
- package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +4 -4
- package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components.mjs +850 -420
- package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
- package/input/src/styles/input-group.css +0 -7
- package/input/src/styles/input.css +0 -23
- package/modal/src/styles/modal.css +5 -19
- package/package.json +6 -6
- package/pagination/src/styles/pagination.css +6 -2
- package/popover/src/styles/popover.css +3 -3
- package/select/src/styles/select-item.css +67 -68
- package/sheet/src/styles/sheet.css +32 -19
- package/src/styles/components.css +2 -2
- package/src/styles/corner-handles.css +217 -0
- package/styles/components.css +2 -2
- package/styles/corner-handles.css +217 -0
- package/styles.css +2 -2
- package/toggle/src/styles/toggle.css +6 -1
- package/tooltip/src/styles/_vars.css +1 -1
- package/tooltip/src/styles/tooltip.css +13 -14
- package/types/frame-ui-ng-components-accordion.d.ts +69 -61
- package/types/frame-ui-ng-components-calendar.d.ts +7 -7
- package/types/frame-ui-ng-components-collapsible.d.ts +12 -4
- package/types/frame-ui-ng-components-combobox.d.ts +8 -0
- package/types/frame-ui-ng-components-date-picker.d.ts +2 -4
- package/types/frame-ui-ng-components-sheet.d.ts +6 -2
- package/types/frame-ui-ng-components.d.ts +172 -135
- package/src/styles/blueprint.css +0 -707
- package/styles/blueprint.css +0 -707
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, ElementRef, Directive, linkedSignal, input, booleanAttribute, output, computed, NgModule } from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, ElementRef, effect, Directive, linkedSignal, input, booleanAttribute, output, computed, NgModule } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
const FR_COLLAPSIBLE = new InjectionToken('FrCollapsible');
|
|
5
5
|
|
|
@@ -7,25 +7,34 @@ const FR_COLLAPSIBLE = new InjectionToken('FrCollapsible');
|
|
|
7
7
|
class FrCollapsibleContent {
|
|
8
8
|
host = inject(ElementRef);
|
|
9
9
|
collapsible = inject(FR_COLLAPSIBLE);
|
|
10
|
+
animationFrameId = -1;
|
|
10
11
|
initialized = false;
|
|
11
12
|
lastOpen = false;
|
|
12
|
-
|
|
13
|
+
mutationObserver;
|
|
14
|
+
resizeFrameId = -1;
|
|
15
|
+
resizeObserver;
|
|
16
|
+
constructor() {
|
|
17
|
+
effect(() => {
|
|
18
|
+
const open = this.collapsible.open();
|
|
19
|
+
if (!this.initialized || open === this.lastOpen) {
|
|
20
|
+
this.lastOpen = open;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.lastOpen = open;
|
|
24
|
+
this.animate(open);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
13
27
|
ngAfterViewInit() {
|
|
14
28
|
this.lastOpen = this.collapsible.open();
|
|
15
29
|
this.applyStaticState(this.lastOpen);
|
|
30
|
+
this.observeContentSize();
|
|
16
31
|
this.initialized = true;
|
|
17
32
|
}
|
|
18
|
-
ngDoCheck() {
|
|
19
|
-
const open = this.collapsible.open();
|
|
20
|
-
if (!this.initialized || open === this.lastOpen) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
this.cancelAnimationFrame();
|
|
24
|
-
this.lastOpen = open;
|
|
25
|
-
this.animate(open);
|
|
26
|
-
}
|
|
27
33
|
ngOnDestroy() {
|
|
28
34
|
this.cancelAnimationFrame();
|
|
35
|
+
this.cancelResizeFrame();
|
|
36
|
+
this.mutationObserver?.disconnect();
|
|
37
|
+
this.resizeObserver?.disconnect();
|
|
29
38
|
}
|
|
30
39
|
onTransitionEnd(event) {
|
|
31
40
|
if (event.target !== this.host.nativeElement || event.propertyName !== 'height') {
|
|
@@ -35,26 +44,27 @@ class FrCollapsibleContent {
|
|
|
35
44
|
this.host.nativeElement.style.visibility = 'hidden';
|
|
36
45
|
return;
|
|
37
46
|
}
|
|
38
|
-
this.
|
|
47
|
+
this.setOpenHeight();
|
|
39
48
|
}
|
|
40
49
|
animate(open) {
|
|
41
50
|
const element = this.host.nativeElement;
|
|
51
|
+
this.cancelAnimationFrame();
|
|
52
|
+
this.cancelResizeFrame();
|
|
42
53
|
if (open) {
|
|
43
54
|
element.style.visibility = 'visible';
|
|
44
55
|
element.style.height = '0px';
|
|
45
56
|
element.style.opacity = '0';
|
|
46
|
-
this.
|
|
57
|
+
this.animationFrameId = requestAnimationFrame(() => {
|
|
47
58
|
element.style.height = `${element.scrollHeight}px`;
|
|
48
59
|
element.style.opacity = '1';
|
|
49
60
|
});
|
|
50
61
|
return;
|
|
51
62
|
}
|
|
52
|
-
element.style.height = `${element.scrollHeight}px`;
|
|
63
|
+
element.style.height = `${element.getBoundingClientRect().height || element.scrollHeight}px`;
|
|
53
64
|
element.style.opacity = '1';
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
});
|
|
65
|
+
void element.offsetHeight;
|
|
66
|
+
element.style.height = '0px';
|
|
67
|
+
element.style.opacity = '0';
|
|
58
68
|
}
|
|
59
69
|
applyStaticState(open) {
|
|
60
70
|
const element = this.host.nativeElement;
|
|
@@ -63,11 +73,59 @@ class FrCollapsibleContent {
|
|
|
63
73
|
element.style.visibility = open ? 'visible' : 'hidden';
|
|
64
74
|
}
|
|
65
75
|
cancelAnimationFrame() {
|
|
66
|
-
if (this.
|
|
76
|
+
if (this.animationFrameId === -1) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
80
|
+
this.animationFrameId = -1;
|
|
81
|
+
}
|
|
82
|
+
cancelResizeFrame() {
|
|
83
|
+
if (this.resizeFrameId === -1) {
|
|
67
84
|
return;
|
|
68
85
|
}
|
|
69
|
-
cancelAnimationFrame(this.
|
|
70
|
-
this.
|
|
86
|
+
cancelAnimationFrame(this.resizeFrameId);
|
|
87
|
+
this.resizeFrameId = -1;
|
|
88
|
+
}
|
|
89
|
+
observeContentSize() {
|
|
90
|
+
if (typeof ResizeObserver === 'undefined') {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.resizeObserver = new ResizeObserver(() => this.scheduleOpenHeightSync());
|
|
94
|
+
this.observeResizeTargets();
|
|
95
|
+
if (typeof MutationObserver === 'undefined') {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.mutationObserver = new MutationObserver(() => {
|
|
99
|
+
this.observeResizeTargets();
|
|
100
|
+
this.scheduleOpenHeightSync();
|
|
101
|
+
});
|
|
102
|
+
this.mutationObserver.observe(this.host.nativeElement, { childList: true });
|
|
103
|
+
}
|
|
104
|
+
observeResizeTargets() {
|
|
105
|
+
if (!this.resizeObserver) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const element = this.host.nativeElement;
|
|
109
|
+
const targets = Array.from(element.children);
|
|
110
|
+
this.resizeObserver.disconnect();
|
|
111
|
+
if (targets.length === 0) {
|
|
112
|
+
this.resizeObserver.observe(element);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
targets.forEach((target) => this.resizeObserver?.observe(target));
|
|
116
|
+
}
|
|
117
|
+
scheduleOpenHeightSync() {
|
|
118
|
+
if (!this.initialized || !this.collapsible.open()) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.cancelResizeFrame();
|
|
122
|
+
this.resizeFrameId = requestAnimationFrame(() => this.setOpenHeight());
|
|
123
|
+
}
|
|
124
|
+
setOpenHeight() {
|
|
125
|
+
if (!this.collapsible.open()) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.host.nativeElement.style.height = `${this.host.nativeElement.scrollHeight}px`;
|
|
71
129
|
}
|
|
72
130
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCollapsibleContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
73
131
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCollapsibleContent, isStandalone: true, selector: "[frCollapsibleContent]", host: { attributes: { "role": "region" }, listeners: { "transitionend": "onTransitionEnd($event)" }, properties: { "attr.aria-hidden": "collapsible.open() ? \"false\" : \"true\"", "attr.aria-labelledby": "collapsible.triggerId()", "attr.data-state": "collapsible.open() ? \"open\" : \"closed\"", "attr.id": "collapsible.contentId()" }, classAttribute: "frame-collapsible__content" }, ngImport: i0 });
|
|
@@ -87,7 +145,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
87
145
|
role: 'region',
|
|
88
146
|
},
|
|
89
147
|
}]
|
|
90
|
-
}] });
|
|
148
|
+
}], ctorParameters: () => [] });
|
|
91
149
|
|
|
92
150
|
let collapsibleId = 0;
|
|
93
151
|
/** Root controller for expandable collapsible content. */
|
|
@@ -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 { 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
|
+
{"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, ElementRef, OnDestroy, effect, 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, OnDestroy {\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n protected readonly collapsible = inject(FR_COLLAPSIBLE);\r\n private animationFrameId = -1;\r\n private initialized = false;\r\n private lastOpen = false;\r\n private mutationObserver?: MutationObserver;\r\n private resizeFrameId = -1;\r\n private resizeObserver?: ResizeObserver;\r\n\r\n constructor() {\r\n effect(() => {\r\n const open = this.collapsible.open();\r\n\r\n if (!this.initialized || open === this.lastOpen) {\r\n this.lastOpen = open;\r\n return;\r\n }\r\n\r\n this.lastOpen = open;\r\n this.animate(open);\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.lastOpen = this.collapsible.open();\r\n this.applyStaticState(this.lastOpen);\r\n this.observeContentSize();\r\n this.initialized = true;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cancelAnimationFrame();\r\n this.cancelResizeFrame();\r\n this.mutationObserver?.disconnect();\r\n this.resizeObserver?.disconnect();\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.setOpenHeight();\r\n }\r\n\r\n private animate(open: boolean): void {\r\n const element = this.host.nativeElement;\r\n\r\n this.cancelAnimationFrame();\r\n this.cancelResizeFrame();\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.animationFrameId = 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.getBoundingClientRect().height || element.scrollHeight}px`;\r\n element.style.opacity = '1';\r\n\r\n void element.offsetHeight;\r\n\r\n element.style.height = '0px';\r\n element.style.opacity = '0';\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.animationFrameId === -1) {\r\n return;\r\n }\r\n\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = -1;\r\n }\r\n\r\n private cancelResizeFrame(): void {\r\n if (this.resizeFrameId === -1) {\r\n return;\r\n }\r\n\r\n cancelAnimationFrame(this.resizeFrameId);\r\n this.resizeFrameId = -1;\r\n }\r\n\r\n private observeContentSize(): void {\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.resizeObserver = new ResizeObserver(() => this.scheduleOpenHeightSync());\r\n this.observeResizeTargets();\r\n\r\n if (typeof MutationObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.mutationObserver = new MutationObserver(() => {\r\n this.observeResizeTargets();\r\n this.scheduleOpenHeightSync();\r\n });\r\n this.mutationObserver.observe(this.host.nativeElement, { childList: true });\r\n }\r\n\r\n private observeResizeTargets(): void {\r\n if (!this.resizeObserver) {\r\n return;\r\n }\r\n\r\n const element = this.host.nativeElement;\r\n const targets = Array.from(element.children);\r\n\r\n this.resizeObserver.disconnect();\r\n\r\n if (targets.length === 0) {\r\n this.resizeObserver.observe(element);\r\n return;\r\n }\r\n\r\n targets.forEach((target) => this.resizeObserver?.observe(target));\r\n }\r\n\r\n private scheduleOpenHeightSync(): void {\r\n if (!this.initialized || !this.collapsible.open()) {\r\n return;\r\n }\r\n\r\n this.cancelResizeFrame();\r\n this.resizeFrameId = requestAnimationFrame(() => this.setOpenHeight());\r\n }\r\n\r\n private setOpenHeight(): void {\r\n if (!this.collapsible.open()) {\r\n return;\r\n }\r\n\r\n this.host.nativeElement.style.height = `${this.host.nativeElement.scrollHeight}px`;\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,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, TemplateRef, Directive,
|
|
2
|
+
import { inject, TemplateRef, Directive, ElementRef, DestroyRef, signal, viewChild, contentChild, input, booleanAttribute, model, computed, Component, afterNextRender, Renderer2, NgModule } from '@angular/core';
|
|
3
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';
|
|
@@ -67,8 +67,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
67
67
|
}] });
|
|
68
68
|
/** Group slot for combobox. */
|
|
69
69
|
class FrComboboxGroup {
|
|
70
|
+
elementRef = inject(ElementRef);
|
|
71
|
+
root = inject(FrComboboxRootLookup);
|
|
72
|
+
hidden() {
|
|
73
|
+
this.root.visibleCount();
|
|
74
|
+
const items = Array.from(this.elementRef.nativeElement.querySelectorAll('.frame-combobox__item'));
|
|
75
|
+
return items.length > 0 && items.every((item) => item.hasAttribute('data-hidden'));
|
|
76
|
+
}
|
|
70
77
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
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 });
|
|
78
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrComboboxGroup, isStandalone: true, selector: "[frComboboxGroup], frame-combobox-group", host: { properties: { "attr.hidden": "hidden() ? \"\" : null" }, classAttribute: "frame-combobox__group" }, ngImport: i0 });
|
|
72
79
|
}
|
|
73
80
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxGroup, decorators: [{
|
|
74
81
|
type: Directive,
|
|
@@ -76,6 +83,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
76
83
|
selector: '[frComboboxGroup], frame-combobox-group',
|
|
77
84
|
host: {
|
|
78
85
|
class: 'frame-combobox__group',
|
|
86
|
+
'[attr.hidden]': 'hidden() ? "" : null',
|
|
79
87
|
},
|
|
80
88
|
}]
|
|
81
89
|
}] });
|
|
@@ -150,6 +158,7 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
150
158
|
items = new Set();
|
|
151
159
|
itemsVersion = signal(0, ...(ngDevMode ? [{ debugName: "itemsVersion" }] : /* istanbul ignore next */ []));
|
|
152
160
|
selectedLabels = new Map();
|
|
161
|
+
selectedLabelsVersion = signal(0, ...(ngDevMode ? [{ debugName: "selectedLabelsVersion" }] : /* istanbul ignore next */ []));
|
|
153
162
|
lastAutoHighlight = false;
|
|
154
163
|
lastItemsVersion = -1;
|
|
155
164
|
lastQuery = '';
|
|
@@ -168,6 +177,7 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
168
177
|
invalid = computed(() => this.invalidInput() || this.formInvalid(), ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
|
|
169
178
|
isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
|
|
170
179
|
query = signal('', ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
180
|
+
queryActive = signal(false, ...(ngDevMode ? [{ debugName: "queryActive" }] : /* istanbul ignore next */ []));
|
|
171
181
|
anchorWidth = signal(null, ...(ngDevMode ? [{ debugName: "anchorWidth" }] : /* istanbul ignore next */ []));
|
|
172
182
|
highlightedIndex = signal(0, ...(ngDevMode ? [{ debugName: "highlightedIndex" }] : /* istanbul ignore next */ []));
|
|
173
183
|
overlaySide = signal('bottom', ...(ngDevMode ? [{ debugName: "overlaySide" }] : /* istanbul ignore next */ []));
|
|
@@ -181,7 +191,8 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
181
191
|
return this.query();
|
|
182
192
|
}
|
|
183
193
|
const value = this.value();
|
|
184
|
-
|
|
194
|
+
this.selectedLabelsVersion();
|
|
195
|
+
if (this.queryActive() || value === null || Array.isArray(value)) {
|
|
185
196
|
return this.query();
|
|
186
197
|
}
|
|
187
198
|
return this.query() || this.selectedLabels.get(value) || this.itemToStringValue()(value);
|
|
@@ -251,7 +262,11 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
251
262
|
return this.visibleItems()[this.highlightedIndex()] === item;
|
|
252
263
|
}
|
|
253
264
|
rememberItemLabel(value, label) {
|
|
265
|
+
if (this.selectedLabels.get(value) === label) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
254
268
|
this.selectedLabels.set(value, label);
|
|
269
|
+
this.selectedLabelsVersion.update((version) => version + 1);
|
|
255
270
|
}
|
|
256
271
|
itemVisible(label) {
|
|
257
272
|
const query = this.query().trim().toLowerCase();
|
|
@@ -269,6 +284,9 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
269
284
|
return;
|
|
270
285
|
}
|
|
271
286
|
this.isOpen.set(false);
|
|
287
|
+
if (!this.query()) {
|
|
288
|
+
this.queryActive.set(false);
|
|
289
|
+
}
|
|
272
290
|
this.markAsTouched();
|
|
273
291
|
}
|
|
274
292
|
touch() {
|
|
@@ -276,12 +294,13 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
276
294
|
}
|
|
277
295
|
clear() {
|
|
278
296
|
this.query.set('');
|
|
297
|
+
this.queryActive.set(false);
|
|
279
298
|
this.value.set(this.multiple() ? [] : null);
|
|
280
299
|
this.notifyValueChange(this.value());
|
|
281
300
|
this.markAsTouched();
|
|
282
301
|
}
|
|
283
302
|
selectItem(value, label) {
|
|
284
|
-
this.
|
|
303
|
+
this.rememberItemLabel(value, label);
|
|
285
304
|
if (this.multiple()) {
|
|
286
305
|
const current = this.selectedValues();
|
|
287
306
|
const exists = current.some((item) => Object.is(item, value));
|
|
@@ -289,12 +308,14 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
289
308
|
this.value.set(next);
|
|
290
309
|
this.notifyValueChange(next);
|
|
291
310
|
this.query.set('');
|
|
311
|
+
this.queryActive.set(false);
|
|
292
312
|
this.open();
|
|
293
313
|
return;
|
|
294
314
|
}
|
|
295
315
|
this.value.set(value);
|
|
296
316
|
this.notifyValueChange(value);
|
|
297
317
|
this.query.set('');
|
|
318
|
+
this.queryActive.set(false);
|
|
298
319
|
this.close();
|
|
299
320
|
}
|
|
300
321
|
removeItem(value) {
|
|
@@ -309,6 +330,7 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
309
330
|
}
|
|
310
331
|
updateQuery(value) {
|
|
311
332
|
this.query.set(value);
|
|
333
|
+
this.queryActive.set(true);
|
|
312
334
|
this.highlightedIndex.set(0);
|
|
313
335
|
this.open();
|
|
314
336
|
}
|
|
@@ -319,6 +341,7 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
319
341
|
return;
|
|
320
342
|
}
|
|
321
343
|
this.highlightedIndex.set((this.highlightedIndex() + delta + count) % count);
|
|
344
|
+
this.scrollHighlightedItemIntoView();
|
|
322
345
|
}
|
|
323
346
|
selectHighlighted() {
|
|
324
347
|
const item = this.visibleItems()[this.highlightedIndex()];
|
|
@@ -330,10 +353,16 @@ class FrCombobox extends FrControlValueAccessor {
|
|
|
330
353
|
setViewValue(value) {
|
|
331
354
|
this.value.set(value);
|
|
332
355
|
this.query.set('');
|
|
356
|
+
this.queryActive.set(false);
|
|
333
357
|
}
|
|
334
358
|
bumpItems() {
|
|
335
359
|
this.itemsVersion.update((value) => value + 1);
|
|
336
360
|
}
|
|
361
|
+
scrollHighlightedItemIntoView() {
|
|
362
|
+
queueMicrotask(() => {
|
|
363
|
+
this.visibleItems()[this.highlightedIndex()]?.scrollIntoView();
|
|
364
|
+
});
|
|
365
|
+
}
|
|
337
366
|
measureAnchor() {
|
|
338
367
|
const element = this.origin()?.elementRef.nativeElement ?? this.elementRef.nativeElement;
|
|
339
368
|
if (typeof element?.getBoundingClientRect !== 'function') {
|
|
@@ -576,6 +605,9 @@ class FrComboboxItem {
|
|
|
576
605
|
this.root.selectItem(this.value(), this.label());
|
|
577
606
|
}
|
|
578
607
|
}
|
|
608
|
+
scrollIntoView() {
|
|
609
|
+
this.elementRef.nativeElement.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
|
|
610
|
+
}
|
|
579
611
|
highlightSelf() {
|
|
580
612
|
const index = this.root.visibleItems().indexOf(this);
|
|
581
613
|
if (index >= 0) {
|
|
@@ -696,12 +728,12 @@ class FrComboboxChip {
|
|
|
696
728
|
return;
|
|
697
729
|
}
|
|
698
730
|
const button = this.renderer.createElement('button');
|
|
699
|
-
const
|
|
731
|
+
const icon = this.createRemoveIcon();
|
|
700
732
|
this.renderer.setAttribute(button, 'type', 'button');
|
|
701
733
|
this.renderer.setAttribute(button, 'aria-label', 'Remove selected item');
|
|
702
734
|
this.renderer.setAttribute(button, 'data-default-remove', '');
|
|
703
735
|
this.renderer.addClass(button, 'frame-combobox__chip-remove');
|
|
704
|
-
this.renderer.appendChild(button,
|
|
736
|
+
this.renderer.appendChild(button, icon);
|
|
705
737
|
this.renderer.listen(button, 'click', (event) => {
|
|
706
738
|
event.preventDefault();
|
|
707
739
|
event.stopPropagation();
|
|
@@ -709,6 +741,24 @@ class FrComboboxChip {
|
|
|
709
741
|
});
|
|
710
742
|
this.renderer.appendChild(element, button);
|
|
711
743
|
}
|
|
744
|
+
createRemoveIcon() {
|
|
745
|
+
const svg = this.renderer.createElement('svg', 'svg');
|
|
746
|
+
const firstPath = this.renderer.createElement('path', 'svg');
|
|
747
|
+
const secondPath = this.renderer.createElement('path', 'svg');
|
|
748
|
+
this.renderer.setAttribute(svg, 'aria-hidden', 'true');
|
|
749
|
+
this.renderer.setAttribute(svg, 'viewBox', '0 0 24 24');
|
|
750
|
+
this.renderer.setAttribute(svg, 'fill', 'none');
|
|
751
|
+
this.renderer.setAttribute(svg, 'stroke', 'currentColor');
|
|
752
|
+
this.renderer.setAttribute(svg, 'stroke-width', '2');
|
|
753
|
+
this.renderer.setAttribute(svg, 'stroke-linecap', 'round');
|
|
754
|
+
this.renderer.setAttribute(svg, 'stroke-linejoin', 'round');
|
|
755
|
+
this.renderer.addClass(svg, 'frame-combobox__chip-remove-icon');
|
|
756
|
+
this.renderer.setAttribute(firstPath, 'd', 'M18 6 6 18');
|
|
757
|
+
this.renderer.setAttribute(secondPath, 'd', 'm6 6 12 12');
|
|
758
|
+
this.renderer.appendChild(svg, firstPath);
|
|
759
|
+
this.renderer.appendChild(svg, secondPath);
|
|
760
|
+
return svg;
|
|
761
|
+
}
|
|
712
762
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrComboboxChip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
713
763
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrComboboxChip, isStandalone: true, selector: "[frComboboxChip], frame-combobox-chip", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, removable: { classPropertyName: "removable", publicName: "removable", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "frame-combobox__chip" }, exportAs: ["frComboboxChip"], ngImport: i0 });
|
|
714
764
|
}
|
|
@@ -763,6 +813,11 @@ class FrComboboxChipsInput {
|
|
|
763
813
|
this.root.open();
|
|
764
814
|
this.root.moveHighlight(1);
|
|
765
815
|
}
|
|
816
|
+
if (event.key === 'ArrowUp') {
|
|
817
|
+
event.preventDefault();
|
|
818
|
+
this.root.open();
|
|
819
|
+
this.root.moveHighlight(-1);
|
|
820
|
+
}
|
|
766
821
|
if (event.key === 'Enter') {
|
|
767
822
|
event.preventDefault();
|
|
768
823
|
this.root.selectHighlighted();
|