@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.
Files changed (106) hide show
  1. package/accordion/src/styles/_vars.css +2 -5
  2. package/accordion/src/styles/accordion.css +44 -30
  3. package/breadcrumb/src/styles/breadcrumb.css +12 -2
  4. package/button/src/styles/button.css +20 -66
  5. package/button-group/src/styles/button-group.css +0 -38
  6. package/calendar/src/styles/_vars.css +4 -0
  7. package/calendar/src/styles/calendar.css +26 -18
  8. package/carousel/src/styles/carousel.css +103 -89
  9. package/checkbox/src/styles/checkbox.css +14 -5
  10. package/collapsible/src/styles/_vars.css +1 -0
  11. package/collapsible/src/styles/collapsible.css +15 -11
  12. package/combobox/src/styles/combobox.css +11 -2
  13. package/confirm-popover/src/styles/confirm-popover.css +0 -1
  14. package/date-picker/src/styles/date-picker.css +15 -10
  15. package/dropdown-menu/src/styles/dropdown-menu-item.css +6 -2
  16. package/fesm2022/frame-ui-ng-components-accordion.mjs +201 -147
  17. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-alert.mjs +2 -2
  19. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +10 -2
  21. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-button-group.mjs +2 -2
  23. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-button.mjs +2 -2
  25. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-calendar.mjs +202 -50
  27. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-card.mjs +2 -2
  29. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-carousel.mjs +2 -2
  31. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-collapsible.mjs +80 -22
  33. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-combobox.mjs +61 -6
  35. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  36. package/fesm2022/frame-ui-ng-components-command.mjs +2 -2
  37. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  38. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +6 -6
  39. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-date-picker.mjs +75 -37
  41. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +2 -2
  43. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  44. package/fesm2022/frame-ui-ng-components-empty.mjs +2 -2
  45. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-hover-card.mjs +2 -2
  47. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-input-otp.mjs +2 -2
  49. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-input.mjs +2 -2
  51. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-item.mjs +2 -2
  53. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-menubar.mjs +2 -2
  55. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-modal.mjs +10 -4
  57. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +4 -4
  59. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-pagination.mjs +20 -4
  61. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-popover.mjs +2 -2
  63. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-radio-group.mjs +2 -2
  65. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-resizable.mjs +2 -2
  67. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-sheet.mjs +90 -65
  69. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-table.mjs +6 -5
  71. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-tabs.mjs +2 -2
  73. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-toast.mjs +6 -6
  75. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-tooltip.mjs +6 -6
  77. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +4 -4
  79. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components.mjs +850 -420
  81. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  82. package/input/src/styles/input-group.css +0 -7
  83. package/input/src/styles/input.css +0 -23
  84. package/modal/src/styles/modal.css +5 -19
  85. package/package.json +6 -6
  86. package/pagination/src/styles/pagination.css +6 -2
  87. package/popover/src/styles/popover.css +3 -3
  88. package/select/src/styles/select-item.css +67 -68
  89. package/sheet/src/styles/sheet.css +32 -19
  90. package/src/styles/components.css +2 -2
  91. package/src/styles/corner-handles.css +217 -0
  92. package/styles/components.css +2 -2
  93. package/styles/corner-handles.css +217 -0
  94. package/styles.css +2 -2
  95. package/toggle/src/styles/toggle.css +6 -1
  96. package/tooltip/src/styles/_vars.css +1 -1
  97. package/tooltip/src/styles/tooltip.css +13 -14
  98. package/types/frame-ui-ng-components-accordion.d.ts +69 -61
  99. package/types/frame-ui-ng-components-calendar.d.ts +7 -7
  100. package/types/frame-ui-ng-components-collapsible.d.ts +12 -4
  101. package/types/frame-ui-ng-components-combobox.d.ts +8 -0
  102. package/types/frame-ui-ng-components-date-picker.d.ts +2 -4
  103. package/types/frame-ui-ng-components-sheet.d.ts +6 -2
  104. package/types/frame-ui-ng-components.d.ts +172 -135
  105. package/src/styles/blueprint.css +0 -707
  106. 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
