UNPKG

artistry

Version:

A powerful and configurable stylesheet

236 lines (229 loc) 7.98 kB
@require "popover-settings.styl"; // Added a 1px offset to cover in Firefox $popover-arrow-cover-offset = 1; $popover-diagonal = $popover-spacing * math(2, 'sqrt'); $popover-diagonal-cover = ($popover-spacing + $popover-arrow-cover-offset) * math(2, 'sqrt'); $quarter-pi = 3.141592653589793 / 4; $popover-box-shadow-x-prime = $popover-box-shadow-x * cos($quarter-pi) + $popover-box-shadow-y * sin($quarter-pi); $popover-box-shadow-y-prime = -1 * $popover-box-shadow-x * sin($quarter-pi) + $popover-box-shadow-y * cos($quarter-pi); $popover-arrow-cover = ($popover-diagonal-cover / 2); $popover-arrow-cover-position = ($popover-diagonal-cover / 2) - ($popover-arrow-cover-offset * math(2, 'sqrt')); .popover { --math-sqrt-2: math(2, 'sqrt'); --math-pi: 3.141592653589793; --math-quarter-pi: 3.141592653589793 / 4; --math-cos-quarter-pi: cos(3.141592653589793 / 4); --math-sin-quarter-pi: sin(3.141592653589793 / 4); } // TODO: Prevent mouse-down on trigger when popover is open .popover-trigger { position: relative; display: inline-block; z-index: 2; } .popover { display: block; position: absolute; min-width: 30vw; z-index: 1; opacity: 0; visibility: hidden; text-transform: none; transition: visibility 0s 0.3s, opacity 0.3s; -webkit-backface-visibility: hidden; -webkit-filter: unquote("blur(0)"); cursor: default; &.popover-top { bottom: 100%; padding-bottom: $popover-spacing; left: 50%; transform: translateX(-50%); } &.popover-right { left: 100%; padding-left: $popover-spacing; top: 50%; transform: translateY(-50%); } &.popover-bottom { top: 100%; padding-top: $popover-spacing; left: 50%; transform: translateX(-50%); } &.popover-left { right: 100%; padding-right: $popover-spacing; top: 50%; transform: translateY(-50%); } .popover-top.popover-align-left&, .popover-bottom.popover-align-left& { left: 0; transform: none; } .popover-top.popover-align-right&, .popover-bottom.popover-align-right& { right: 0; left: auto; transform: none; } .popover-right.popover-align-top&, .popover-left.popover-align-top& { top: 0; transform: none; } .popover-right.popover-align-bottom&, .popover-left.popover-align-bottom& { top: auto; bottom: 0; transform: none; } &.popover-fill { &.popover-top, &.popover-bottom { min-width: auto; left: 0; right: 0; transform: none; } } &:before { content: ''; display: block; position: absolute; height: $popover-diagonal; width: $popover-diagonal; border: $popover-border-width solid $popover-border-color; background-color: $popover-border-color; z-index: -1; box-shadow: $popover-box-shadow-x-prime $popover-box-shadow-y-prime $popover-box-shadow-additional; -webkit-backface-visibility: hidden; -webkit-filter: unquote("blur(0)"); .popover-top& { transform: translateY($popover-diagonal / 2) translateX(-50%) rotate(45deg); left: 50%; bottom: $popover-spacing; } .popover-right& { transform: translateX(-1 * $popover-diagonal / 2) translateY(-50%) rotate(45deg); top: 50%; } .popover-bottom& { transform: translateX(-1 * $popover-diagonal / 2) translateY(-50%) rotate(45deg); left: 50%; } .popover-left& { transform: translateX($popover-diagonal / 2) translateY(-50%) rotate(45deg); top: 50%; right: $popover-spacing; } .popover-top.popover-align-left&, .popover-bottom.popover-align-left& { left: $popover-padding + $popover-spacing; } .popover-top.popover-align-right&, .popover-bottom.popover-align-right& { left: auto; right: $popover-padding; } .popover-right.popover-align-top&, .popover-left.popover-align-top& { top: $popover-padding + $popover-spacing + $popover-border-width; } .popover-right.popover-align-bottom&, .popover-left.popover-align-bottom& { top: auto; bottom: $popover-padding - $popover-border-width; } } &:after { content: ''; display: block; position: absolute; border: $popover-arrow-cover solid $popover-background-color; z-index: 1; -webkit-backface-visibility: hidden; -webkit-filter: unquote("blur(0)"); .popover-top& { border-top-color: transparent; border-left-color: transparent; transform: translateY($popover-arrow-cover-position - $popover-border-width) translateX(-50%) rotate(45deg); left: 50%; bottom: $popover-spacing; } .popover-right& { border-top-color: transparent; border-right-color: transparent; transform: translateX($popover-border-width - $popover-arrow-cover-position) translateY(-50%) rotate(45deg); top: 50%; } .popover-bottom& { border-right-color: transparent; border-bottom-color: transparent; transform: translateY($popover-border-width - $popover-arrow-cover-position) translateX(-50%) rotate(45deg); left: 50%; top: $popover-spacing; } .popover-left& { border-left-color: transparent; border-bottom-color: transparent; transform: translateX($popover-arrow-cover-position - $popover-border-width) translateY(-50%) rotate(45deg); top: 50%; right: $popover-spacing; } .popover-top.popover-align-left&, .popover-bottom.popover-align-left& { left: $popover-padding + $popover-spacing; } .popover-top.popover-align-right&, .popover-bottom.popover-align-right& { left: auto; right: $popover-padding - ($popover-arrow-cover-offset * math(2, 'sqrt')); } .popover-right.popover-align-top&, .popover-left.popover-align-top& { top: $popover-padding + $popover-spacing + $popover-border-width; } .popover-right.popover-align-bottom&, .popover-left.popover-align-bottom& { top: auto; bottom: $popover-padding - $popover-border-width - ($popover-arrow-cover-offset * math(2, 'sqrt')); } } & .popover-content { padding: 0; background-color: $popover-background-color; color: $popover-color; border: $popover-border-width solid $popover-border-color; border-radius: $popover-border-radius; box-shadow: $popover-box-shadow-x $popover-box-shadow-y $popover-box-shadow-additional; } *:hover:not(.popover-closed) > &:not(.popover-closed), *.popover-open > &:not(.popover-closed), &.popover-open { opacity: 1; visibility: visible; transition: visibility 0.3s, opacity 0.3s; } &.popover-space { .popover-content { padding: $popover-padding; } } } .popover-mask { display: none; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 10; cursor: default; user-select: none; *.popover-open > &:not(.popover-closed), &.popover-open { display: block; } }