Skip to content

Commit 85a2ea0

Browse files
committed
feat: added examples
1 parent 9408dc4 commit 85a2ea0

File tree

18 files changed

+480
-31
lines changed

18 files changed

+480
-31
lines changed

packages/components-dev/popover/module.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ import { DevThemeToggle } from '../theme-toggle';
2828
selector: 'dev-examples',
2929
imports: [PopoverExamplesModule],
3030
template: `
31+
<popover-scrolling-and-layering-example />
32+
<br />
3133
<popover-paddings-example />
34+
<br />
3235
<popover-small-example />
3336
<!-- <popover-width-example />-->
3437
<!-- <popover-common-example />-->

packages/components-dev/select/module.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ import { DEV_OPTIONS } from './mock';
2020
selector: 'dev-examples',
2121
imports: [SelectExamplesModule],
2222
template: `
23+
<select-scrolling-and-layering-example />
24+
<hr />
25+
2326
<select-with-multiline-matcher-example />
2427
<hr />
2528

packages/components/core/pop-up/constants.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ export type KbqPopUpSizeValues = KbqEnumValues<PopUpSizes>;
6363
*/
6464
export const defaultOffsetY: number = 4;
6565

66+
/**
67+
* Default value when configuring overlay in popups (Autocomplete, Datepicker, Dropdown, Select, Tags Autocomplete,
68+
* Tags Input, Timezone, TreeSelect).
69+
*/
70+
export const defaultOffsetX: number = 0;
71+
6672
/**
6773
* Variable used for offsetY(X) calculations when applying Angular Overlay
6874
*

packages/components/popover/popover.component.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
POSITION_TO_CSS_MAP,
4545
PopUpSizes,
4646
PopUpTriggers,
47-
applyPopupMargins
47+
applyPopupMargins, defaultOffsetY, defaultOffsetX
4848
} from '@koobiq/components/core';
4949
import { KbqIconModule } from '@koobiq/components/icon';
5050
import { NEVER, fromEvent, merge } from 'rxjs';
@@ -399,6 +399,16 @@ export class KbqPopoverTrigger extends KbqPopUpTrigger<KbqPopoverComponent> impl
399399

400400
@Output('kbqPopoverVisibleChange') readonly visibleChange = new EventEmitter<boolean>();
401401

402+
/** Calculates the vertical offset relative to the overlay container. */
403+
get offsetY(): number {
404+
return defaultOffsetY - (this.overlayContainerRects?.y ?? 0);
405+
}
406+
407+
/** Calculates the horizontal offset relative to the overlay container. */
408+
get offsetX(): number {
409+
return defaultOffsetX - (this.overlayContainerRects?.x ?? 0);
410+
}
411+
402412
protected originSelector = '.kbq-popover';
403413

404414
protected get overlayConfig(): OverlayConfig {
@@ -409,6 +419,8 @@ export class KbqPopoverTrigger extends KbqPopUpTrigger<KbqPopoverComponent> impl
409419
};
410420
}
411421

422+
private overlayContainerRects?: DOMRect;
423+
412424
ngOnInit(): void {
413425
super.ngOnInit();
414426

@@ -431,11 +443,21 @@ export class KbqPopoverTrigger extends KbqPopUpTrigger<KbqPopoverComponent> impl
431443
}
432444
});
433445
}
446+
447+
this.overlayContainerRects = this.overlayContainer?.getContainerElement().parentElement?.getBoundingClientRect();
434448
}
435449

