ng2-multi-modal
Version:
Multi Modal Component for Angular 19+
368 lines (314 loc) • 8.4 kB
CSS
#ng-modal-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
z-index: var(--window-wrapper-zIndex);
pointer-events: none;
}
@keyframes popup {
0% {
transform: scale(0.8);
}
to {
transform: scale(1);
}
}
@keyframes magical-scale {
to {
top: 100vh;
left: 100vw;
width: 0;
height: 0;
opacity: 0;
transform: translateZ(-1000px) skewX(-10deg) scaleX(0.2) scaleY(0.1);
}
}
@keyframes maximize {
0% {
transform: scale(1);
}
to {
width: 100vw;
background: #fff;
height: 100vh;
top: 0;
left: 0;
transform: scale(1);
}
}
:host .no-scroll ::-webkit-scrollbar {
width: 9px;
height: 7px;
pointer-events: none;
}
:host ::-webkit-scrollbar {
width: 9px;
height: 7px;
}
:host ::-webkit-scrollbar-track {
background: 0 0;
}
:host ::-webkit-scrollbar-thumb {
border-radius: 5px;
background: rgba(155, 155, 155, 0.8);
}
:host ::-webkit-scrollbar-thumb:hover {
background: rgba(99, 99, 99);
}
:host ::-webkit-scrollbar-thumb:window-inactive {
background: rgba(155, 155, 155, 0.8);
}
:host ::-webkit-scrollbar-corner {
background: 0 0;
}
.ng-modal-dock {
position: fixed;
right: 160px;
bottom: 5px;
width: auto;
height: 40px;
display: inline-flex;
z-index: var(--window-wrapper-zIndex);
pointer-events: none;
.icon {
width: var(--icon-width);
vertical-align: sub;
margin-right: 4px;
}
.ng-modal-dock-item {
height: 40px;
padding: 0 10px;
max-width: 200px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
background: var(--window-title-bar-bg-color);
color: var(--window-title-bar-color);
border-radius: 4px;
margin-right: 5px;
align-items: center;
justify-content: center;
pointer-events: auto;
cursor: pointer;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
display: flex;
will-change: transform, opacity;
backface-visibility: hidden;
transform: translateZ(0);
}
close-icon {
margin-left: 10px;
}
}
.ng-modal {
position: fixed;
background: var(--window-bg-color);
border-radius: var(--window-border-radius);
box-shadow: var(--window-box-shadow);
backdrop-filter: var(--window-back-drop-filter);
opacity: var(--window-opacity);
pointer-events: auto;
margin: 0;
padding: 0;
overflow: hidden;
&.maximized {
box-shadow: none;
animation: maximize 0.2s cubic-bezier(0.3, 1, 0.3, 1) backwards;
border-radius: 0;
.win-title-bar {
border-radius: 0;
}
}
&.minimized {
#ng-modal-back-drop {
display: none;
}
animation: magical-scale 2s cubic-bezier(0.3, 1, 0.3, 1) forwards;
perspective: 100vh;
transform-style: preserve-3d;
transform-origin: center;
.body {
display: none;
}
}
.win-title-bar {
left: var(--body-drag-area-width);
top: var(--body-drag-area-width);
font-family: var(--window-title-bar-font-family), serif;
color: var(--window-title-bar-color);
border-radius: var(--window-title-bar-radius);
background: var(--window-title-bar-bg-color);
height: var(--window-title-bar-height);
line-height: var(--window-title-bar-height);
width: calc(100% - var(--window-title-bar-offset) * 2);
border-color: var(--window-title-bar-border-color);
border-width: var(--window-title-bar-border-width);
position: absolute;
border-style: solid;
text-align: var(--window-title-bar-text-align);
font-weight: var(--window-title-bar-font-weight);
user-select: none;
cursor: move;
.win-icons {
display: inline-flex;
cursor: default;
position: absolute;
inset: var(--win-icon-inset);
.win-icon {
display: inline-block;
padding: var(--win-icon-padding);
border-radius: 7px;
margin: 4px;
text-align: center;
background-color: var(--win-icon-bg-color);
border: var(--win-icon-border);
cursor: pointer;
svg {
width: var(--win-icon-svg-width);
height: var(--win-icon-svg-width);
display: block;
visibility: var(--win-icon-svg-visibility);
.win-theme {
display: var(--win-theme-icon-svg-display);
}
.apple-theme {
display: var(--apple-theme-icon-svg-display);
}
}
&:hover svg {
visibility: var(--win-icon-svg-hover-visibility);
* {
stroke: #000;
}
}
}
close-icon {
order: var(--close-icon-order);
}
minimize-icon {
order: var(--minimize-icon-order);
}
maximize-icon {
order: var(--maximize-icon-order);
}
maximized-icon {
order: var(--maximize-icon-order);
}
close-icon:hover {
background: var(--close-icon-bg-color-hover);
border: var(--close-icon-border-hover);
}
minimize-icon:hover {
background: var(--minimize-icon-bg-color-hover);
border: var(--minimize-icon-border-hover);
}
maximize-icon:hover {
background: var(--maximize-icon-bg-color-hover);
border: var(--maximize-icon-border-hover);
}
maximized-icon:hover {
background: var(--maximized-icon-bg-color-hover);
border: var(--maximized-icon-border-hover);
}
}
.title-name {
font-size: var(--window-title-bar-font-size);
line-height: var(--window-title-bar-height);
padding: var(--window-title-name-padding);
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: default;
}
&.no-drag {
cursor: default;
}
.icon {
width: var(--icon-width);
vertical-align: sub;
margin-right: 4px;
}
}
.body {
background: var(--window-body-bg-color);
color: var(--window-body-color);
left: var(--window-body-offset-x);
width: calc(100% - var(--window-body-offset-x) * 2);
height: calc(
100% - var(--window-body-offset-y) * 2 - var(--window-title-bar-height) -
var(--window-title-bar-offset)
);
padding: var(--window-body-padding);
border-radius: var(--content-radius);
top: calc(
var(--window-title-bar-height) + var(--window-title-bar-offset) +
var(--window-body-offset-y)
);
position: absolute;
overflow: auto;
}
&:hover {
box-shadow: var(--window-box-shadow-hover) ;
}
&.selected {
box-shadow: var(--selected-window-box-shadow);
.win-title-bar {
background-color: var(--selected-window-title-bar-bg-color);
close-icon {
background: var(--close-icon-bg-color);
border: var(--close-icon-border);
}
minimize-icon {
background: var(--minimize-icon-bg-color);
border: var(--minimize-icon-border);
}
maximize-icon {
background: var(--maximize-icon-bg-color);
border: var(--maximize-icon-border);
}
maximized-icon {
background: var(--maximized-icon-bg-color);
border: var(--maximized-icon-border);
padding: var(--maximized-icon-padding);
}
.title-name {
color: var(--selected-window-title-bar-color);
}
}
}
animation: popup 0.2s cubic-bezier(0.3, 1, 0.3, 1) backwards;
}
.ng-modal-back-drop {
position: fixed;
margin: 0;
padding: 0;
overflow: auto;
filter: blur(20px);
pointer-events: none;
border-radius: var(--window-border-radius);
background: var(--back-drop-bg-color);
}
.window-loading {
position: fixed;
background: #fff;
border-radius: var(--window-border-radius);
padding: 10px;
width: 200px;
height: 100px;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
text-align: center;
}
svg path.color-path {
fill: var(--window-title-bar-color);
}
svg rect.color-rect {
stroke: var(--window-title-bar-color);
}