- rafId = -1;
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.host.nativeElement.style.height = 'auto';
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.rafId = requestAnimationFrame(() => {
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
- this.rafId = requestAnimationFrame(() => {
55
- element.style.height = '0px';
56
- element.style.opacity = '0';
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.rafId === -1) {
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.rafId);
70
- this.rafId = -1;
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":";;;AAUO,MAAM,cAAc,GAAG,IAAI,cAAc,CAAuB,eAAe,CAAC;;ACNvF;MAca,oBAAoB,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAChD,IAAA,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;IAC/C,WAAW,GAAG,KAAK;IACnB,QAAQ,GAAG,KAAK;IAChB,KAAK,GAAG,CAAC,CAAC;IAElB,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACvC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;IACzB;IAEA,SAAS,GAAA;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QAEpC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE;YAC/C;QACF;QAEA,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEA,IAAA,eAAe,CAAC,KAAsB,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE;YAC/E;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;YACnD;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;IAC/C;AAEQ,IAAA,OAAO,CAAC,IAAa,EAAA;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QAEvC,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS;AACpC,YAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AAC5B,YAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAE3B,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,MAAK;gBACtC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAA,EAAA,CAAI;AAClD,gBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC7B,YAAA,CAAC,CAAC;YACF;QACF;QAEA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAA,EAAA,CAAI;AAClD,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,MAAK;AACtC,YAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AAC5B,YAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC7B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,gBAAgB,CAAC,IAAa,EAAA;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AAEvC,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK;AAC5C,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG;AACxC,QAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ;IACxD;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE;YACrB;QACF;AAEA,QAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB;wGAjFW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,2CAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,4CAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAbhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,4BAA4B;AACnC,wBAAA,oBAAoB,EAAE,uCAAuC;AAC7D,wBAAA,wBAAwB,EAAE,yBAAyB;AACnD,wBAAA,mBAAmB,EAAE,wCAAwC;AAC7D,wBAAA,WAAW,EAAE,yBAAyB;AACtC,wBAAA,iBAAiB,EAAE,yBAAyB;AAC5C,wBAAA,IAAI,EAAE,QAAQ;AACf,qBAAA;AACF,iBAAA;;;ACND,IAAI,aAAa,GAAG,CAAC;AAErB;MAYa,aAAa,CAAA;IACP,aAAa,GAAG,EAAE,aAAa;IAC/B,YAAY,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAE7D,WAAW,GAAG,KAAK,CAAC,KAAK,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC3D,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,SAAS,GAAG,KAAK,CAAsB,SAAS,iFAAI,KAAK,EAAE,MAAM,EAAA,CAAG;IACpE,UAAU,GAAG,MAAM,EAAW;AAE9B,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,2EAAC;AAC9D,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAA,0BAAA,EAA6B,IAAI,CAAC,aAAa,CAAA,CAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC7E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAA,0BAAA,EAA6B,IAAI,CAAC,aAAa,CAAA,CAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEtF,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;QAEA,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B;AAEA,IAAA,OAAO,CAAC,IAAa,EAAA;AACnB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;YAC3C;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;wGA/BW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,gCAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,SAAA,EAPb,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAOzD,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oCAAoC;AAC9C,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;oBAChB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAA,aAAe,EAAE,CAAC;AACpE,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,sBAAsB,EAAE,wBAAwB;AAChD,wBAAA,mBAAmB,EAAE,4BAA4B;AAClD,qBAAA;AACF,iBAAA;;;ACpBD;MAgBa,oBAAoB,CAAA;AACZ,IAAA,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;wGAD5C,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,sBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,2CAAA,EAAA,oBAAA,EAAA,sCAAA,EAAA,iBAAA,EAAA,4CAAA,EAAA,eAAA,EAAA,sCAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAfhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,4BAA4B;AACnC,wBAAA,sBAAsB,EAAE,yBAAyB;AACjD,wBAAA,sBAAsB,EAAE,uCAAuC;AAC/D,wBAAA,sBAAsB,EAAE,oCAAoC;AAC5D,wBAAA,mBAAmB,EAAE,wCAAwC;AAC7D,wBAAA,iBAAiB,EAAE,oCAAoC;AACvD,wBAAA,WAAW,EAAE,yBAAyB;AACtC,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,sBAAsB;AAClC,qBAAA;AACF,iBAAA;;;MCAY,mBAAmB,CAAA;wGAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YAV5B,aAAa;YACb,oBAAoB;AACpB,YAAA,oBAAoB,aAGpB,aAAa;YACb,oBAAoB;YACpB,oBAAoB,CAAA,EAAA,CAAA;yGAGX,mBAAmB,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAZ/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,aAAa;wBACb,oBAAoB;wBACpB,oBAAoB;AACrB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,aAAa;wBACb,oBAAoB;wBACpB,oBAAoB;AACrB,qBAAA;AACF,iBAAA;;;AClBD;;AAEG;;;;"}
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, DestroyRef, ElementRef, signal, viewChild, contentChild, input, booleanAttribute, model, computed, Component, afterNextRender, Renderer2, NgModule } from '@angular/core';
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
- if (value === null || Array.isArray(value)) {
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.selectedLabels.set(value, label);
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 label = this.renderer.createText('×');
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, label);
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();