UNPKG

uikit

Version:

UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.

216 lines (166 loc) • 5.2 kB
// Name: Lightbox // Description: Component to create an lightbox image gallery // // Component: `uk-lightbox` // // Sub-objects: `uk-lightbox-page` // `uk-lightbox-items` // `uk-lightbox-items-fit` // `uk-lightbox-thumbnav` // `uk-lightbox-thumbnav-vertical` // `uk-lightbox-dotnav` // `uk-lightbox-caption` // `uk-lightbox-counter` // `uk-lightbox-iframe` // `uk-lightbox-zoom` // // States: `uk-open` // // ======================================================================== // Variables // ======================================================================== @lightbox-z-index: @global-z-index + 10; @lightbox-background: #000; @lightbox-color-mode: light; @lightbox-focus-outline: rgba(255,255,255,0.7); @lightbox-item-max-width: 100vw; @lightbox-item-max-height: 100vh; @lightbox-thumbnav-vertical-width: 100px; @lightbox-thumbnav-height: 100px; @lightbox-caption-padding-vertical: 10px; @lightbox-caption-padding-horizontal: 10px; @lightbox-caption-background: rgba(0,0,0,0.3); @lightbox-caption-color: rgba(255,255,255,0.7); /* ======================================================================== Component: Lightbox ========================================================================== */ /* * 1. Hide by default * 2. Set position * 3. Allow scrolling for the modal dialog * 4. Horizontal padding * 5. Mask the background page * 6. Fade-in transition * 7. Prevent cancellation of pointer events while dragging */ .uk-lightbox { --uk-inverse: @lightbox-color-mode; /* 1 */ display: none; /* 2 */ position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: @lightbox-z-index; /* 5 */ background: @lightbox-background; /* 6 */ opacity: 0; transition: opacity 0.15s linear; /* 7 */ touch-action: pinch-zoom; .hook-lightbox(); } /* * Open * 1. Center child * 2. Fade-in */ .uk-lightbox.uk-open { display: block; /* 2 */ opacity: 1; } /* * Focus */ .uk-lightbox :focus-visible { outline-color: @lightbox-focus-outline; } /* Page ========================================================================== */ /* * Prevent scrollbars */ .uk-lightbox-page { overflow: hidden; } /* Items ========================================================================== */ /* * Reset list */ .uk-lightbox-items { margin: 0; padding: 0; list-style: none; } /* * 1. Center child within the viewport * 2. Not visible by default * 3. Optimize animation * 4. Responsiveness * Using `vh` for `max-height` to fix image proportions after resize in Safari and Opera */ .uk-lightbox-items > * { /* 1 */ position: absolute; top: 0; right: 0; bottom: 0; left: 0; /* 2 */ display: none; justify-content: center; align-items: flex-start; /* 3 */ will-change: transform, opacity; /* 4 */ overflow: auto; .hook-lightbox-item(); } /* 2 */ .uk-lightbox-items > .uk-active { display: flex; } .uk-lightbox-items-fit > * { align-items: center; } /* 4 */ .uk-lightbox-items-fit > * > * { max-width: @lightbox-item-max-width; max-height: @lightbox-item-max-height; } .uk-lightbox-items-fit > * > :not(iframe) { width: auto; height: auto; } /* Zoom Cursor */ .uk-lightbox-items.uk-lightbox-items-fit .uk-lightbox-zoom:hover { cursor: zoom-in; } .uk-lightbox-items:not(.uk-lightbox-items-fit) .uk-lightbox-zoom:hover { cursor: zoom-out; } /* Navs ========================================================================== */ .uk-lightbox-thumbnav-vertical :where(img, video) { max-width: @lightbox-thumbnav-vertical-width; } .uk-lightbox-thumbnav:not(.uk-lightbox-thumbnav-vertical) :where(img, video) { max-height: @lightbox-thumbnav-height; } .uk-lightbox-thumbnav:empty, .uk-lightbox-dotnav:empty { display: none; } /* Caption ========================================================================== */ .uk-lightbox-caption:empty { display: none; } .uk-lightbox-caption { padding: @lightbox-caption-padding-vertical @lightbox-caption-padding-horizontal; background: @lightbox-caption-background; color: @lightbox-caption-color; .hook-lightbox-caption(); } .uk-lightbox-caption > * { color: @lightbox-caption-color; } /* Counter ========================================================================== */ .uk-lightbox-counter:empty { display: none; } /* Iframe ========================================================================== */ .uk-lightbox-iframe { width: 80%; height: 80%; } // Hooks // ======================================================================== .hook-lightbox-misc(); .hook-lightbox() {} .hook-lightbox-item() {} .hook-lightbox-caption() {} .hook-lightbox-misc() {}