@tindtechnologies/universalviewer
Version:
The Universal Viewer is a community-developed open source project on a mission to help you share your 📚📜📰📽️📻🗿 with the 🌎
331 lines (275 loc) • 6.34 kB
text/less
@import "variables";
@import "mixins";
@import "mixins-extended";
@import "icons";
@import "scaffolding";
@import "buttons";
@import "range";
@import "button-groups";
@import "header-panel";
@import "left-panel";
@import "right-panel";
@import "center-panel";
@import "footer-panel";
@import "overlays";
@import "iiif-gallery-component";
@import "iiif-metadata-component";
@import "iiif-tree-component";
@import "catch-all";
@import "sm";
@import "md";
@import "lg";
@import "xl";
:root {
--uv-grid-left-width-open: 271px;
--uv-grid-right-width-open: 271px;
--uv-grid-left-width: 30px;
--uv-grid-main-width: minmax(0, 1fr);
--uv-grid-right-width: 30px;
}
.hidden {
.hidden();
}
.uv {
// background-color: @body-bg;
position: relative;
// Common styles
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
.border-radius(0);
}
// A button that should not have the browser default characteristics
.imageBtn {
background: 0 0;
border: 0;
cursor: pointer;
}
.action,
a.action.black,
input.action {
display: inline-block;
background-image: data-uri("../img/sprite.png");
background-position-x: 0;
background-position-y: -1000px;
background-repeat: no-repeat;
text-transform: none;
padding: 0 0 0 16px;
font-weight: bold;
}
#debug {
display: none;
position: fixed;
z-index: 1000;
#sm {
display: none;
}
#md {
display: none;
}
#lg {
display: none;
}
#xl {
display: none;
}
}
#commsFrame {
width: 1px;
height: 1px;
border: none;
display: none;
}
.headerPanel {
position: relative;
color: #fff;
height: 40px;
}
.mainPanel {
position: relative;
padding-top: @panel-margin;
margin-right: @panel-margin;
margin-bottom: 0;
margin-left: @panel-margin;
background: @body-bg; // important, otherwise you see two spinners
}
.mainPanel {
margin: 0;
padding: 0;
overflow: hidden;
.md-mediaquery({
padding: 0.5rem;
display: grid;
grid-template-columns:
[left] var(--uv-grid-left-width)
[center] var(--uv-grid-main-width)
[right] var(--uv-grid-right-width);
grid-template-areas: "left center right";
transition-property: grid-template-columns;
transition-timing-function: linear;
transition-duration: calc(var(--uv-animation) * var(--uv-animation-duration));
});
/* hide empty panels */
&:has(.leftPanel:empty) {
--uv-grid-left-width: auto;
}
&:has(.rightPanel:empty) {
--uv-grid-right-width: auto;
}
}
.mainPanel.leftPanelOpen {
--uv-grid-left-width: var(--uv-grid-left-width-open);
}
.mainPanel.rightPanelOpen {
--uv-grid-right-width: var(--uv-grid-right-width-open);
}
.mainPanel.leftPanelOpenFull {
--uv-grid-left-width: 100%;
--uv-grid-main-width: 0;
--uv-grid-right-width: 0;
transition-property: grid-template-columns;
transition-timing-function: linear;
transition-duration: calc(
var(--uv-animation) * var(--uv-animation-duration)
);
}
.centerPanel {
position: absolute;
overflow: hidden;
width: 100%;
.md-mediaquery({
z-index: 15;
grid-area: center;
});
}
.leftPanel,
.rightPanel {
background: @panel-dark-bg;
border: @panel-border;
overflow: hidden;
z-index: 20;
transition-property: all;
transition-timing-function: linear;
transition-duration: calc(
var(--uv-animation) * var(--uv-animation-duration)
);
position: absolute;
inset: calc(5em + 8px) 0 2em;
width: 100%;
height: auto;
.md-mediaquery({
display: block;
position: relative;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: auto;
height: auto;
});
// by default top and main are shown, as on mobile the panel is transformed to off-screen
// but on md they're hidden, just in case
.top,
.main {
display: block;
.md-mediaquery({
display: none;
});
}
// by default closed is hidden unless on md and up
// when it serves as a tab to click
.closed {
display: none;
.md-mediaquery({
display: block;
});
}
// open-finished hides the .closed tab on md+
&.open-finished {
.closed {
display: none;
.md-mediaquery({
display: none;
});
}
}
// only when the container has open & open-finished can top and main display on md+
// this prevents the content getting squished when the panels contract when the grid changes
&.open.open-finished {
.md-mediaquery({
.top,
.main {
display: block;
}
.closed {
display: none;
}
});
}
}
.leftPanel {
right: auto;
left: 0;
transform: translateX(-100%);
.md-mediaquery({
grid-area: left;
transform: none;
});
}
.leftPanel.open {
left: 0;
transform: none;
width: min(95%, 25rem);
.md-mediaquery({
transition-property: none;
left: initial;
right: initial;
width: auto;
});
}
.rightPanel {
right: 0;
left: auto;
transform: translateX(100%);
.md-mediaquery({
grid-area: right;
transform: none;
});
}
.rightPanel.open {
transform: none;
width: min(95%, 30rem);
.md-mediaquery({
transition-property: none;
left: initial;
right: initial;
width: auto;
});
}
.footerPanel {
position: relative;
margin: 0 @panel-margin;
}
}
@media print {
.uv {
.headerPanel {
display: none;
}
.leftPanel {
display: none;
}
.rightPanel {
display: none;
}
.footerPanel {
display: none;
}
.mobileFooterPanel {
display: none;
}
}
}