Mailspring/app/static/style/components/attachment-items.less
Glenn 9305bc8ac1
Composer image resize - Community#729 (#2440)
* Apply resizer

TODO: check how to undo AND see if title/alt attribute implementation is possible (maybe a pop-up with fields for these AND width and height 🤷‍♂️)

* Stop composer ONLY styles

The composer is adding styles to inline images, this means a draft can look completely different to the received mail. Removed the `vertical-align` and reset the `margin` to match the email view

* image ratio retention & small fix

- Added image ratio retention (<kbd>shift</kbd> = freeform)
- Fixed resizing being stopped when reducing the image size reduces the height of the email
- Had to stop the container from reducing (whilst resizing) as reducing the image inside a reducing element was VERY janky 🤮
2022-12-29 10:37:37 -06:00

325 lines
6.5 KiB
Text

@import 'ui-variables';
@import 'ui-mixins';
@file-icon-color: #c7c7c7;
@attachment-border-color: rgba(0, 0, 0, 0.09);
.nylas-attachment-item {
cursor: default;
display: inline-block;
position: relative;
font-size: @font-size-small;
margin: 0 0 @spacing-standard @spacing-standard;
width: calc(~'50% - 23px');
min-width: 320px;
&.file-attachment-item:focus {
.file-info-wrap,
.file-action-icon,
.file-thumbnail-preview {
border-color: lighten(@component-active-color, 10%);
}
.file-action-icon {
border-left-color: @attachment-border-color;
}
}
.file-thumbnail-preview {
width: 100%;
height: 94px;
text-align: left;
overflow: hidden;
border: solid 1px @attachment-border-color;
border-bottom: none;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
}
&.file-attachment-item.has-preview {
&:focus {
.file-info-wrap,
.file-action-icon {
border-top-color: @attachment-border-color;
}
}
.file-info-wrap {
border-top-left-radius: 0;
}
.file-action-icon {
border-top-right-radius: 0;
}
}
.inner {
border-radius: 2px;
color: @text-color;
background: @background-off-primary;
height: 37px;
}
.file-info-wrap {
display: flex;
align-items: center;
flex-grow: 2;
min-width: 65%;
padding: 10px;
height: 105%;
border: solid 1px @attachment-border-color;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
border-right: none;
.file-icon {
margin-right: 10px;
flex-shrink: 0;
}
.file-name {
font-weight: @font-weight-medium;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 235px;
}
.file-size {
@file-size-color: #b8b8b8;
margin-left: auto;
margin-right: @spacing-three-quarters;
color: @file-size-color;
}
}
.file-action-icon {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
flex-grow: 0;
flex-basis: 38px;
margin-left: auto;
padding: 10px;
height: 105%;
width: 38px;
border: solid 1px @attachment-border-color;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
// box-shadow: inset 0 0 0 1px @attachment-border-color;
img {
background-color: @file-icon-color;
}
&.quicklook {
border-radius: 0;
border-right: none;
}
&:hover img {
background-color: darken(@file-icon-color, 20%);
}
&:active {
background-color: darken(@btn-default-bg-color, 5%);
}
}
.progress-bar-wrap {
display: none;
&.state-downloading,
&.state-started,
&.state-progress {
display: block;
}
&.state-completed,
&.state-success {
display: block;
.progress-foreground {
background: @background-color-success;
}
}
&.state-aborted,
&.state-failed {
display: block;
.progress-foreground {
background: @background-color-error;
}
}
.progress-foreground {
position: absolute;
left: 4px;
bottom: 0;
height: 2px;
width: 0; // Changed by React
z-index: 3;
display: block;
background: @blue-light;
border-bottom-left-radius: 4px;
transition: width 0.3s linear;
}
.progress-background {
position: absolute;
left: 4px;
bottom: 0;
height: 2px;
width: 97.5%;
z-index: 2;
display: block;
background: @background-color-pending;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
}
}
body.platform-win32 {
.nylas-attachment-item {
.inner {
border-radius: 0;
}
}
}
.nylas-attachment-item.image-attachment-item {
position: relative;
text-align: center;
display: inline-block;
margin: 0;
width: initial;
max-width: calc(~'100% - 30px');
.progress-foreground,
.progress-foreground {
bottom: -2px;
}
.progress-background {
bottom: -2px;
}
.file-action-icon,
.file-name-container,
.file-name {
display: none;
}
.file-action-icon:active {
background: none;
filter: brightness(95%);
}
&:hover {
border: 1px dashed fade(@text-color, 20%);
.file-action-icon,
.file-name-container,
.file-name {
display: block;
}
}
.file-action-icon {
position: absolute;
z-index: 2;
right: 2px;
top: -14px;
width: 26px;
height: 26px;
border-radius: 0 0 0 3px;
border: none;
img {
background: none;
}
}
.file-preview {
position: relative;
z-index: 1;
overflow: hidden;
.file-name-container {
cursor: default;
position: absolute;
bottom: 0;
z-index: 2;
height: 30px;
max-width: 100%;
border-top-right-radius: 3px;
background: linear-gradient(
to top,
rgba(0, 0, 0, 0.5) 0px,
rgba(0, 0, 0, 0.5) 20px,
rgba(0, 0, 0, 0) 50px
);
vertical-align: bottom;
// Important! file-name-container is on top of the image and prevents you from dragging it.
pointer-events: none;
.file-name {
color: @white;
padding: 5px 10px;
z-index: 3;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
}
img {
position: relative;
z-index: 1;
max-width: 100%;
background: url(../static/images/attachments/transparency-background.png) top left repeat;
background-size: 8px;
}
}
.resizer {
align-items: center;
bottom: 0;
background: #000;
color: #fff;
cursor: nwse-resize;
display: flex;
height: 20px;
justify-content: center;
opacity: .3;
position: absolute;
right: 0;
width: 20px;
z-index: 9;
// Thanks: https://css.gg/arrows-expand-left
.gg-arrows-expand-left {
box-sizing: border-box;
position: relative;
display: block;
transform: scale(0.9);
width: 14px;
height: 14px;
box-shadow:
6px 6px 0 -4px,
-6px -6px 0 -4px
}
.gg-arrows-expand-left::before {
content: "";
display: block;
box-sizing: border-box;
position: absolute;
width: 2px;
height: 22px;
top: -4px;
left: 6px;
transform: rotate(-45deg);
border-top: 9px solid;
border-bottom: 9px solid
}
}
&:hover, &[data-resizing] {
.resizer {
opacity: 1;
}
}
}