@import "../partials/clean/constants" @import "../partials/clean/mixins" @import "../partials/item_header" body.items-show .item-header +item-header #item-contributors +subtle-banner clear: both margin: bottom: 0 top: 2em header display: inline font-weight: bold margin-right: .25em footer display: inline ul display: inline list-style: none li display: inline &::after content: ", " &:last-child::after content: "." .nc-icon height: 16px width: 16px outfit-viewer display: block position: relative width: 300px height: 300px border: 1px solid $module-border-color border-radius: 1em overflow: hidden margin: 0 auto // There's no useful text in here, but double-clicking the play/pause // button can cause a weird selection state. Disable text selection. user-select: none -webkit-user-select: none outfit-layer display: block position: absolute inset: 0 // We disable pointer-events most importantly for the iframes, which // will ignore our `cursor: wait` and show a plain cursor for the // inside of its own document. But also, the context menus for these // elements are kinda actively misleading, too! pointer-events: none img, iframe width: 100% height: 100% .loading-indicator position: absolute z-index: 1000 bottom: 0px right: 4px padding: 8px background: radial-gradient(circle closest-side, white 45%, #ffffff00) opacity: 0 transition: opacity .5s .play-pause-button position: absolute z-index: 1001 left: 8px bottom: 8px display: none align-items: center justify-content: center color: white background: rgba(0, 0, 0, 0.64) width: 2.5em height: 2.5em border-radius: 100% border: 2px solid transparent transition: all .25s .playing-label, .paused-label display: none width: 1em height: 1em .play-pause-toggle // Visually hidden clip: rect(0 0 0 0) clip-path: inset(50%) height: 1px overflow: hidden position: absolute white-space: nowrap width: 1px &:checked ~ .playing-label display: block &:not(:checked) ~ .paused-label display: block &:hover, &:has(.play-pause-toggle:focus) border: 2px solid $module-border-color background: $module-bg-color color: $text-color &:has(.play-pause-toggle:active) transform: translateY(2px) &:has(outfit-layer:state(has-animations)) .play-pause-button display: flex .error-indicator font-size: 85% color: $error-color margin-top: .25em margin-bottom: .5em display: none // When loading, fade in the loading spinner after a brief delay. (We only // apply the delay here, because fading *out* on load should be instant.) // We are loading when the is busy, or when at least one layer // is loading. #item-preview[busy] outfit-viewer, outfit-viewer:has(outfit-layer:state(loading)) cursor: wait .loading-indicator opacity: 1 transition-delay: 2s #item-preview:has(outfit-layer:state(error)) outfit-viewer border: 2px solid red .error-indicator display: block .species-color-picker .error-icon cursor: help margin-right: .25em &[data-is-valid="false"] select border-color: $error-border-color color: $error-color species-face-picker display: block position: relative max-height: 200px // 4 rows of 50px images, and padding will offer a hint of below padding: 10px // leave enough room for the zoomed-in selected face margin-top: -10px overflow: auto species-face-picker-options display: flex justify-content: center flex-wrap: wrap img width: 50px height: 50px transition: all 0.2s // Calm down the default color, just a smidge! There's a lot of color // on this page already, y'know? opacity: .9 filter: saturate(90%) label display: flex overflow: hidden transition: all 0.2s position: relative line-height: 1 // NOTE: The box-shadows here were copy-pasted from Impress 2020, which uses // Chakra UI's styling system to generate them! (The colors are from their // color palette, too.) &:has(input:checked) border-radius: 6px z-index: 1 background: #9AE6B4 box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04), #2F855A 0 0 2px 2px transform: scale(1.1) &:has(input:focus) background: #BEE3F8 box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04), #4299e1 0 0 0 3px transform: scale(1.2) input[type=radio] position: absolute left: -10000px top: auto width: 1px height: 1px overflow: hidden &:checked + img opacity: 1 filter: saturate(110%) &:disabled + img opacity: .6 filter: saturate(0%) label:has(input[type=radio]:disabled) cursor: not-allowed noscript position: absolute inset: 0 background: rgba(white, .75) z-index: 1 cursor: auto display: flex align-items: center justify-content: center text-align: center &:has(species-face-picker-options[inert]) cursor: wait .item-zones-info h3 display: inline font: inherit font-weight: bold &:after content: ": " ul list-style-type: none display: inline li display: inline &:not(:last-of-type):after content: ", " .no-zones font-style: italic opacity: .85 .zone-species-info font-style: italic text-decoration: underline dotted #item-preview display: flex flex-direction: column gap: .75em @media (min-width: 600px) display: grid grid-template-areas: "viewer faces" "picker zones" gap: .5em outfit-viewer grid-area: viewer width: 350px height: 350px .species-color-picker grid-area: picker species-face-picker grid-area: faces max-height: 350px margin: -10px .item-zones-info grid-area: zones