@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,15 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ElementRef, input, booleanAttribute, output, Directive,
|
|
2
|
+
import { inject, ElementRef, input, booleanAttribute, output, Directive, NgModule } from '@angular/core';
|
|
3
|
+
import { clampNumber, coerceNumber } from '@frame-ui-ng/components/utils';
|
|
3
4
|
|
|
4
5
|
const FR_RESIZABLE_ORIENTATIONS = ['horizontal', 'vertical'];
|
|
5
6
|
let nextResizableId = 0;
|
|
6
|
-
|
|
7
|
-
const parsed = Number(value);
|
|
8
|
-
return Number.isFinite(parsed) ? parsed : fallback;
|
|
9
|
-
}
|
|
10
|
-
function clampSize(value, min, max) {
|
|
11
|
-
return Math.min(Math.max(value, min), max);
|
|
12
|
-
}
|
|
7
|
+
/** Resizable panel group that coordinates pane sizes. */
|
|
13
8
|
class FrResizablePanelGroup {
|
|
14
9
|
elementRef = inject((ElementRef));
|
|
15
10
|
groupId = `frame-resizable-${++nextResizableId}`;
|
|
@@ -49,7 +44,7 @@ class FrResizablePanelGroup {
|
|
|
49
44
|
panel.style.flexGrow = '0';
|
|
50
45
|
panel.style.flexShrink = '0';
|
|
51
46
|
if (!panel.style.flexBasis) {
|
|
52
|
-
this.applyPanelSize(panel,
|
|
47
|
+
this.applyPanelSize(panel, clampNumber(this.defaultSize(panel) ?? fallbackSize, this.minSize(panel), this.maxSize(panel)));
|
|
53
48
|
}
|
|
54
49
|
else {
|
|
55
50
|
this.applyPanelSize(panel, this.panelSize(panel) ?? 0);
|
|
@@ -75,6 +70,7 @@ class FrResizablePanelGroup {
|
|
|
75
70
|
const startPrevious = this.panelSize(previousPanel) ?? 0;
|
|
76
71
|
const startNext = this.panelSize(nextPanel) ?? 0;
|
|
77
72
|
const pairTotal = startPrevious + startNext;
|
|
73
|
+
// Keep pair resizing local so adjacent panels trade space without changing total layout.
|
|
78
74
|
const rtlMultiplier = this.orientation() === 'horizontal' && getComputedStyle(this.elementRef.nativeElement).direction === 'rtl'
|
|
79
75
|
? -1
|
|
80
76
|
: 1;
|
|
@@ -137,10 +133,11 @@ class FrResizablePanelGroup {
|
|
|
137
133
|
}
|
|
138
134
|
}
|
|
139
135
|
resizePair(previousPanel, nextPanel, pairTotal, requestedPreviousSize) {
|
|
136
|
+
// Clamp the previous panel first; the next panel receives the remaining pair size.
|
|
140
137
|
const previousMin = this.minSize(previousPanel);
|
|
141
138
|
const previousMax = Math.min(this.maxSize(previousPanel), pairTotal - this.minSize(nextPanel));
|
|
142
|
-
const previousSize =
|
|
143
|
-
const nextSize =
|
|
139
|
+
const previousSize = clampNumber(requestedPreviousSize, previousMin, previousMax);
|
|
140
|
+
const nextSize = clampNumber(pairTotal - previousSize, this.minSize(nextPanel), this.maxSize(nextPanel));
|
|
144
141
|
this.applyPanelSize(previousPanel, previousSize);
|
|
145
142
|
this.applyPanelSize(nextPanel, nextSize);
|
|
146
143
|
this.updateHandleMetadata();
|
|
@@ -149,6 +146,7 @@ class FrResizablePanelGroup {
|
|
|
149
146
|
applyPanelSize(panel, size) {
|
|
150
147
|
const normalizedSize = Math.max(size, 0);
|
|
151
148
|
const collapsedThreshold = this.collapsible(panel) ? this.collapsedSize(panel) : 0;
|
|
149
|
+
// Collapsible panels snap to their collapsed size instead of shrinking below it.
|
|
152
150
|
const collapsed = normalizedSize <= collapsedThreshold;
|
|
153
151
|
const appliedSize = collapsed ? collapsedThreshold : normalizedSize;
|
|
154
152
|
panel.style.flexBasis = `${appliedSize}%`;
|
|
@@ -199,16 +197,16 @@ class FrResizablePanelGroup {
|
|
|
199
197
|
}
|
|
200
198
|
defaultSize(panel) {
|
|
201
199
|
const value = panel.getAttribute('data-default-size');
|
|
202
|
-
return value === null ? null :
|
|
200
|
+
return value === null ? null : coerceNumber(value, 0);
|
|
203
201
|
}
|
|
204
202
|
minSize(panel) {
|
|
205
|
-
return
|
|
203
|
+
return coerceNumber(panel.getAttribute('data-min-size'), 0);
|
|
206
204
|
}
|
|
207
205
|
maxSize(panel) {
|
|
208
|
-
return
|
|
206
|
+
return coerceNumber(panel.getAttribute('data-max-size'), 100);
|
|
209
207
|
}
|
|
210
208
|
collapsedSize(panel) {
|
|
211
|
-
return
|
|
209
|
+
return coerceNumber(panel.getAttribute('data-collapsed-size'), 0);
|
|
212
210
|
}
|
|
213
211
|
collapsible(panel) {
|
|
214
212
|
return panel.hasAttribute('data-collapsible');
|
|
@@ -228,12 +226,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
228
226
|
},
|
|
229
227
|
}]
|
|
230
228
|
}], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], layoutChange: [{ type: i0.Output, args: ["layoutChange"] }] } });
|
|
229
|
+
/** Panel slot for resizable. */
|
|
231
230
|
class FrResizablePanel {
|
|
232
|
-
defaultSize = input(0, { ...(ngDevMode ? { debugName: "defaultSize" } : /* istanbul ignore next */ {}), transform: (value) =>
|
|
233
|
-
minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: (value) =>
|
|
234
|
-
maxSize = input(100, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: (value) =>
|
|
231
|
+
defaultSize = input(0, { ...(ngDevMode ? { debugName: "defaultSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
|
|
232
|
+
minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
|
|
233
|
+
maxSize = input(100, { ...(ngDevMode ? { debugName: "maxSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 100) });
|
|
235
234
|
collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
236
|
-
collapsedSize = input(0, { ...(ngDevMode ? { debugName: "collapsedSize" } : /* istanbul ignore next */ {}), transform: (value) =>
|
|
235
|
+
collapsedSize = input(0, { ...(ngDevMode ? { debugName: "collapsedSize" } : /* istanbul ignore next */ {}), transform: (value) => coerceNumber(value, 0) });
|
|
237
236
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrResizablePanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
238
237
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrResizablePanel, isStandalone: true, selector: "[frResizablePanel], frame-resizable-panel", inputs: { defaultSize: { classPropertyName: "defaultSize", publicName: "defaultSize", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, maxSize: { classPropertyName: "maxSize", publicName: "maxSize", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapsedSize: { classPropertyName: "collapsedSize", publicName: "collapsedSize", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-default-size": "defaultSize()", "attr.data-min-size": "minSize()", "attr.data-max-size": "maxSize()", "attr.data-collapsible": "collapsible() ? \"\" : null", "attr.data-collapsed-size": "collapsedSize()" }, classAttribute: "frame-resizable__panel" }, ngImport: i0 });
|
|
239
238
|
}
|
|
@@ -251,6 +250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
251
250
|
},
|
|
252
251
|
}]
|
|
253
252
|
}], propDecorators: { defaultSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSize", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], collapsedSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedSize", required: false }] }] } });
|
|
253
|
+
/** Resize handle between adjacent resizable panels. */
|
|
254
254
|
class FrResizableHandle {
|
|
255
255
|
group = inject(FrResizablePanelGroup);
|
|
256
256
|
elementRef = inject((ElementRef));
|
|
@@ -282,15 +282,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
282
282
|
'[attr.data-orientation]': 'group.orientation()',
|
|
283
283
|
'[attr.data-handle]': 'withHandle() ? "" : null',
|
|
284
284
|
'[attr.data-disabled]': 'group.disabled() ? "" : null',
|
|
285
|
+
'(pointerdown)': 'onPointerDown($event)',
|
|
286
|
+
'(keydown)': 'onKeydown($event)',
|
|
285
287
|
},
|
|
286
288
|
}]
|
|
287
|
-
}], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }]
|
|
288
|
-
type: HostListener,
|
|
289
|
-
args: ['pointerdown', ['$event']]
|
|
290
|
-
}], onKeydown: [{
|
|
291
|
-
type: HostListener,
|
|
292
|
-
args: ['keydown', ['$event']]
|
|
293
|
-
}] } });
|
|
289
|
+
}], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }] } });
|
|
294
290
|
|
|
295
291
|
class FrResizableModule {
|
|
296
292
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrResizableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-ui-ng-components-resizable.mjs","sources":["../../../projects/components/resizable/src/resizable.ts","../../../projects/components/resizable/resizable.module.ts","../../../projects/components/resizable/frame-ui-ng-components-resizable.ts"],"sourcesContent":["import {\n AfterViewInit,\n Directive,\n ElementRef,\n HostListener,\n OnDestroy,\n booleanAttribute,\n inject,\n input,\n output,\n} from '@angular/core';\n\nexport const FR_RESIZABLE_ORIENTATIONS = ['horizontal', 'vertical'] as const;\nexport type FrResizableOrientation = (typeof FR_RESIZABLE_ORIENTATIONS)[number];\n\nlet nextResizableId = 0;\n\nfunction coerceSize(value: unknown, fallback: number): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction clampSize(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n@Directive({\n selector: '[frResizablePanelGroup], frame-resizable-panel-group',\n exportAs: 'frResizablePanelGroup',\n host: {\n class: 'frame-resizable',\n '[attr.data-orientation]': 'orientation()',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class FrResizablePanelGroup implements AfterViewInit, OnDestroy {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly groupId = `frame-resizable-${++nextResizableId}`;\n private readonly cleanupFns: Array<() => void> = [];\n\n readonly orientation = input<FrResizableOrientation>('horizontal');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly layoutChange = output<number[]>();\n\n ngAfterViewInit(): void {\n queueMicrotask(() => this.initializeLayout());\n }\n\n ngOnDestroy(): void {\n for (const cleanup of this.cleanupFns) {\n cleanup();\n }\n }\n\n panelId(index: number): string {\n return `${this.groupId}-panel-${index}`;\n }\n\n panels(): HTMLElement[] {\n return Array.from(\n this.elementRef.nativeElement.children,\n ).filter((child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('FrResizablePanel'));\n }\n\n handles(): HTMLElement[] {\n return Array.from(\n this.elementRef.nativeElement.children,\n ).filter((child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('FrResizableHandle'));\n }\n\n initializeLayout(): void {\n const panels = this.panels();\n\n if (!panels.length) {\n return;\n }\n\n const remainingPanels = panels.filter((panel) => !panel.style.flexBasis);\n const assignedTotal = panels.reduce((total, panel) => total + (this.panelSize(panel) ?? 0), 0);\n const fallbackSize = remainingPanels.length\n ? Math.max((100 - assignedTotal) / remainingPanels.length, 0)\n : 0;\n\n panels.forEach((panel, index) => {\n panel.id ||= this.panelId(index);\n panel.style.flexGrow = '0';\n panel.style.flexShrink = '0';\n\n if (!panel.style.flexBasis) {\n this.applyPanelSize(\n panel,\n clampSize(this.defaultSize(panel) ?? fallbackSize, this.minSize(panel), this.maxSize(panel)),\n );\n } else {\n this.applyPanelSize(panel, this.panelSize(panel) ?? 0);\n }\n });\n\n this.updateHandleMetadata();\n this.emitLayout();\n }\n\n startResize(handle: HTMLElement, pointerId: number, startClientX: number, startClientY: number): void {\n if (this.disabled()) {\n return;\n }\n\n const pair = this.panelPairForHandle(handle);\n\n if (!pair) {\n return;\n }\n\n const groupRect = this.elementRef.nativeElement.getBoundingClientRect();\n const dimension = this.orientation() === 'horizontal' ? groupRect.width : groupRect.height;\n\n if (dimension <= 0) {\n return;\n }\n\n const [previousPanel, nextPanel] = pair;\n const startPrevious = this.panelSize(previousPanel) ?? 0;\n const startNext = this.panelSize(nextPanel) ?? 0;\n const pairTotal = startPrevious + startNext;\n const rtlMultiplier =\n this.orientation() === 'horizontal' && getComputedStyle(this.elementRef.nativeElement).direction === 'rtl'\n ? -1\n : 1;\n\n handle.setPointerCapture?.(pointerId);\n handle.setAttribute('data-dragging', '');\n this.elementRef.nativeElement.setAttribute('data-resizing', '');\n\n const move = (event: PointerEvent) => {\n const deltaPx =\n this.orientation() === 'horizontal'\n ? (event.clientX - startClientX) * rtlMultiplier\n : event.clientY - startClientY;\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + (deltaPx / dimension) * 100);\n };\n\n const end = () => {\n handle.removeAttribute('data-dragging');\n this.elementRef.nativeElement.removeAttribute('data-resizing');\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', end);\n window.removeEventListener('pointercancel', end);\n };\n\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', end, { once: true });\n window.addEventListener('pointercancel', end, { once: true });\n }\n\n resizeFromKeyboard(handle: HTMLElement, key: string): boolean {\n if (this.disabled()) {\n return false;\n }\n\n const pair = this.panelPairForHandle(handle);\n\n if (!pair) {\n return false;\n }\n\n const [previousPanel, nextPanel] = pair;\n const startPrevious = this.panelSize(previousPanel) ?? 0;\n const startNext = this.panelSize(nextPanel) ?? 0;\n const pairTotal = startPrevious + startNext;\n const isRtl =\n this.orientation() === 'horizontal' &&\n getComputedStyle(this.elementRef.nativeElement).direction === 'rtl';\n const step = 10;\n\n switch (key) {\n case 'ArrowLeft':\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + (isRtl ? step : -step));\n return true;\n case 'ArrowRight':\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + (isRtl ? -step : step));\n return true;\n case 'ArrowUp':\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious - step);\n return true;\n case 'ArrowDown':\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + step);\n return true;\n case 'Home':\n this.resizePair(previousPanel, nextPanel, pairTotal, this.minSize(previousPanel));\n return true;\n case 'End':\n this.resizePair(previousPanel, nextPanel, pairTotal, pairTotal - this.minSize(nextPanel));\n return true;\n default:\n return false;\n }\n }\n\n private resizePair(\n previousPanel: HTMLElement,\n nextPanel: HTMLElement,\n pairTotal: number,\n requestedPreviousSize: number,\n ): void {\n const previousMin = this.minSize(previousPanel);\n const previousMax = Math.min(this.maxSize(previousPanel), pairTotal - this.minSize(nextPanel));\n const previousSize = clampSize(requestedPreviousSize, previousMin, previousMax);\n const nextSize = clampSize(pairTotal - previousSize, this.minSize(nextPanel), this.maxSize(nextPanel));\n\n this.applyPanelSize(previousPanel, previousSize);\n this.applyPanelSize(nextPanel, nextSize);\n this.updateHandleMetadata();\n this.emitLayout();\n }\n\n private applyPanelSize(panel: HTMLElement, size: number): void {\n const normalizedSize = Math.max(size, 0);\n const collapsedThreshold = this.collapsible(panel) ? this.collapsedSize(panel) : 0;\n const collapsed = normalizedSize <= collapsedThreshold;\n const appliedSize = collapsed ? collapsedThreshold : normalizedSize;\n\n panel.style.flexBasis = `${appliedSize}%`;\n panel.setAttribute('data-size', String(appliedSize));\n panel.toggleAttribute('data-collapsed', collapsed);\n }\n\n private panelPairForHandle(handle: HTMLElement): [HTMLElement, HTMLElement] | null {\n let previous = handle.previousElementSibling;\n let next = handle.nextElementSibling;\n\n while (previous && !(previous instanceof HTMLElement && previous.hasAttribute('FrResizablePanel'))) {\n previous = previous.previousElementSibling;\n }\n\n while (next && !(next instanceof HTMLElement && next.hasAttribute('FrResizablePanel'))) {\n next = next.nextElementSibling;\n }\n\n if (!(previous instanceof HTMLElement) || !(next instanceof HTMLElement)) {\n return null;\n }\n\n return [previous, next];\n }\n\n private updateHandleMetadata(): void {\n const panels = this.panels();\n\n this.handles().forEach((handle) => {\n const pair = this.panelPairForHandle(handle);\n\n if (!pair) {\n return;\n }\n\n const [previousPanel, nextPanel] = pair;\n const previousIndex = panels.indexOf(previousPanel);\n const nextIndex = panels.indexOf(nextPanel);\n\n handle.setAttribute('aria-controls', [previousPanel.id, nextPanel.id].filter(Boolean).join(' '));\n handle.setAttribute('aria-valuemin', String(this.minSize(previousPanel)));\n handle.setAttribute('aria-valuemax', String(this.maxSize(previousPanel)));\n handle.setAttribute('aria-valuenow', String(Math.round(this.panelSize(previousPanel) ?? 0)));\n handle.setAttribute('data-panels', `${previousIndex}:${nextIndex}`);\n });\n }\n\n private emitLayout(): void {\n this.layoutChange.emit(this.panels().map((panel) => this.panelSize(panel) ?? 0));\n }\n\n private panelSize(panel: HTMLElement): number | null {\n const styleSize = Number.parseFloat(panel.style.flexBasis);\n\n if (Number.isFinite(styleSize)) {\n return styleSize;\n }\n\n const dataSize = Number(panel.getAttribute('data-size'));\n return Number.isFinite(dataSize) ? dataSize : null;\n }\n\n private defaultSize(panel: HTMLElement): number | null {\n const value = panel.getAttribute('data-default-size');\n return value === null ? null : coerceSize(value, 0);\n }\n\n private minSize(panel: HTMLElement): number {\n return coerceSize(panel.getAttribute('data-min-size'), 0);\n }\n\n private maxSize(panel: HTMLElement): number {\n return coerceSize(panel.getAttribute('data-max-size'), 100);\n }\n\n private collapsedSize(panel: HTMLElement): number {\n return coerceSize(panel.getAttribute('data-collapsed-size'), 0);\n }\n\n private collapsible(panel: HTMLElement): boolean {\n return panel.hasAttribute('data-collapsible');\n }\n}\n\n@Directive({\n selector: '[frResizablePanel], frame-resizable-panel',\n host: {\n class: 'frame-resizable__panel',\n '[attr.data-default-size]': 'defaultSize()',\n '[attr.data-min-size]': 'minSize()',\n '[attr.data-max-size]': 'maxSize()',\n '[attr.data-collapsible]': 'collapsible() ? \"\" : null',\n '[attr.data-collapsed-size]': 'collapsedSize()',\n },\n})\nexport class FrResizablePanel {\n readonly defaultSize = input<number, unknown>(0, { transform: (value) => coerceSize(value, 0) });\n readonly minSize = input<number, unknown>(0, { transform: (value) => coerceSize(value, 0) });\n readonly maxSize = input<number, unknown>(100, { transform: (value) => coerceSize(value, 100) });\n readonly collapsible = input(false, { transform: booleanAttribute });\n readonly collapsedSize = input<number, unknown>(0, { transform: (value) => coerceSize(value, 0) });\n}\n\n@Directive({\n selector: '[frResizableHandle], frame-resizable-handle',\n host: {\n class: 'frame-resizable__handle',\n role: 'separator',\n tabindex: '0',\n '[attr.aria-orientation]': 'group.orientation()',\n '[attr.data-orientation]': 'group.orientation()',\n '[attr.data-handle]': 'withHandle() ? \"\" : null',\n '[attr.data-disabled]': 'group.disabled() ? \"\" : null',\n },\n})\nexport class FrResizableHandle {\n protected readonly group = inject(FrResizablePanelGroup);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n readonly withHandle = input(false, { transform: booleanAttribute });\n\n @HostListener('pointerdown', ['$event'])\n protected onPointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n this.group.startResize(this.elementRef.nativeElement, event.pointerId, event.clientX, event.clientY);\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (this.group.resizeFromKeyboard(this.elementRef.nativeElement, event.key)) {\n event.preventDefault();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n FrResizableHandle,\n FrResizablePanel,\n FrResizablePanelGroup,\n} from './src/resizable';\n\n@NgModule({\n imports: [\n FrResizableHandle,\n FrResizablePanel,\n FrResizablePanelGroup,\n ],\n exports: [\n FrResizableHandle,\n FrResizablePanel,\n FrResizablePanelGroup,\n ],\n})\nexport class FrResizableModule {}\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-resizable.mjs","sources":["../../../projects/components/resizable/src/resizable.ts","../../../projects/components/resizable/resizable.module.ts","../../../projects/components/resizable/frame-ui-ng-components-resizable.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n OnDestroy,\r\n booleanAttribute,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { clampNumber, coerceNumber } from '@frame-ui-ng/components/utils';\r\n\r\nexport const FR_RESIZABLE_ORIENTATIONS = ['horizontal', 'vertical'] as const;\r\nexport type FrResizableOrientation = (typeof FR_RESIZABLE_ORIENTATIONS)[number];\r\n\r\nlet nextResizableId = 0;\r\n\r\n/** Resizable panel group that coordinates pane sizes. */\r\n@Directive({\r\n selector: '[frResizablePanelGroup], frame-resizable-panel-group',\r\n exportAs: 'frResizablePanelGroup',\r\n host: {\r\n class: 'frame-resizable',\r\n '[attr.data-orientation]': 'orientation()',\r\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\r\n },\r\n})\r\nexport class FrResizablePanelGroup implements AfterViewInit, OnDestroy {\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly groupId = `frame-resizable-${++nextResizableId}`;\r\n private readonly cleanupFns: Array<() => void> = [];\r\n\r\n readonly orientation = input<FrResizableOrientation>('horizontal');\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly layoutChange = output<number[]>();\r\n\r\n ngAfterViewInit(): void {\r\n queueMicrotask(() => this.initializeLayout());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n for (const cleanup of this.cleanupFns) {\r\n cleanup();\r\n }\r\n }\r\n\r\n panelId(index: number): string {\r\n return `${this.groupId}-panel-${index}`;\r\n }\r\n\r\n panels(): HTMLElement[] {\r\n return Array.from(\r\n this.elementRef.nativeElement.children,\r\n ).filter((child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('FrResizablePanel'));\r\n }\r\n\r\n handles(): HTMLElement[] {\r\n return Array.from(\r\n this.elementRef.nativeElement.children,\r\n ).filter((child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('FrResizableHandle'));\r\n }\r\n\r\n initializeLayout(): void {\r\n const panels = this.panels();\r\n\r\n if (!panels.length) {\r\n return;\r\n }\r\n\r\n const remainingPanels = panels.filter((panel) => !panel.style.flexBasis);\r\n const assignedTotal = panels.reduce((total, panel) => total + (this.panelSize(panel) ?? 0), 0);\r\n const fallbackSize = remainingPanels.length\r\n ? Math.max((100 - assignedTotal) / remainingPanels.length, 0)\r\n : 0;\r\n\r\n panels.forEach((panel, index) => {\r\n panel.id ||= this.panelId(index);\r\n panel.style.flexGrow = '0';\r\n panel.style.flexShrink = '0';\r\n\r\n if (!panel.style.flexBasis) {\r\n this.applyPanelSize(\r\n panel,\r\n clampNumber(this.defaultSize(panel) ?? fallbackSize, this.minSize(panel), this.maxSize(panel)),\r\n );\r\n } else {\r\n this.applyPanelSize(panel, this.panelSize(panel) ?? 0);\r\n }\r\n });\r\n\r\n this.updateHandleMetadata();\r\n this.emitLayout();\r\n }\r\n\r\n startResize(handle: HTMLElement, pointerId: number, startClientX: number, startClientY: number): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n const pair = this.panelPairForHandle(handle);\r\n\r\n if (!pair) {\r\n return;\r\n }\r\n\r\n const groupRect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const dimension = this.orientation() === 'horizontal' ? groupRect.width : groupRect.height;\r\n\r\n if (dimension <= 0) {\r\n return;\r\n }\r\n\r\n const [previousPanel, nextPanel] = pair;\r\n const startPrevious = this.panelSize(previousPanel) ?? 0;\r\n const startNext = this.panelSize(nextPanel) ?? 0;\r\n const pairTotal = startPrevious + startNext;\r\n // Keep pair resizing local so adjacent panels trade space without changing total layout.\r\n const rtlMultiplier =\r\n this.orientation() === 'horizontal' && getComputedStyle(this.elementRef.nativeElement).direction === 'rtl'\r\n ? -1\r\n : 1;\r\n\r\n handle.setPointerCapture?.(pointerId);\r\n handle.setAttribute('data-dragging', '');\r\n this.elementRef.nativeElement.setAttribute('data-resizing', '');\r\n\r\n const move = (event: PointerEvent) => {\r\n const deltaPx =\r\n this.orientation() === 'horizontal'\r\n ? (event.clientX - startClientX) * rtlMultiplier\r\n : event.clientY - startClientY;\r\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + (deltaPx / dimension) * 100);\r\n };\r\n\r\n const end = () => {\r\n handle.removeAttribute('data-dragging');\r\n this.elementRef.nativeElement.removeAttribute('data-resizing');\r\n window.removeEventListener('pointermove', move);\r\n window.removeEventListener('pointerup', end);\r\n window.removeEventListener('pointercancel', end);\r\n };\r\n\r\n window.addEventListener('pointermove', move);\r\n window.addEventListener('pointerup', end, { once: true });\r\n window.addEventListener('pointercancel', end, { once: true });\r\n }\r\n\r\n resizeFromKeyboard(handle: HTMLElement, key: string): boolean {\r\n if (this.disabled()) {\r\n return false;\r\n }\r\n\r\n const pair = this.panelPairForHandle(handle);\r\n\r\n if (!pair) {\r\n return false;\r\n }\r\n\r\n const [previousPanel, nextPanel] = pair;\r\n const startPrevious = this.panelSize(previousPanel) ?? 0;\r\n const startNext = this.panelSize(nextPanel) ?? 0;\r\n const pairTotal = startPrevious + startNext;\r\n const isRtl =\r\n this.orientation() === 'horizontal' &&\r\n getComputedStyle(this.elementRef.nativeElement).direction === 'rtl';\r\n const step = 10;\r\n\r\n switch (key) {\r\n case 'ArrowLeft':\r\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + (isRtl ? step : -step));\r\n return true;\r\n case 'ArrowRight':\r\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + (isRtl ? -step : step));\r\n return true;\r\n case 'ArrowUp':\r\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious - step);\r\n return true;\r\n case 'ArrowDown':\r\n this.resizePair(previousPanel, nextPanel, pairTotal, startPrevious + step);\r\n return true;\r\n case 'Home':\r\n this.resizePair(previousPanel, nextPanel, pairTotal, this.minSize(previousPanel));\r\n return true;\r\n case 'End':\r\n this.resizePair(previousPanel, nextPanel, pairTotal, pairTotal - this.minSize(nextPanel));\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private resizePair(\r\n previousPanel: HTMLElement,\r\n nextPanel: HTMLElement,\r\n pairTotal: number,\r\n requestedPreviousSize: number,\r\n ): void {\r\n // Clamp the previous panel first; the next panel receives the remaining pair size.\r\n const previousMin = this.minSize(previousPanel);\r\n const previousMax = Math.min(this.maxSize(previousPanel), pairTotal - this.minSize(nextPanel));\r\n const previousSize = clampNumber(requestedPreviousSize, previousMin, previousMax);\r\n const nextSize = clampNumber(pairTotal - previousSize, this.minSize(nextPanel), this.maxSize(nextPanel));\r\n\r\n this.applyPanelSize(previousPanel, previousSize);\r\n this.applyPanelSize(nextPanel, nextSize);\r\n this.updateHandleMetadata();\r\n this.emitLayout();\r\n }\r\n\r\n private applyPanelSize(panel: HTMLElement, size: number): void {\r\n const normalizedSize = Math.max(size, 0);\r\n const collapsedThreshold = this.collapsible(panel) ? this.collapsedSize(panel) : 0;\r\n // Collapsible panels snap to their collapsed size instead of shrinking below it.\r\n const collapsed = normalizedSize <= collapsedThreshold;\r\n const appliedSize = collapsed ? collapsedThreshold : normalizedSize;\r\n\r\n panel.style.flexBasis = `${appliedSize}%`;\r\n panel.setAttribute('data-size', String(appliedSize));\r\n panel.toggleAttribute('data-collapsed', collapsed);\r\n }\r\n\r\n private panelPairForHandle(handle: HTMLElement): [HTMLElement, HTMLElement] | null {\r\n let previous = handle.previousElementSibling;\r\n let next = handle.nextElementSibling;\r\n\r\n while (previous && !(previous instanceof HTMLElement && previous.hasAttribute('FrResizablePanel'))) {\r\n previous = previous.previousElementSibling;\r\n }\r\n\r\n while (next && !(next instanceof HTMLElement && next.hasAttribute('FrResizablePanel'))) {\r\n next = next.nextElementSibling;\r\n }\r\n\r\n if (!(previous instanceof HTMLElement) || !(next instanceof HTMLElement)) {\r\n return null;\r\n }\r\n\r\n return [previous, next];\r\n }\r\n\r\n private updateHandleMetadata(): void {\r\n const panels = this.panels();\r\n\r\n this.handles().forEach((handle) => {\r\n const pair = this.panelPairForHandle(handle);\r\n\r\n if (!pair) {\r\n return;\r\n }\r\n\r\n const [previousPanel, nextPanel] = pair;\r\n const previousIndex = panels.indexOf(previousPanel);\r\n const nextIndex = panels.indexOf(nextPanel);\r\n\r\n handle.setAttribute('aria-controls', [previousPanel.id, nextPanel.id].filter(Boolean).join(' '));\r\n handle.setAttribute('aria-valuemin', String(this.minSize(previousPanel)));\r\n handle.setAttribute('aria-valuemax', String(this.maxSize(previousPanel)));\r\n handle.setAttribute('aria-valuenow', String(Math.round(this.panelSize(previousPanel) ?? 0)));\r\n handle.setAttribute('data-panels', `${previousIndex}:${nextIndex}`);\r\n });\r\n }\r\n\r\n private emitLayout(): void {\r\n this.layoutChange.emit(this.panels().map((panel) => this.panelSize(panel) ?? 0));\r\n }\r\n\r\n private panelSize(panel: HTMLElement): number | null {\r\n const styleSize = Number.parseFloat(panel.style.flexBasis);\r\n\r\n if (Number.isFinite(styleSize)) {\r\n return styleSize;\r\n }\r\n\r\n const dataSize = Number(panel.getAttribute('data-size'));\r\n return Number.isFinite(dataSize) ? dataSize : null;\r\n }\r\n\r\n private defaultSize(panel: HTMLElement): number | null {\r\n const value = panel.getAttribute('data-default-size');\r\n return value === null ? null : coerceNumber(value, 0);\r\n }\r\n\r\n private minSize(panel: HTMLElement): number {\r\n return coerceNumber(panel.getAttribute('data-min-size'), 0);\r\n }\r\n\r\n private maxSize(panel: HTMLElement): number {\r\n return coerceNumber(panel.getAttribute('data-max-size'), 100);\r\n }\r\n\r\n private collapsedSize(panel: HTMLElement): number {\r\n return coerceNumber(panel.getAttribute('data-collapsed-size'), 0);\r\n }\r\n\r\n private collapsible(panel: HTMLElement): boolean {\r\n return panel.hasAttribute('data-collapsible');\r\n }\r\n}\r\n\r\n/** Panel slot for resizable. */\r\n@Directive({\r\n selector: '[frResizablePanel], frame-resizable-panel',\r\n host: {\r\n class: 'frame-resizable__panel',\r\n '[attr.data-default-size]': 'defaultSize()',\r\n '[attr.data-min-size]': 'minSize()',\r\n '[attr.data-max-size]': 'maxSize()',\r\n '[attr.data-collapsible]': 'collapsible() ? \"\" : null',\r\n '[attr.data-collapsed-size]': 'collapsedSize()',\r\n },\r\n})\r\nexport class FrResizablePanel {\r\n readonly defaultSize = input<number, unknown>(0, { transform: (value) => coerceNumber(value, 0) });\r\n readonly minSize = input<number, unknown>(0, { transform: (value) => coerceNumber(value, 0) });\r\n readonly maxSize = input<number, unknown>(100, { transform: (value) => coerceNumber(value, 100) });\r\n readonly collapsible = input(false, { transform: booleanAttribute });\r\n readonly collapsedSize = input<number, unknown>(0, { transform: (value) => coerceNumber(value, 0) });\r\n}\r\n\r\n/** Resize handle between adjacent resizable panels. */\r\n@Directive({\r\n selector: '[frResizableHandle], frame-resizable-handle',\r\n host: {\r\n class: 'frame-resizable__handle',\r\n role: 'separator',\r\n tabindex: '0',\r\n '[attr.aria-orientation]': 'group.orientation()',\r\n '[attr.data-orientation]': 'group.orientation()',\r\n '[attr.data-handle]': 'withHandle() ? \"\" : null',\r\n '[attr.data-disabled]': 'group.disabled() ? \"\" : null',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n})\r\nexport class FrResizableHandle {\r\n protected readonly group = inject(FrResizablePanelGroup);\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n readonly withHandle = input(false, { transform: booleanAttribute });\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this.group.startResize(this.elementRef.nativeElement, event.pointerId, event.clientX, event.clientY);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (this.group.resizeFromKeyboard(this.elementRef.nativeElement, event.key)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrResizableHandle,\n FrResizablePanel,\n FrResizablePanelGroup,\n} from './src/resizable';\n\n@NgModule({\n imports: [\n FrResizableHandle,\n FrResizablePanel,\n FrResizablePanelGroup,\n ],\n exports: [\n FrResizableHandle,\n FrResizablePanel,\n FrResizablePanelGroup,\n ],\n})\nexport class FrResizableModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, DestroyRef, ViewContainerRef, signal, input, Directive, ElementRef, model, booleanAttribute, computed,
|
|
2
|
+
import { inject, DestroyRef, ViewContainerRef, signal, input, Directive, ElementRef, model, booleanAttribute, computed, afterNextRender, contentChild, NgModule } from '@angular/core';
|
|
3
3
|
import * as i1 from '@frame-ui-ng/components/dropdown-menu';
|
|
4
4
|
import { FrDropdownMenuContent, buildConnectedPositions, FR_DROPDOWN_MENU_CONTENT, FrDropdownMenuTree, FR_DROPDOWN_MENU_PARENT, FrDropdownMenuPanel, FrDropdownMenuTrigger, FrDropdownMenu, FrDropdownMenuLabel, FrDropdownMenuSeparator, FrDropdownMenuItem } from '@frame-ui-ng/components/dropdown-menu';
|
|
5
5
|
import { FrControlValueAccessor, provideDsValueAccessor } from '@frame-ui-ng/components/forms';
|
|
6
6
|
|
|
7
7
|
const FR_SELECT_POSITIONS = ['item-aligned', 'popper'];
|
|
8
|
+
/** Content slot for select. */
|
|
8
9
|
class FrSelectContent extends FrDropdownMenuContent {
|
|
9
10
|
destroyRef = inject(DestroyRef);
|
|
10
11
|
viewContainerRef = inject(ViewContainerRef);
|
|
@@ -32,10 +33,12 @@ class FrSelectContent extends FrDropdownMenuContent {
|
|
|
32
33
|
if (this.registrationView) {
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
36
|
+
// Render once offscreen so projected items can register before the menu opens.
|
|
35
37
|
this.registrationView = this.viewContainerRef.createEmbeddedView(this.templateRef);
|
|
36
38
|
this.registrationView.detectChanges();
|
|
37
39
|
const index = this.viewContainerRef.indexOf(this.registrationView);
|
|
38
40
|
if (index >= 0) {
|
|
41
|
+
// Keep registrations alive without inserting the template into the DOM twice.
|
|
39
42
|
this.viewContainerRef.detach(index);
|
|
40
43
|
}
|
|
41
44
|
}
|
|
@@ -94,6 +97,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
94
97
|
],
|
|
95
98
|
}]
|
|
96
99
|
}], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
|
|
100
|
+
/** Panel slot for select. */
|
|
97
101
|
class FrSelectPanel {
|
|
98
102
|
content = inject(FrSelectContent);
|
|
99
103
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
@@ -113,14 +117,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
113
117
|
}] });
|
|
114
118
|
|
|
115
119
|
const FR_SELECT_INDICATOR_POSITIONS = ['start', 'end'];
|
|
120
|
+
/** Select control backed by dropdown menu primitives. */
|
|
116
121
|
class FrSelect extends FrControlValueAccessor {
|
|
117
122
|
destroyRef = inject(DestroyRef);
|
|
118
123
|
dropdownTrigger = inject(FrDropdownMenuTrigger);
|
|
119
124
|
elementRef = inject(ElementRef);
|
|
120
125
|
selectedLabel = signal(null, ...(ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []));
|
|
121
126
|
labels = new Map();
|
|
127
|
+
lastContent = null;
|
|
128
|
+
lastContentDebugVisible = false;
|
|
129
|
+
lastDebugVisible = false;
|
|
130
|
+
lastTriggerWidth = 0;
|
|
122
131
|
resizeObserver = null;
|
|
123
132
|
value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
133
|
+
menuContent = input(null, { ...(ngDevMode ? { debugName: "menuContent" } : /* istanbul ignore next */ {}), alias: 'frSelect' });
|
|
124
134
|
debugVisible = input(false, { ...(ngDevMode ? { debugName: "debugVisible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
125
135
|
disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled', transform: booleanAttribute });
|
|
126
136
|
indicatorPosition = input('start', ...(ngDevMode ? [{ debugName: "indicatorPosition" }] : /* istanbul ignore next */ []));
|
|
@@ -136,22 +146,21 @@ class FrSelect extends FrControlValueAccessor {
|
|
|
136
146
|
}, ...(ngDevMode ? [{ debugName: "displayValue" }] : /* istanbul ignore next */ []));
|
|
137
147
|
constructor() {
|
|
138
148
|
super();
|
|
139
|
-
|
|
140
|
-
const content = this.dropdownTrigger.menuContent();
|
|
141
|
-
if (content) {
|
|
142
|
-
content.select = this;
|
|
143
|
-
content.setDebugVisibleOverride(this.debugVisible() ? true : null);
|
|
144
|
-
content.setTriggerWidth(this.elementRef.nativeElement.offsetWidth);
|
|
145
|
-
content.ensureItemsRegistered();
|
|
146
|
-
}
|
|
147
|
-
});
|
|
149
|
+
afterNextRender(() => this.syncContent());
|
|
148
150
|
queueMicrotask(() => {
|
|
151
|
+
this.syncContent();
|
|
149
152
|
this.attachResizeObserver();
|
|
150
153
|
});
|
|
151
154
|
this.destroyRef.onDestroy(() => {
|
|
152
155
|
this.resizeObserver?.disconnect();
|
|
153
156
|
});
|
|
154
157
|
}
|
|
158
|
+
ngDoCheck() {
|
|
159
|
+
this.syncContent();
|
|
160
|
+
}
|
|
161
|
+
ngAfterViewChecked() {
|
|
162
|
+
this.syncContent();
|
|
163
|
+
}
|
|
155
164
|
registerItem(value, label) {
|
|
156
165
|
this.labels.set(value, label);
|
|
157
166
|
if (this.value() === value) {
|
|
@@ -179,13 +188,45 @@ class FrSelect extends FrControlValueAccessor {
|
|
|
179
188
|
}
|
|
180
189
|
const element = this.elementRef.nativeElement;
|
|
181
190
|
this.resizeObserver = new ResizeObserver(() => {
|
|
182
|
-
const content = this.
|
|
191
|
+
const content = this.resolveContent();
|
|
183
192
|
content?.setTriggerWidth(element.offsetWidth);
|
|
184
193
|
});
|
|
185
194
|
this.resizeObserver.observe(element);
|
|
186
195
|
}
|
|
196
|
+
syncContent() {
|
|
197
|
+
const content = this.resolveContent();
|
|
198
|
+
if (!content) {
|
|
199
|
+
this.lastContent = null;
|
|
200
|
+
this.dropdownTrigger.setMenuContentOverride(null);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const debugVisible = this.debugVisible();
|
|
204
|
+
const contentDebugVisible = debugVisible || content.debugVisible();
|
|
205
|
+
const triggerWidth = this.elementRef.nativeElement.offsetWidth;
|
|
206
|
+
if (content === this.lastContent &&
|
|
207
|
+
debugVisible === this.lastDebugVisible &&
|
|
208
|
+
contentDebugVisible === this.lastContentDebugVisible &&
|
|
209
|
+
triggerWidth === this.lastTriggerWidth) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
content.select = this;
|
|
213
|
+
content.setDebugVisibleOverride(debugVisible ? true : null);
|
|
214
|
+
content.setTriggerWidth(triggerWidth);
|
|
215
|
+
content.ensureItemsRegistered();
|
|
216
|
+
this.dropdownTrigger.setMenuContentOverride(content);
|
|
217
|
+
if (content.isDebugVisible()) {
|
|
218
|
+
queueMicrotask(() => this.dropdownTrigger.open());
|
|
219
|
+
}
|
|
220
|
+
this.lastContent = content;
|
|
221
|
+
this.lastContentDebugVisible = contentDebugVisible;
|
|
222
|
+
this.lastDebugVisible = debugVisible;
|
|
223
|
+
this.lastTriggerWidth = triggerWidth;
|
|
224
|
+
}
|
|
225
|
+
resolveContent() {
|
|
226
|
+
return this.menuContent() ?? this.dropdownTrigger.menuContent();
|
|
227
|
+
}
|
|
187
228
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
188
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSelect, isStandalone: true, selector: "button[frSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, debugVisible: { classPropertyName: "debugVisible", publicName: "debugVisible", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, indicatorPosition: { classPropertyName: "indicatorPosition", publicName: "indicatorPosition", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "aria-autocomplete": "none", "aria-haspopup": "listbox", "type": "button", "role": "combobox" }, properties: { "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.aria-invalid": "invalid() ? \"true\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.disabled": "disabled() ? \"\" : null" }, classAttribute: "frame-select__trigger" }, providers: [provideDsValueAccessor(FrSelect)], usesInheritance: true, hostDirectives: [{ directive: i1.FrDropdownMenu, inputs: ["closeDelay", "closeDelay", "triggerMode", "triggerMode"] }, { directive: i1.FrDropdownMenuTrigger
|
|
229
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrSelect, isStandalone: true, selector: "button[frSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, menuContent: { classPropertyName: "menuContent", publicName: "frSelect", isSignal: true, isRequired: false, transformFunction: null }, debugVisible: { classPropertyName: "debugVisible", publicName: "debugVisible", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, indicatorPosition: { classPropertyName: "indicatorPosition", publicName: "indicatorPosition", isSignal: true, isRequired: false, transformFunction: null }, invalidInput: { classPropertyName: "invalidInput", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "aria-autocomplete": "none", "aria-haspopup": "listbox", "type": "button", "role": "combobox" }, properties: { "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.aria-invalid": "invalid() ? \"true\" : null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-invalid": "invalid() ? \"\" : null", "attr.disabled": "disabled() ? \"\" : null" }, classAttribute: "frame-select__trigger" }, providers: [provideDsValueAccessor(FrSelect)], usesInheritance: true, hostDirectives: [{ directive: i1.FrDropdownMenu, inputs: ["closeDelay", "closeDelay", "triggerMode", "triggerMode"] }, { directive: i1.FrDropdownMenuTrigger }], ngImport: i0 });
|
|
189
230
|
}
|
|
190
231
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelect, decorators: [{
|
|
191
232
|
type: Directive,
|
|
@@ -198,7 +239,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
198
239
|
},
|
|
199
240
|
{
|
|
200
241
|
directive: FrDropdownMenuTrigger,
|
|
201
|
-
inputs: ['frDropdownMenuTrigger: frSelect'],
|
|
202
242
|
},
|
|
203
243
|
],
|
|
204
244
|
providers: [provideDsValueAccessor(FrSelect)],
|
|
@@ -215,9 +255,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
215
255
|
role: 'combobox',
|
|
216
256
|
},
|
|
217
257
|
}]
|
|
218
|
-
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indicatorPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorPosition", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
|
|
258
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], menuContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "frSelect", required: false }] }], debugVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "debugVisible", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indicatorPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorPosition", required: false }] }], invalidInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
|
|
219
259
|
|
|
220
260
|
const FR_SELECT_ICON_POSITIONS = ['leading', 'trailing'];
|
|
261
|
+
/** Value slot for select. */
|
|
221
262
|
class FrSelectValue {
|
|
222
263
|
select = inject(FrSelect);
|
|
223
264
|
placeholder = input('Select an option', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
@@ -237,6 +278,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
237
278
|
},
|
|
238
279
|
}]
|
|
239
280
|
}], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
|
|
281
|
+
/** Indicator slot for select item. */
|
|
240
282
|
class FrSelectItemIndicator {
|
|
241
283
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectItemIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
242
284
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectItemIndicator, isStandalone: true, selector: "[frSelectItemIndicator], frame-select-item-indicator", host: { attributes: { "aria-hidden": "true" }, classAttribute: "frame-select__item-indicator" }, ngImport: i0 });
|
|
@@ -251,6 +293,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
251
293
|
},
|
|
252
294
|
}]
|
|
253
295
|
}] });
|
|
296
|
+
/** Icon slot for select. */
|
|
254
297
|
class FrSelectIcon {
|
|
255
298
|
position = input('trailing', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
|
|
256
299
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
@@ -267,6 +310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
267
310
|
},
|
|
268
311
|
}]
|
|
269
312
|
}], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
|
|
313
|
+
/** Error slot for select. */
|
|
270
314
|
class FrSelectError {
|
|
271
315
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectError, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
272
316
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectError, isStandalone: true, selector: "[frSelectError], frame-select-error", host: { attributes: { "aria-live": "polite" }, classAttribute: "frame-select__error" }, ngImport: i0 });
|
|
@@ -282,6 +326,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
282
326
|
}]
|
|
283
327
|
}] });
|
|
284
328
|
|
|
329
|
+
/** Group slot for select. */
|
|
285
330
|
class FrSelectGroup {
|
|
286
331
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
287
332
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectGroup, isStandalone: true, selector: "[frSelectGroup], frame-select-group", host: { classAttribute: "frame-select__group" }, ngImport: i0 });
|
|
@@ -295,6 +340,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
295
340
|
},
|
|
296
341
|
}]
|
|
297
342
|
}] });
|
|
343
|
+
/** Label slot for select. */
|
|
298
344
|
class FrSelectLabel {
|
|
299
345
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
300
346
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectLabel, isStandalone: true, selector: "[frSelectLabel], frame-select-label", host: { classAttribute: "frame-select__label" }, hostDirectives: [{ directive: i1.FrDropdownMenuLabel }], ngImport: i0 });
|
|
@@ -309,6 +355,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
309
355
|
},
|
|
310
356
|
}]
|
|
311
357
|
}] });
|
|
358
|
+
/** Separator slot for select. */
|
|
312
359
|
class FrSelectSeparator {
|
|
313
360
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrSelectSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
314
361
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrSelectSeparator, isStandalone: true, selector: "[frSelectSeparator], frame-select-separator", host: { classAttribute: "frame-select__separator" }, hostDirectives: [{ directive: i1.FrDropdownMenuSeparator }], ngImport: i0 });
|
|
@@ -323,6 +370,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
323
370
|
},
|
|
324
371
|
}]
|
|
325
372
|
}] });
|
|
373
|
+
/** Item slot for select. */
|
|
326
374
|
class FrSelectItem {
|
|
327
375
|
elementRef = inject((ElementRef));
|
|
328
376
|
content = inject(FrSelectContent);
|