Sliding Container
wje-sliding-container zobrazuje kontextový panel zľava, sprava alebo zo spodnej hrany zvoleného layout scope. Smer určuje atribút direction="left|right|bottom"; spodný panel nie je obmedzený iba na mobilný viewport.
direction | Správanie |
|---|---|
left | Horizontálny panel ukotvený na ľavej strane. |
right | Horizontálny panel ukotvený na pravej strane. Predvolená hodnota. |
bottom | Spodný drawer s vertikálnou animáciou a voliteľným resize handlom. Vždy používa overlay geometriu. |
Rozšírený panel
Otvorený bočný panel môže zobraziť druhú časť s ľubovoľným obsahom, napríklad náhľad PDF. Jej obsah poskytuje aplikácia cez pomenovaný slot expanded; komponent ho nevytvára ani nečistí.
expanded-widthurčuje šírku rozšírenej častiE, nie celkovú šírku. Podporuje platné CSS rozmery vrátanecalc()a%; percentá sa vyhodnocujú voči šírke základného panelaB.expanded-directionurčuje fyzickú stranu, na ktorej sa rozšírená časť vykreslí vedľa základného panela (leftaleboright). Ak ho neuvediete, použije sa opačná strana akodirection.expanded-triggerje názov udalosti nadocument, ktorá prepína rozšírenú časť, podobne akotriggerprepína základný panel.
Pri variant="in-place" sa rezervované miesto určuje vzťahom oboch smerov:
variant | Vzťah smerov | Miesto rezervované v layoute | Vrstva nad obsahom |
|---|---|---|---|
in-place | expanded-direction je rovnaký ako direction | základný panel B | rozšírená časť E |
in-place | expanded-direction je opačný ako direction | rozšírená časť E | základný panel B |
over | ľubovoľná kombinácia | žiadne | oba panely B + E |
Napríklad pri B = 444px, E = 700px, direction="left" a expanded-direction="right" sa obsah po rozšírení posunie o ďalších 256px. Zrkadlová kombinácia direction="right" a expanded-direction="left" funguje rovnako z opačnej strany. Hodnota E môže byť aj menšia ako B; vtedy sa rezervované miesto zmenší. Rozšírená časť má rovnakú výšku ako základný panel a jej wrapper má overflow: hidden, preto si prípadný scroll riadi slotted obsah.
<wje-button dialog="contract-detail">Otvoriť zmluvu</wje-button>
<wje-sliding-container
id="contract-detail"
trigger="contract-detail"
expanded-trigger="contract-preview"
direction="left"
variant="in-place"
max-width="444px"
expanded-width="700px"
expanded-direction="right"
>
<section>
<h3>Pracovná zmluva</h3>
<wje-button dialog="contract-preview">Náhľad</wje-button>
</section>
<div id="contract-preview-host" slot="expanded">
<iframe title="Náhľad zmluvy" src="/preview/contract.pdf"></iframe>
</div>
</wje-sliding-container>
Pred otvorením náhľadu si dostupnosť overte cez canExpand(). Metóda vráti false, ak základný panel nie je otvorený, chýba obsah slotu, šírka nie je platná a kladná, alebo by sa zvolená strana nezmestila do aktuálneho viewportu. Komponent smer automaticky nepreklopí a šírku neoreže. Ak sa už otvorená zostava po zmene viewportu prestane zmestiť, rozšírená časť sa automaticky zbalí. Pri direction="bottom" je rozšírenie vždy vypnuté.
| API | Výsledok |
|---|---|
canExpand(): boolean | Vráti, či je možné rozšírenú časť práve zobraziť. |
expand(): Promise<boolean> | Otvorí ju a vráti true; pri nedostupnom alebo prerušenom otvorení vráti false. |
collapse(): Promise<boolean> | Zbalí iba rozšírenú časť a ponechá základný panel otvorený. |
toggleExpanded(): Promise<boolean> | Prepne rozšírenú časť. |
resetExpanded(): void | Okamžite a bez animácie obnoví základný stav. |
isExpanded: boolean | Read-only informácia o otvorení rozšírenej časti. |
Pri zbalení zostáva slotted DOM pripojený, ale wrapper je skrytý, inert a aria-hidden. Zatvorenie celého kontajnera rozšírenie resetuje, takže ďalšie otvorenie zobrazí iba základný panel. Pri načítaní iného záznamu má aplikácia zavolať resetExpanded() a sama vyčistiť alebo nahradiť obsah hostiteľa slotu:
const panel = document.querySelector('#contract-detail');
const previewHost = document.querySelector('#contract-preview-host');
function loadContractPreview(previewElement) {
panel.resetExpanded();
previewHost.replaceChildren(previewElement);
}
Komponent vysiela udalosti wje-sliding-container:beforeExpand a wje-sliding-container:expand pri otvorení a wje-sliding-container:beforeCollapse a wje-sliding-container:afterCollapse pri zbalení. Rozšírený wrapper je dostupný cez part="expanded"; jeho pozadie upravíte cez --wje-sliding-container-expanded-background.
Backdrop
Boolean atribút backdrop zapne pri otvorenom paneli backdrop cez celý viewport. Rovnaká portaled vrstva na úrovni document.body sa používa pre všetky smery, preto má rovnaké vrstvenie a animáciu. Backdrop nezamyká scroll dokumentu.
Samotný backdrop blokuje interakciu s prekrytým obsahom. Ak má klik na backdrop zároveň zatvoriť panel, pridajte backdrop-dismiss. Pri nových použitiach backdrop-dismiss bez atribútu backdrop žiadnu vrstvu nevytvorí.
Kvôli spätnej kompatibilite zostáva jedna výnimka: aktívny legacy režim mobile-presentation="bottom-sheet" s backdrop-dismiss vytvorí backdrop aj bez explicitného backdrop, rovnako ako v predchádzajúcich verziách. Pri úprave existujúceho kódu odporúčame atribút backdrop doplniť, aby bol zámer jednoznačný a konfigurácia fungovala rovnako aj s priamym direction="bottom".
<wje-sliding-container
backdrop
backdrop-dismiss
style="
--wje-sliding-container-backdrop-background: rgba(15, 23, 42, .55);
--wje-sliding-container-backdrop-opacity: .9;
--wje-sliding-container-backdrop-filter: blur(2px);
"
>
<div>Detail</div>
</wje-sliding-container>
| CSS token | Význam |
|---|---|
--wje-sliding-container-backdrop-background | Farba alebo ľubovoľné CSS pozadie backdropu. |
--wje-sliding-container-backdrop-opacity | Výsledná opacity otvoreného backdropu; predvolene 1. |
--wje-sliding-container-backdrop-filter | Filter obsahu pod backdropom, napríklad blur(2px); predvolene none. |
--wje-sliding-container-backdrop-z-index | Globálny z-index portaled backdropu; bez hodnoty je o jednu vrstvu pod hostiteľom. |
Otvorenie a zatvorenie backdropu používa rovnaké animation-duration a animation-easing ako panel. Starší token --wje-sliding-container-portal-backdrop-z-index zostáva podporovaný ako fallback.
Spodný drawer
Spodnú prezentáciu zapnete priamo cez direction="bottom". Funguje na desktope aj mobile a nepodporuje rozšírený slot. Pre používateľom nastaviteľnú výšku pridajte sheet-resizable a nastavte sheet-height, sheet-min-height a sheet-max-height.
Pri priamom direction="bottom" je panel predvolene viazaný na rodičovský kontajner, rovnako ako bočné smery. Cez scope="viewport" ho môžete explicitne roztiahnuť na celý viewport; scope="container" alebo scope="parent" ho ponechá v okolí komponentu. Prípadný backdrop zostáva vždy celostránkový.
Staršie atribúty sheet-scope a sheet-boundary zostávajú podporované. Pri scope="container" alebo sheet-scope="container" môžete cez sheet-boundary uviesť CSS selektor najbližšieho composed ancestor elementu, ktorý má tvoriť hranice panela.
<wje-button dialog="reservation-panel">Open panel</wje-button>
<wje-sliding-container
trigger="reservation-panel"
direction="bottom"
scope="container"
max-height="85vh"
sheet-resizable
sheet-height="55vh"
sheet-min-height="35vh"
sheet-max-height="92vh"
backdrop
backdrop-dismiss
has-opacity
>
<div class="panel-content">
<h3>Reservation details</h3>
<p>Panel sa otvorí zo spodnej hrany svojho kontajnera.</p>
</div>
</wje-sliding-container>
Panel používa part sliding-container; resize handle používa party sheet-handle-area a sheet-handle.
Kompatibilita so starším responzívnym API
Existujúce použitia mobile-presentation="bottom-sheet" a mobile-break-point zostávajú podporované. Pod breakpointom sa interne vyhodnotia ako efektívny smer bottom; nad breakpointom sa zachová nakonfigurovaný smer left alebo right. Legacy režim si bez explicitného scope alebo sheet-scope zachováva pôvodný viewport scope a kombinácia s backdrop-dismiss si zachováva aj pôvodný implicitný backdrop.
Verejná metóda isBottomSheet() zostáva dostupná pre existujúce aplikačné lifecycle hooky. Vráti true pri aktívnej legacy mobilnej prezentácii aj pri priamom direction="bottom". Pre nový kód preferujte priamo direction="bottom" vždy, keď má byť drawer spodný bez ohľadu na viewport.