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

View File

@ -13,7 +13,7 @@
* 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>");
--input-focus-border-color: Highlight;
--input-focus-outline: 1px solid Canvas;
@ -21,42 +21,38 @@
--input-disabled-border-color: transparent;
--input-hover-border-color: black;
--link-outline: none;
}
@media screen and (forced-colors: active) {
:root {
--input-focus-border-color: CanvasText;
--input-unfocused-border-color: ActiveText;
--input-disabled-border-color: GrayText;
--input-hover-border-color: Highlight;
--link-outline: 1.5px solid LinkText;
--hcm-highligh-filter: invert(100%);
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):required,
.annotationLayer .choiceWidgetAnnotation select:required,
.annotationLayer
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input:required {
.textWidgetAnnotation :is(input, textarea):required,
.choiceWidgetAnnotation select:required,
.buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required {
outline: 1.5px solid selectedItem;
}
.annotationLayer .linkAnnotation:hover {
.linkAnnotation:hover {
backdrop-filter: var(--hcm-highligh-filter);
}
.annotationLayer .linkAnnotation > a:hover {
.linkAnnotation > a:hover {
opacity: 0 !important;
background: none !important;
box-shadow: none;
}
.annotationLayer .popupAnnotation .popup {
.popupAnnotation .popup {
outline: calc(1.5px * var(--scale-factor)) solid CanvasText !important;
background-color: ButtonFace !important;
color: ButtonText !important;
}
.annotationLayer .highlightArea:hover::after {
.highlightArea:hover::after {
position: absolute;
top: 0;
left: 0;
@ -67,38 +63,36 @@
pointer-events: none;
}
.annotationLayer .popupAnnotation.focused .popup {
.popupAnnotation.focused .popup {
outline: calc(3px * var(--scale-factor)) solid Highlight !important;
}
}
.annotationLayer {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
transform-origin: 0 0;
z-index: 3;
}
.annotationLayer[data-main-rotation="90"] .norotate {
&[data-main-rotation="90"] .norotate {
transform: rotate(270deg) translateX(-100%);
}
.annotationLayer[data-main-rotation="180"] .norotate {
&[data-main-rotation="180"] .norotate {
transform: rotate(180deg) translate(-100%, -100%);
}
.annotationLayer[data-main-rotation="270"] .norotate {
&[data-main-rotation="270"] .norotate {
transform: rotate(90deg) translateY(-100%);
}
.annotationLayer canvas {
canvas {
position: absolute;
width: 100%;
height: 100%;
pointer-events: none;
}
.annotationLayer section {
section {
position: absolute;
text-align: initial;
pointer-events: auto;
@ -106,11 +100,11 @@
transform-origin: 0 0;
}
.annotationLayer .linkAnnotation {
.linkAnnotation {
outline: var(--link-outline);
}
.annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a {
:is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a {
position: absolute;
font-size: 1em;
top: 0;
@ -119,7 +113,6 @@
height: 100%;
}
.annotationLayer
:is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder)
> a:hover {
opacity: 0.2;
@ -127,15 +120,15 @@
box-shadow: 0 2px 10px rgb(255 255 0);
}
.annotationLayer .linkAnnotation.hasBorder:hover {
.linkAnnotation.hasBorder:hover {
background-color: rgb(255 255 0 / 0.2);
}
.annotationLayer .hasBorder {
.hasBorder {
background-size: 100% 100%;
}
.annotationLayer .textAnnotation img {
.textAnnotation img {
position: absolute;
cursor: pointer;
width: 100%;
@ -144,9 +137,9 @@
left: 0;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea),
.annotationLayer .choiceWidgetAnnotation select,
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
.textWidgetAnnotation :is(input, textarea),
.choiceWidgetAnnotation select,
.buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
background-image: var(--annotation-unfocused-field-background);
border: 2px solid var(--input-unfocused-border-color);
box-sizing: border-box;
@ -157,98 +150,92 @@
width: 100%;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):required,
.annotationLayer .choiceWidgetAnnotation select:required,
.annotationLayer
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input:required {
.textWidgetAnnotation :is(input, textarea):required,
.choiceWidgetAnnotation select:required,
.buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required {
outline: 1.5px solid red;
}
.annotationLayer .choiceWidgetAnnotation select option {
.choiceWidgetAnnotation select option {
padding: 0;
}
.annotationLayer .buttonWidgetAnnotation.radioButton input {
.buttonWidgetAnnotation.radioButton input {
border-radius: 50%;
}
.annotationLayer .textWidgetAnnotation textarea {
.textWidgetAnnotation textarea {
resize: none;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea)[disabled],
.annotationLayer .choiceWidgetAnnotation select[disabled],
.annotationLayer
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input[disabled] {
.textWidgetAnnotation :is(input, textarea)[disabled],
.choiceWidgetAnnotation select[disabled],
.buttonWidgetAnnotation:is(.checkBox, .radioButton) input[disabled] {
background: none;
border: 2px solid var(--input-disabled-border-color);
cursor: not-allowed;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):hover,
.annotationLayer .choiceWidgetAnnotation select:hover,
.annotationLayer
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input:hover {
.textWidgetAnnotation :is(input, textarea):hover,
.choiceWidgetAnnotation select:hover,
.buttonWidgetAnnotation:is(.checkBox, .radioButton) input:hover {
border: 2px solid var(--input-hover-border-color);
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):hover,
.annotationLayer .choiceWidgetAnnotation select:hover,
.annotationLayer .buttonWidgetAnnotation.checkBox input:hover {
.textWidgetAnnotation :is(input, textarea):hover,
.choiceWidgetAnnotation select:hover,
.buttonWidgetAnnotation.checkBox input:hover {
border-radius: 2px;
}
.annotationLayer .textWidgetAnnotation :is(input, textarea):focus,
.annotationLayer .choiceWidgetAnnotation select:focus {
.textWidgetAnnotation :is(input, textarea):focus,
.choiceWidgetAnnotation select:focus {
background: none;
border: 2px solid var(--input-focus-border-color);
border-radius: 2px;
outline: var(--input-focus-outline);
}
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus {
.buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus {
background-image: none;
background-color: transparent;
}
.annotationLayer .buttonWidgetAnnotation.checkBox :focus {
.buttonWidgetAnnotation.checkBox :focus {
border: 2px solid var(--input-focus-border-color);
border-radius: 2px;
outline: var(--input-focus-outline);
}
.annotationLayer .buttonWidgetAnnotation.radioButton :focus {
.buttonWidgetAnnotation.radioButton :focus {
border: 2px solid var(--input-focus-border-color);
outline: var(--input-focus-outline);
}
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before,
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after,
.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before {
.buttonWidgetAnnotation.checkBox input:checked::before,
.buttonWidgetAnnotation.checkBox input:checked::after,
.buttonWidgetAnnotation.radioButton input:checked::before {
background-color: CanvasText;
content: "";
display: block;
position: absolute;
}
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before,
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after {
.buttonWidgetAnnotation.checkBox input:checked::before,
.buttonWidgetAnnotation.checkBox input:checked::after {
height: 80%;
left: 45%;
width: 1px;
}
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before {
.buttonWidgetAnnotation.checkBox input:checked::before {
transform: rotate(45deg);
}
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after {
.buttonWidgetAnnotation.checkBox input:checked::after {
transform: rotate(-45deg);
}
.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before {
.buttonWidgetAnnotation.radioButton input:checked::before {
border-radius: 50%;
height: 50%;
left: 30%;
@ -256,13 +243,13 @@
width: 50%;
}
.annotationLayer .textWidgetAnnotation input.comb {
.textWidgetAnnotation input.comb {
font-family: monospace;
padding-left: 2px;
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 of the last character may be placed outside the visible
@ -272,16 +259,16 @@
width: 103%;
}
.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
.buttonWidgetAnnotation:is(.checkBox, .radioButton) input {
appearance: none;
}
.annotationLayer .fileAttachmentAnnotation .popupTriggerArea {
.fileAttachmentAnnotation .popupTriggerArea {
height: 100%;
width: 100%;
}
.annotationLayer .popupAnnotation {
.popupAnnotation {
position: absolute;
font-size: calc(9px * var(--scale-factor));
pointer-events: none;
@ -290,10 +277,10 @@
height: auto;
}
.annotationLayer .popup {
.popup {
background-color: rgb(255 255 153);
box-shadow: 0 calc(2px * var(--scale-factor)) calc(5px * var(--scale-factor))
rgb(136 136 136);
box-shadow: 0 calc(2px * var(--scale-factor))
calc(5px * var(--scale-factor)) rgb(136 136 136);
border-radius: calc(2px * var(--scale-factor));
outline: 1.5px solid rgb(255 255 74);
padding: calc(6px * var(--scale-factor));
@ -304,44 +291,44 @@
pointer-events: auto;
}
.annotationLayer .popupAnnotation.focused .popup {
.popupAnnotation.focused .popup {
outline-width: 3px;
}
.annotationLayer .popup * {
.popup * {
font-size: calc(9px * var(--scale-factor));
}
.annotationLayer .popup > .header {
.popup > .header {
display: inline-block;
}
.annotationLayer .popup > .header h1 {
.popup > .header h1 {
display: inline;
}
.annotationLayer .popup > .header .popupDate {
.popup > .header .popupDate {
display: inline-block;
margin-left: calc(5px * var(--scale-factor));
width: fit-content;
}
.annotationLayer .popupContent {
.popupContent {
border-top: 1px solid rgb(51 51 51);
margin-top: calc(2px * var(--scale-factor));
padding-top: calc(2px * var(--scale-factor));
}
.annotationLayer .richText > * {
.richText > * {
white-space: pre-wrap;
font-size: calc(9px * var(--scale-factor));
}
.annotationLayer .popupTriggerArea {
.popupTriggerArea {
cursor: pointer;
}
.annotationLayer section svg {
section svg {
position: absolute;
width: 100%;
height: 100%;
@ -349,7 +336,7 @@
left: 0;
}
.annotationLayer .annotationTextContent {
.annotationTextContent {
position: absolute;
width: 100%;
height: 100%;
@ -357,14 +344,14 @@
color: transparent;
user-select: none;
pointer-events: none;
}
.annotationLayer .annotationTextContent span {
span {
width: 100%;
display: inline-block;
}
}
.annotationLayer svg.quadrilateralsContainer {
svg.quadrilateralsContainer {
contain: strict;
width: 0;
height: 0;
@ -373,3 +360,4 @@
left: 0;
z-index: -1;
}
}