ed8e3f142b
- right/left arrows on section header expand/collapse the sections - space/enter on section header toggle section collapsed/expanded - tab from the header goes through the header's buttons and then tabs into the section if that's opened - arrow up/down on the header jumps to the previous/next header - space/enter on clickable elements simulate a click - if there is a pinned section, tab from the title will focus its header
204 lines
3.5 KiB
SCSS
204 lines
3.5 KiB
SCSS
attachment-preview {
|
|
width: 100%;
|
|
padding: 2px 0px 4px 0px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
transition: height 0.2s ease-in-out, opacity 0.2s ease-in-out;
|
|
// This is set in JS
|
|
// Suppose it's A4 size
|
|
--width-height-ratio: 0.7070707071;
|
|
--min-height: 56px;
|
|
--max-height: 600px;
|
|
// This is set in JS
|
|
--preview-width: 400;
|
|
--preview-height: calc(min(var(--preview-width) / var(--width-height-ratio), var(--max-height)));
|
|
max-height: var(--max-height);
|
|
@include focus-ring;
|
|
|
|
&[hidden] {
|
|
display: none;
|
|
}
|
|
|
|
#preview {
|
|
display: inline-block;
|
|
width: 100%;
|
|
height: 100%;
|
|
// Make sure minimal height before loading
|
|
min-height: var(--preview-height);
|
|
border-radius: 5px;
|
|
border: var(--material-border-quarternary);
|
|
pointer-events: none;
|
|
}
|
|
|
|
#next-preview {
|
|
display: none;
|
|
}
|
|
|
|
.icon {
|
|
// Force the image to load, otherwise the first dragging will not show a drag image
|
|
display: inline-block;
|
|
opacity: 0;
|
|
width: 100%;
|
|
height: 1px;
|
|
max-height: 1px;
|
|
margin-bottom: -1px;
|
|
}
|
|
|
|
$preview-icons: (
|
|
file: "document",
|
|
pdf: "attachment-pdf",
|
|
snapshot: "attachment-snapshot",
|
|
epub: "attachment-epub",
|
|
image: "document",
|
|
);
|
|
|
|
@each $cls, $icon in $preview-icons {
|
|
&[data-preview-type="#{$cls}"] {
|
|
.icon {
|
|
@include focus-states using ($color) {
|
|
@include svgicon($icon, $color, "28", "item-type");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.btn-container {
|
|
display: flex;
|
|
justify-content: center;
|
|
gap: 6px;
|
|
position: relative;
|
|
margin-top: -28px;
|
|
bottom: 6px;
|
|
|
|
toolbarbutton {
|
|
padding: 4px;
|
|
background-color: rgba(0,0,0,0.5);
|
|
|
|
&:hover {
|
|
background-color: rgba(0,0,0,0.4);
|
|
}
|
|
|
|
&:active, &[selected] {
|
|
background-color: rgba(0,0,0,0.3);
|
|
}
|
|
|
|
&:disabled,
|
|
&[disabled="true"] {
|
|
background-color: rgba(0,0,0,0.2);
|
|
}
|
|
}
|
|
}
|
|
|
|
.btn-prev {
|
|
@include svgicon-menu("arrow-left", "universal", "20", false, false, (#fff, #fff));
|
|
}
|
|
|
|
.btn-next {
|
|
@include svgicon-menu("arrow-right", "universal", "20", false, false, (#fff, #fff));
|
|
}
|
|
|
|
.drag-container {
|
|
width: 64px;
|
|
height: 64px;
|
|
position: absolute;
|
|
top: -10000px;
|
|
|
|
.icon {
|
|
opacity: 1;
|
|
height: 56px;
|
|
max-height: 56px;
|
|
margin-bottom: 0px;
|
|
}
|
|
}
|
|
|
|
&[data-preview-type=pdf] {
|
|
#preview {
|
|
border: 0;
|
|
}
|
|
|
|
.btn-container {
|
|
// PDF page has 3px vertical padding so we offset 6px more
|
|
bottom: 12px;
|
|
}
|
|
}
|
|
|
|
&[data-preview-type=snapshot] {
|
|
#preview {
|
|
pointer-events: all;
|
|
}
|
|
|
|
.btn-container {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
$other-preview-types: (
|
|
image,
|
|
video,
|
|
audio,
|
|
);
|
|
|
|
@each $cls in $other-preview-types {
|
|
##{$cls}-preview {
|
|
display: none;
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: contain;
|
|
border-radius: 5px;
|
|
border: var(--material-border-quarternary);
|
|
max-height: var(--preview-height);
|
|
min-height: var(--min-height);
|
|
max-width: calc((var(--preview-height) - 2px) * var(--width-height-ratio));
|
|
}
|
|
|
|
&[data-preview-type="#{$cls}"] {
|
|
#preview {
|
|
display: none;
|
|
}
|
|
|
|
.btn-container {
|
|
display: none;
|
|
}
|
|
|
|
##{$cls}-preview {
|
|
display: inline-block;
|
|
}
|
|
}
|
|
}
|
|
|
|
&:not(:hover) {
|
|
.btn-container {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
&[data-preview-status=fail] {
|
|
#preview {
|
|
display: none;
|
|
}
|
|
|
|
.media-preview {
|
|
display: none !important;
|
|
}
|
|
|
|
.icon {
|
|
display: inline-block;
|
|
opacity: 1;
|
|
height: 56px;
|
|
max-height: 56px;
|
|
margin-bottom: 0px;
|
|
}
|
|
|
|
.btn-container {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
&[data-preview-status=loading] {
|
|
opacity: 0;
|
|
#preview {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
}
|