UNPKG

ultimate_turbo_modal

Version:

The ultimate Turbo / Stimulus / Hotwire modal window for Rails

267 lines (221 loc) 5.12 kB
.hidden { display: none } .dark { .modal-overlay { background-color: rgba(17, 24, 39, 0.8) } .modal-header, .modal-footer { border-color: #4B5563; } .modal-content { background-color: #1F2937; color: #ffffff; } .modal-close-button:hover, .modal-close-icon:hover { background-color: #6B7280; color: #ffffff; } } :not(.dark) { .modal-close-button, .modal-close-icon { color: #9CA3AF; &:hover { color: #111827; background-color: #E5E7EB; } } } .modal-container { position: relative; &[data-header="false"] .modal-header { position: absolute; } &[data-header-divider="true"] .modal-header { border-bottom-width: 1px; } &[data-footer-divider="true"] .modal-footer { border-top-width: 1px; } &[data-padding="true"] .modal-main { padding: 1rem; padding-top: 0.5rem; } &[data-title="false"] .modal-title-h { display: none; } &[data-close-button="false"] .modal-close { display: none; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } } .modal-overlay { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 40; background-color: rgba(17, 24, 39, 0.7); transition-property: opacity; } .modal-outer { overflow-y: auto; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 50; margin: 1rem; @media (min-width: 640px) { margin-left: auto; margin-right: auto; } @media (min-width: 768px) { max-width: 48rem; } } .modal-inner { display: flex; padding: 0.25rem; justify-content: center; align-items: center; min-height: 100%; @media (min-width: 640px) { padding: 1rem; } } .modal-content { overflow: hidden; position: relative; background-color: #ffffff; transition-property: all; text-align: left; border-radius: 0.5rem; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); @media (min-width: 640px) { margin-top: 2rem; margin-bottom: 2rem; max-width: 48rem; } } .modal-header { display: flex; padding-top: 1rem; padding-bottom: 1rem; justify-content: space-between; align-items: center; width: 100%; border-top-left-radius: 0.25rem; border-top-right-radius: 0.25rem; } .modal-title { line-height: 1.75rem; font-weight: 600; padding-left: 1rem; } .modal-footer { display: flex; padding: 1rem; border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; border-top-width: 1px; } .modal-close { margin-right: 1rem; } .modal-close-button { display: inline-flex; padding: 0.375rem; margin-left: auto; background-color: transparent; font-size: 0.875rem; line-height: 1.25rem; align-items: center; border-radius: 0.5rem; } .modal-close-icon { width: 1.25rem; height: 1.25rem; } /* Transition utilities for Vanilla flavor These replicate the Tailwind transitions defined in tailwind.rb using plain CSS classes referenced in vanilla.rb */ /* Overlay: Enter */ .modal-transition-overlay-enter-animation { transition-property: opacity; transition-duration: 300ms; /* duration-300 */ transition-timing-function: ease-out; /* ease-out */ } .modal-transition-overlay-enter-start { opacity: 0; /* opacity-0 */ } .modal-transition-overlay-enter-end { opacity: 1; /* opacity-100 */ } /* Overlay: Leave */ .modal-transition-overlay-leave-animation { transition-property: opacity; transition-duration: 200ms; /* duration-200 */ transition-timing-function: ease-in; /* ease-in */ } .modal-transition-overlay-leave-start { opacity: 1; /* opacity-100 */ } .modal-transition-overlay-leave-end { opacity: 0; /* opacity-0 */ } /* Dialog: Enter */ .modal-transition-dialog-enter-animation { transition-property: opacity, transform; transition-duration: 300ms; /* duration-300 */ transition-timing-function: ease-out; /* ease-out */ } .modal-transition-dialog-enter-start { opacity: 0; /* opacity-0 */ transform: translateY(1rem) scale(1); /* translate-y-4 */ } @media (min-width: 640px) { .modal-transition-dialog-enter-start { transform: translateY(0) scale(0.95); /* sm:translate-y-0 sm:scale-95 */ } } .modal-transition-dialog-enter-end { opacity: 1; /* opacity-100 */ transform: translateY(0) scale(1); /* translate-y-0 scale-100 */ } /* Dialog: Leave */ .modal-transition-dialog-leave-animation { transition-property: opacity, transform; transition-duration: 200ms; /* duration-200 */ transition-timing-function: ease-in; /* ease-in */ } .modal-transition-dialog-leave-start { opacity: 1; /* opacity-100 */ transform: translateY(0) scale(1); /* translate-y-0 scale-100 */ } .modal-transition-dialog-leave-end { opacity: 0; /* opacity-0 */ transform: translateY(1rem) scale(1); /* translate-y-4 */ } @media (min-width: 640px) { .modal-transition-dialog-leave-end { transform: translateY(0) scale(0.95); /* sm:translate-y-0 sm:scale-95 */ } }