450+
/**
451+
* Overrides the base `show` method to display the overlay component with the
452+
* specified entry delay and apply default positioning offsets.
453+
*/
436454
override show(delay: number = this.enterDelay) {
437455
super.show(delay);
438456

457+
this.strategy
458+
.withDefaultOffsetX(this.offsetX)
459+
.withDefaultOffsetY(this.offsetY)
460+
439461
this.ngZone.onStable
440462
.asObservable()
441463
.pipe(take(1))

packages/components/popover/popover.en.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ The close button can be placed in the header or in the top right corner when the
8282

8383
<!-- example(popover-close) -->
8484

85+
### Layering
86+
By default, the popover is hidden beneath the horizontal Navbar and Topbar; in other cases, it appears above adjacent elements.
87+
88+
To prevent the popover from overlapping a required element during scrolling and instead have it hidden beneath it, adjust its position using a custom z-index or offset parameters.
89+
90+
<!-- example(popover-scrolling-and-layering) -->
91+
8592
### Recommendations
8693

8794
When a short text without interactive elements needs to be shown in a popup, use a [tooltip](/en/components/tooltip).

packages/components/popover/popover.ru.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@
8282

8383
<!-- example(popover-close) -->
8484

85+
### Наслоение
86+
По умолчанию поповер скрывается под горизонтальный Navbar и Topbar, в остальных случаях показывается поверх соседних элементов.
87+
88+
Чтобы поповер не перекрывал нужный вам элемент при прокрутке, а скрывался под ним, настройте положение через кастомный z-index или параметры смещения.
89+
90+
<!-- example(popover-scrolling-and-layering) -->
91+
8592
### Рекомендации
8693

8794
Когда нужно показать во всплывающем окне короткий текст без интерактивных элементов, то используйте [тултип](/ru/components/tooltip).

packages/components/select/select.component.ts

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ import {
8282
KbqSelectTrigger,
8383
KbqVirtualOption,
8484
defaultOffsetY,
85+
defaultOffsetX,
8586
getKbqSelectDynamicMultipleError,
8687
getKbqSelectNonArrayValueError,
8788
getKbqSelectNonFunctionValueError,
@@ -248,35 +249,42 @@ export class KbqSelect
248249
/** Strategy that will be used to handle scrolling while the select panel is open. */
249250
scrollStrategy = this.scrollStrategyFactory();
250251

251-
/**
252-
* The y-offset of the overlay panel in relation to the trigger's top start corner.
253-
* This must be adjusted to align the selected option text over the trigger text.
254-
* when the panel opens. Will change based on the y-position of the selected option.
255-
*/
256-
offsetY = defaultOffsetY;
252+
/** Calculates the vertical offset relative to the overlay container. */
253+
get offsetY(): number {
254+
return defaultOffsetY - (this.overlayContainerRects?.y ?? 0);
255+
}
256+
257+
/** Calculates the horizontal offset relative to the overlay container. */
258+
get offsetX(): number {
259+
return defaultOffsetX - (this.overlayContainerRects?.x ?? 0);
260+
}
257261

258262
/**
259263
* This position config ensures that the top "start" corner of the overlay
260264
* is aligned with the top "start" of the origin by default (overlapping
261265
* the trigger completely). If the panel cannot fit below the trigger, it
262266
* will fall back to a position above the trigger.
263267
*/
264-
positions: ConnectedPosition[] = [
265-
{
266-
originX: 'start',
267-
originY: 'bottom',
268-
overlayX: 'start',
269-
overlayY: 'top',
270-
offsetY: this.offsetY
271-
},
272-
{
273-
originX: 'start',
274-
originY: 'top',
275-
overlayX: 'start',
276-
overlayY: 'bottom',
277-
offsetY: -this.offsetY
278-
}
279-
];
268+
get positions(): ConnectedPosition[] {
269+
return [
270+
{
271+
originX: 'start',
272+
originY: 'bottom',
273+
overlayX: 'start',
274+
overlayY: 'top',
275+
offsetY: this.offsetY,
276+
offsetX: this.offsetX
277+
},
278+
{
279+
originX: 'start',
280+
originY: 'top',
281+
overlayX: 'start',
282+
overlayY: 'bottom',
283+
offsetY: -this.offsetY,
284+
offsetX: -this.offsetX
285+
}
286+
];
287+
}
280288

281289
/**
282290
* Trigger - is a clickable field to open select dropdown panel
@@ -661,6 +669,8 @@ export class KbqSelect
661669
/** Origin for the overlay panel. */
662670
protected overlayOrigin?: CdkOverlayOrigin | ElementRef;
663671

672+
private overlayContainerRects?: DOMRect;
673+
664674
constructor(
665675
private readonly _changeDetectorRef: ChangeDetectorRef,
666676
private readonly _ngZone: NgZone,
@@ -764,6 +774,8 @@ export class KbqSelect
764774
filter(() => !this.keyManager.activeItem)
765775
)
766776
.subscribe(() => this.keyManager.updateActiveItem(0));
777+
778+
this.overlayContainerRects = this.overlayContainer?.getContainerElement().parentElement?.getBoundingClientRect();
767779
}
768780

769781
ngOnDestroy() {

packages/components/select/select.en.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,13 @@ Add `cdk-virtual-scroll-viewport` to your component template to display only vis
142142

143143
<!-- example(select-virtual-scroll) -->
144144

145+
### Layering
146+
By default, the dropdown menu is hidden beneath the horizontal Navbar and Topbar; in other cases, it appears above adjacent elements.
147+
148+
To prevent the menu from overlapping a required element during scrolling and instead have it hidden beneath it, adjust its position using a custom z-index or offset parameters.
149+
150+
<!-- example(select-scrolling-and-layering) -->
151+
145152
### Recommendations
146153

147154
- If you are using a select without a label, we suggest adding a placeholder to indicate what information the user should select. For example, “Country.”

packages/components/select/select.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@
9595
[cdkConnectedOverlayBackdropClass]="backdropClass"
9696
[cdkConnectedOverlayHasBackdrop]="hasBackdrop"
9797
[cdkConnectedOverlayMinWidth]="overlayMinWidth"
98-
[cdkConnectedOverlayOffsetY]="offsetY"
9998
[cdkConnectedOverlayOpen]="panelOpen"
10099
[cdkConnectedOverlayOrigin]="overlayOrigin || fallbackOverlayOrigin"
101100
[cdkConnectedOverlayPanelClass]="overlayPanelClass"

packages/components/select/select.ru.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ import { kbqSelectOptionsProvider } from '@koobiq/components/select';
141141

142142
<!-- example(select-virtual-scroll) -->
143143

144+
### Наслоение
145+
По умолчанию выпадающее меню скрывается под горизонтальный Navbar и Topbar, в остальных случаях показывается поверх соседних элементов.
146+
147+
Чтобы меню не перекрывало нужный вам элемент при прокрутке, а скрывалось под ним, настройте положение через кастомный z-index или параметры смещения.
148+
149+
<!-- example(select-scrolling-and-layering) -->
150+
144151
### Рекомендации
145152

146153
- Если вы используете селект без лейбла, то советуем добавить placeholder для указания, какую информацию пользователь должен выбрать. Например, «Страна».

0 commit comments

Comments
 (0)