Use CSS nesting in the annotationLayer

This commit is contained in:
Jonas Jenwald 2023-10-27 18:42:52 +02:00
parent 6115a328ea
commit b779e418a5
2 changed files with 324 additions and 340 deletions

View File

@ -17,59 +17,55 @@
.annotationLayer { .annotationLayer {
position: absolute; position: absolute;
}
.annotationLayer .wasCanvas { .wasCanvas {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: absolute; position: absolute;
} }
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { .buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
-webkit-appearance: none; -webkit-appearance: none;
} }
.annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a,
:is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) .popupTriggerArea::after,
> a, .fileAttachmentAnnotation:not(.hasFillAlpha) .popupTriggerArea {
.annotationLayer .popupTriggerArea::after, opacity: 0.2;
.annotationLayer background: rgb(255 255 0);
.fileAttachmentAnnotation:not(.hasFillAlpha) box-shadow: 0 2px 10px rgb(255 255 0);
.popupTriggerArea { }
opacity: 0.2; .fileAttachmentAnnotation.hasFillAlpha {
background: rgb(255 255 0); outline: 2px solid yellow;
box-shadow: 0 2px 10px rgb(255 255 0); }
}
.annotationLayer .fileAttachmentAnnotation.hasFillAlpha {
outline: 2px solid yellow;
}
.annotationLayer .hasClipPath::after { .hasClipPath::after {
box-shadow: none; box-shadow: none;
} }
.annotationLayer .linkAnnotation.hasBorder { .linkAnnotation.hasBorder {
background-color: rgb(255 255 0 / 0.2); background-color: rgb(255 255 0 / 0.2);
} }
.annotationLayer .popupTriggerArea::after { .popupTriggerArea::after {
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
content: ""; content: "";
} }
.annotationLayer .popup :is(h1, p) { .popup :is(h1, p) {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.annotationLayer .annotationTextContent { .annotationTextContent {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
opacity: 0.4; opacity: 0.4;
background-color: transparent; background-color: transparent;
color: red; color: red;
font-size: 10px; font-size: 10px;
}
} }

View File

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
:root { .annotationLayer {
--annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>"); --annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>");
--input-focus-border-color: Highlight; --input-focus-border-color: Highlight;
--input-focus-outline: 1px solid Canvas; --input-focus-outline: 1px solid Canvas;
@ -21,355 +21,343 @@
--input-disabled-border-color: transparent; --input-disabled-border-color: transparent;
--input-hover-border-color: black; --input-hover-border-color: black;
--link-outline: none; --link-outline: none;
}
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
:root {
--input-focus-border-color: CanvasText; --input-focus-border-color: CanvasText;
--input-unfocused-border-color: ActiveText; --input-unfocused-border-color: ActiveText;
--input-disabled-border-color: GrayText; --input-disabled-border-color: GrayText;
--input-hover-border-color: Highlight; --input-hover-border-color: Highlight;
--link-outline: 1.5px solid LinkText; --link-outline: 1.5px solid LinkText;
--hcm-highligh-filter: invert(100%); --hcm-highligh-filter: invert(100%);
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):required, .textWidgetAnnotation :is(input, textarea):required,
.annotationLayer .choiceWidgetAnnotation select:required, .choiceWidgetAnnotation select:required,
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required {
.buttonWidgetAnnotation:is(.checkBox, .radioButton) outline: 1.5px solid selectedItem;
input:required { }
outline: 1.5px solid selectedItem;
.linkAnnotation:hover {
backdrop-filter: var(--hcm-highligh-filter);
}
.linkAnnotation > a:hover {
opacity: 0 !important;
background: none !important;
box-shadow: none;
}
.popupAnnotation .popup {
outline: calc(1.5px * var(--scale-factor)) solid CanvasText !important;
background-color: ButtonFace !important;
color: ButtonText !important;
}
.highlightArea:hover::after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
backdrop-filter: var(--hcm-highligh-filter);
content: "";
pointer-events: none;
}
.popupAnnotation.focused .popup {
outline: calc(3px * var(--scale-factor)) solid Highlight !important;
}
} }
.annotationLayer .linkAnnotation:hover {
backdrop-filter: var(--hcm-highligh-filter);
}
.annotationLayer .linkAnnotation > a:hover {
opacity: 0 !important;
background: none !important;
box-shadow: none;
}
.annotationLayer .popupAnnotation .popup {
outline: calc(1.5px * var(--scale-factor)) solid CanvasText !important;
background-color: ButtonFace !important;
color: ButtonText !important;
}
.annotationLayer .highlightArea:hover::after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
backdrop-filter: var(--hcm-highligh-filter);
content: "";
pointer-events: none;
}
.annotationLayer .popupAnnotation.focused .popup {
outline: calc(3px * var(--scale-factor)) solid Highlight !important;
}
}
.annotationLayer {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
pointer-events: none; pointer-events: none;
transform-origin: 0 0; transform-origin: 0 0;
z-index: 3; z-index: 3;
}
.annotationLayer[data-main-rotation="90"] .norotate { &[data-main-rotation="90"] .norotate {
transform: rotate(270deg) translateX(-100%); transform: rotate(270deg) translateX(-100%);
} }
.annotationLayer[data-main-rotation="180"] .norotate { &[data-main-rotation="180"] .norotate {
transform: rotate(180deg) translate(-100%, -100%); transform: rotate(180deg) translate(-100%, -100%);
} }
.annotationLayer[data-main-rotation="270"] .norotate { &[data-main-rotation="270"] .norotate {
transform: rotate(90deg) translateY(-100%); transform: rotate(90deg) translateY(-100%);
} }
.annotationLayer canvas { canvas {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
pointer-events: none; pointer-events: none;
} }
.annotationLayer section { section {
position: absolute; position: absolute;
text-align: initial; text-align: initial;
pointer-events: auto; pointer-events: auto;
box-sizing: border-box; box-sizing: border-box;
transform-origin: 0 0; transform-origin: 0 0;
} }
.annotationLayer .linkAnnotation { .linkAnnotation {
outline: var(--link-outline); outline: var(--link-outline);
} }
.annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a { :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a {
position: absolute; position: absolute;
font-size: 1em; font-size: 1em;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.annotationLayer
:is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder)
> a:hover { > a:hover {
opacity: 0.2; opacity: 0.2;
background-color: rgb(255 255 0); background-color: rgb(255 255 0);
box-shadow: 0 2px 10px rgb(255 255 0); box-shadow: 0 2px 10px rgb(255 255 0);
} }
.annotationLayer .linkAnnotation.hasBorder:hover { .linkAnnotation.hasBorder:hover {
background-color: rgb(255 255 0 / 0.2); background-color: rgb(255 255 0 / 0.2);
} }
.annotationLayer .hasBorder { .hasBorder {
background-size: 100% 100%; background-size: 100% 100%;
} }
.annotationLayer .textAnnotation img { .textAnnotation img {
position: absolute; position: absolute;
cursor: pointer; cursor: pointer;
width: 100%; width: 100%;
height: 100%; height: 100%;
top: 0; top: 0;
left: 0; left: 0;
} }
.annotationLayer .textWidgetAnnotation :is(input, textarea), .textWidgetAnnotation :is(input, textarea),
.annotationLayer .choiceWidgetAnnotation select, .choiceWidgetAnnotation select,
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { .buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
background-image: var(--annotation-unfocused-field-background); background-image: var(--annotation-unfocused-field-background);
border: 2px solid var(--input-unfocused-border-color); border: 2px solid var(--input-unfocused-border-color);
box-sizing: border-box; box-sizing: border-box;
font: calc(9px * var(--scale-factor)) sans-serif; font: calc(9px * var(--scale-factor)) sans-serif;
height: 100%; height: 100%;
margin: 0; margin: 0;
vertical-align: top; vertical-align: top;
width: 100%; width: 100%;
} }
.annotationLayer .textWidgetAnnotation :is(input, textarea):required, .textWidgetAnnotation :is(input, textarea):required,
.annotationLayer .choiceWidgetAnnotation select:required, .choiceWidgetAnnotation select:required,
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required {
.buttonWidgetAnnotation:is(.checkBox, .radioButton) outline: 1.5px solid red;
input:required { }
outline: 1.5px solid red;
}
.annotationLayer .choiceWidgetAnnotation select option { .choiceWidgetAnnotation select option {
padding: 0; padding: 0;
} }
.annotationLayer .buttonWidgetAnnotation.radioButton input { .buttonWidgetAnnotation.radioButton input {
border-radius: 50%; border-radius: 50%;
} }
.annotationLayer .textWidgetAnnotation textarea { .textWidgetAnnotation textarea {
resize: none; resize: none;
} }
.annotationLayer .textWidgetAnnotation :is(input, textarea)[disabled], .textWidgetAnnotation :is(input, textarea)[disabled],
.annotationLayer .choiceWidgetAnnotation select[disabled], .choiceWidgetAnnotation select[disabled],
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input[disabled] {
.buttonWidgetAnnotation:is(.checkBox, .radioButton) background: none;
input[disabled] { border: 2px solid var(--input-disabled-border-color);
background: none; cursor: not-allowed;
border: 2px solid var(--input-disabled-border-color); }
cursor: not-allowed;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, .textWidgetAnnotation :is(input, textarea):hover,
.annotationLayer .choiceWidgetAnnotation select:hover, .choiceWidgetAnnotation select:hover,
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:hover {
.buttonWidgetAnnotation:is(.checkBox, .radioButton) border: 2px solid var(--input-hover-border-color);
input:hover { }
border: 2px solid var(--input-hover-border-color); .textWidgetAnnotation :is(input, textarea):hover,
} .choiceWidgetAnnotation select:hover,
.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, .buttonWidgetAnnotation.checkBox input:hover {
.annotationLayer .choiceWidgetAnnotation select:hover, border-radius: 2px;
.annotationLayer .buttonWidgetAnnotation.checkBox input:hover { }
border-radius: 2px;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):focus, .textWidgetAnnotation :is(input, textarea):focus,
.annotationLayer .choiceWidgetAnnotation select:focus { .choiceWidgetAnnotation select:focus {
background: none; background: none;
border: 2px solid var(--input-focus-border-color); border: 2px solid var(--input-focus-border-color);
border-radius: 2px; border-radius: 2px;
outline: var(--input-focus-outline); outline: var(--input-focus-outline);
} }
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus { .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus {
background-image: none; background-image: none;
background-color: transparent; background-color: transparent;
} }
.annotationLayer .buttonWidgetAnnotation.checkBox :focus { .buttonWidgetAnnotation.checkBox :focus {
border: 2px solid var(--input-focus-border-color); border: 2px solid var(--input-focus-border-color);
border-radius: 2px; border-radius: 2px;
outline: var(--input-focus-outline); outline: var(--input-focus-outline);
} }
.annotationLayer .buttonWidgetAnnotation.radioButton :focus { .buttonWidgetAnnotation.radioButton :focus {
border: 2px solid var(--input-focus-border-color); border: 2px solid var(--input-focus-border-color);
outline: var(--input-focus-outline); outline: var(--input-focus-outline);
} }
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before, .buttonWidgetAnnotation.checkBox input:checked::before,
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after, .buttonWidgetAnnotation.checkBox input:checked::after,
.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before { .buttonWidgetAnnotation.radioButton input:checked::before {
background-color: CanvasText; background-color: CanvasText;
content: ""; content: "";
display: block; display: block;
position: absolute; position: absolute;
} }
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before, .buttonWidgetAnnotation.checkBox input:checked::before,
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after { .buttonWidgetAnnotation.checkBox input:checked::after {
height: 80%; height: 80%;
left: 45%; left: 45%;
width: 1px; width: 1px;
} }
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before { .buttonWidgetAnnotation.checkBox input:checked::before {
transform: rotate(45deg); transform: rotate(45deg);
} }
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after { .buttonWidgetAnnotation.checkBox input:checked::after {
transform: rotate(-45deg); transform: rotate(-45deg);
} }
.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before { .buttonWidgetAnnotation.radioButton input:checked::before {
border-radius: 50%; border-radius: 50%;
height: 50%; height: 50%;
left: 30%; left: 30%;
top: 20%; top: 20%;
width: 50%; width: 50%;
} }
.annotationLayer .textWidgetAnnotation input.comb { .textWidgetAnnotation input.comb {
font-family: monospace; font-family: monospace;
padding-left: 2px; padding-left: 2px;
padding-right: 0; padding-right: 0;
} }
.annotationLayer .textWidgetAnnotation input.comb:focus { .textWidgetAnnotation input.comb:focus {
/* /*
* Letter spacing is placed on the right side of each character. Hence, the * Letter spacing is placed on the right side of each character. Hence, the
* letter spacing of the last character may be placed outside the visible * letter spacing of the last character may be placed outside the visible
* area, causing horizontal scrolling. We avoid this by extending the width * area, causing horizontal scrolling. We avoid this by extending the width
* when the element has focus and revert this when it loses focus. * when the element has focus and revert this when it loses focus.
*/ */
width: 103%; width: 103%;
} }
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { .buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
appearance: none; appearance: none;
} }
.annotationLayer .fileAttachmentAnnotation .popupTriggerArea { .fileAttachmentAnnotation .popupTriggerArea {
height: 100%; height: 100%;
width: 100%; width: 100%;
} }
.annotationLayer .popupAnnotation { .popupAnnotation {
position: absolute; position: absolute;
font-size: calc(9px * var(--scale-factor)); font-size: calc(9px * var(--scale-factor));
pointer-events: none; pointer-events: none;
width: max-content; width: max-content;
max-width: 45%; max-width: 45%;
height: auto; height: auto;
} }
.annotationLayer .popup { .popup {
background-color: rgb(255 255 153); background-color: rgb(255 255 153);
box-shadow: 0 calc(2px * var(--scale-factor)) calc(5px * var(--scale-factor)) box-shadow: 0 calc(2px * var(--scale-factor))
rgb(136 136 136); calc(5px * var(--scale-factor)) rgb(136 136 136);
border-radius: calc(2px * var(--scale-factor)); border-radius: calc(2px * var(--scale-factor));
outline: 1.5px solid rgb(255 255 74); outline: 1.5px solid rgb(255 255 74);
padding: calc(6px * var(--scale-factor)); padding: calc(6px * var(--scale-factor));
cursor: pointer; cursor: pointer;
font: message-box; font: message-box;
white-space: normal; white-space: normal;
word-wrap: break-word; word-wrap: break-word;
pointer-events: auto; pointer-events: auto;
} }
.annotationLayer .popupAnnotation.focused .popup { .popupAnnotation.focused .popup {
outline-width: 3px; outline-width: 3px;
} }
.annotationLayer .popup * { .popup * {
font-size: calc(9px * var(--scale-factor)); font-size: calc(9px * var(--scale-factor));
} }
.annotationLayer .popup > .header { .popup > .header {
display: inline-block; display: inline-block;
} }
.annotationLayer .popup > .header h1 { .popup > .header h1 {
display: inline; display: inline;
} }
.annotationLayer .popup > .header .popupDate { .popup > .header .popupDate {
display: inline-block; display: inline-block;
margin-left: calc(5px * var(--scale-factor)); margin-left: calc(5px * var(--scale-factor));
width: fit-content; width: fit-content;
} }
.annotationLayer .popupContent { .popupContent {
border-top: 1px solid rgb(51 51 51); border-top: 1px solid rgb(51 51 51);
margin-top: calc(2px * var(--scale-factor)); margin-top: calc(2px * var(--scale-factor));
padding-top: calc(2px * var(--scale-factor)); padding-top: calc(2px * var(--scale-factor));
} }
.annotationLayer .richText > * { .richText > * {
white-space: pre-wrap; white-space: pre-wrap;
font-size: calc(9px * var(--scale-factor)); font-size: calc(9px * var(--scale-factor));
} }
.annotationLayer .popupTriggerArea { .popupTriggerArea {
cursor: pointer; cursor: pointer;
} }
.annotationLayer section svg { section svg {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
top: 0; top: 0;
left: 0; left: 0;
} }
.annotationLayer .annotationTextContent { .annotationTextContent {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
opacity: 0; opacity: 0;
color: transparent; color: transparent;
user-select: none; user-select: none;
pointer-events: none; pointer-events: none;
}
.annotationLayer .annotationTextContent span { span {
width: 100%; width: 100%;
display: inline-block; display: inline-block;
} }
}
.annotationLayer svg.quadrilateralsContainer { svg.quadrilateralsContainer {
contain: strict; contain: strict;
width: 0; width: 0;
height: 0; height: 0;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
z-index: -1; z-index: -1;
}
} }