rapidoc
Version:
RapiDoc - Open API spec viewer with built in console
634 lines (599 loc) • 16.9 kB
JavaScript
import { css } from "lit";
export default css`
#advanced-search-btn {
display: none;
margin-left: 5px;
width: 75px;
}
.btn-clear-filter {
margin-left: 5px;
color: var(--foreground);
width: 75px;
}
.nav-bar-header {
position: sticky;
top: 0;
z-index: 10;
display: flex;
flex-direction: column;
box-sizing: border-box;
width: 100%;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
transition:
box-shadow 0.2s ease,
background 0.2s ease;
}
@container scroll-state(scrollable: top) {
.nav-bar-header {
box-shadow:
0 4px 12px -2px rgba(0, 0, 0, 0.25),
0 2px 4px -1px rgba(0, 0, 0, 0.15);
}
}
.nav-bar-search-container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: stretch;
padding: 8px 16px 12px 16px;
box-sizing: border-box;
width: 100%;
}
.nav-bar-search-container.has-bottom-border {
border-bottom: 1px solid var(--muted);
}
.nav-bar-search-input-wrapper {
display: flex;
flex: 1;
position: relative;
line-height: 22px;
}
/* Wrapper in the selector so it outranks input-styles' input[type='text'] padding (room for the icon) */
.nav-bar-search-input-wrapper .nav-bar-search-input {
width: 100%;
line-height: 1.25;
padding: 0.45em 28px 0.45em 10px;
color: var(--foreground);
border: 1px solid var(--input);
border-radius: var(--radius);
background: var(--input-background);
/* Inputs do not inherit the page font; getNavCss() puts this on a page, outside the element's input styles. */
font-family: inherit;
font-size: calc(var(--font-size-small) + 1px);
box-sizing: border-box;
transition:
border-color 0.2s,
box-shadow 0.2s;
}
.nav-bar-search-input:focus {
outline: none;
border-color: var(--sidebar-ring);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--sidebar-ring) 25%, transparent);
}
.nav-bar-search-icon {
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
font-size: var(--font-size-regular);
cursor: pointer;
color: var(--foreground);
opacity: 0.6;
user-select: none;
}
/* The static nav's filter icon is a single-colour SVG (magnifying glass), not a glyph. */
svg.nav-bar-search-icon {
cursor: default;
pointer-events: none;
}
.nav-bar-search-icon:hover {
opacity: 1;
color: var(--foreground);
}
#nav-bar-btn {
position: absolute;
top: 16px;
right: 16px;
font-size: 36px;
line-height: 30px;
width: 50px;
height: 50px;
background: var(--card);
color: var(--foreground);
border: 1px solid var(--border);
border-radius: var(--radius);
cursor: pointer;
z-index: 10;
box-shadow:
0 12px 16px 0 rgba(0, 0, 0, 0.24),
0 17px 50px 0 rgba(0, 0, 0, 0.19);
&:hover {
border-color: var(--primary);
color: var(--primary);
}
}
.nav-bar {
width: 0;
height: 100%;
overflow: hidden;
color: var(--sidebar-foreground);
background: var(--sidebar);
background-blend-mode: multiply;
border-right: 1px solid var(--sidebar-border);
/* Same size as body text (14px by default), like most API references; 20px line height at that size. */
font-size: var(--font-size-regular);
line-height: calc(var(--font-size-regular) + 6px);
position: relative;
flex-direction: column;
flex-wrap: nowrap;
word-break: break-word;
&.floating-nav {
position: absolute;
top: 0;
left: 0;
width: 330px;
overflow: scroll;
z-index: 5;
}
}
.nav-bar-info:focus-visible,
.nav-bar-tag:focus-visible,
.nav-bar-path:focus-visible {
outline: 1px solid;
box-shadow: none;
outline-offset: -4px;
}
.nav-bar-expand-all:focus-visible,
.nav-bar-collapse-all:focus-visible,
.nav-bar-tag-icon:focus-visible {
outline: 1px solid;
box-shadow: none;
outline-offset: 2px;
}
::slotted([slot='nav-logo']) {
max-height: var(--sidebar-logo-max-height);
overflow: hidden;
box-sizing: border-box;
width: auto;
padding: 16px 16px 0 16px;
object-fit: contain;
}
.nav-scroll {
overflow-x: hidden;
overflow-y: auto;
overflow-y: overlay;
scrollbar-width: thin;
scrollbar-color: var(--muted) transparent;
scroll-padding-top: 60px;
container-type: scroll-state;
}
.nav-bar-tag {
display: flex;
align-items: center;
justify-content: space-between;
flex-direction: row;
}
/* Collapsing a tag or tag group slides its body shut: height auto -> 0 (interpolate-size lets the
keyword animate; browsers without it switch at once). The body goes visibility: hidden once
closed, so its links leave the tab order; opening shows it at once. */
.nav-bar-paths-under-tag,
.nav-bar-tags-under-group {
interpolate-size: allow-keywords;
height: auto;
overflow: hidden;
transition:
height 0.25s ease,
visibility 0s;
}
.nav-bar-tag-and-paths.collapsed .nav-bar-paths-under-tag,
.nav-bar-tag-group.collapsed .nav-bar-tags-under-group {
height: 0;
visibility: hidden;
transition:
height 0.25s ease,
visibility 0s linear 0.25s;
}
@media (prefers-reduced-motion: reduce) {
.nav-bar-paths-under-tag,
.nav-bar-tags-under-group {
transition: none;
}
}
.nav-bar-paths-under-tag {
padding-left: 10px;
}
.nav-bar-expand-all {
transform: rotate(90deg);
cursor: pointer;
margin-inline-end: 10px;
}
.nav-bar-collapse-all {
transform: rotate(270deg);
cursor: pointer;
}
.nav-bar-expand-all:hover,
.nav-bar-collapse-all:hover {
color: var(--primary);
}
.nav-bar-tag-icon,
.nav-bar-tag-group-icon {
font-size: 14px;
color: var(--foreground);
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
line-height: 1;
user-select: none;
transition: color 0.15s ease;
}
.nav-bar-tag-icon:hover,
.nav-bar-tag-group-icon:hover {
color: var(--foreground);
}
.nav-bar-tag-icon::after,
.nav-bar-tag-group-icon::after {
content: '';
width: 14px;
height: 14px;
display: inline-block;
background-color: currentColor;
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
-webkit-mask-size: 14px 14px;
mask-size: 14px 14px;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
transition: transform 0.2s ease-out 0s;
transform-origin: center;
}
.nav-bar-tag-and-paths.collapsed .nav-bar-tag-icon::after,
.nav-bar-tag-group.collapsed .nav-bar-tag-group-icon::after {
transform: rotate(-90deg);
}
.nav-bar-tag-and-paths.expanded .nav-bar-tag-icon::after,
.nav-bar-tag-group.expanded .nav-bar-tag-group-icon::after {
transform: rotate(0deg);
}
.nav-scroll::-webkit-scrollbar {
width: 8px;
}
.nav-scroll::-webkit-scrollbar-track {
background: transparent;
}
.nav-scroll::-webkit-scrollbar-thumb {
background: var(--muted);
}
.nav-bar-tag-group {
margin-top: 6px;
margin-bottom: 2px;
}
.nav-bar-tag-group-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 15px 4px 6px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--sidebar-foreground);
cursor: pointer;
user-select: none;
border-inline-start: 4px solid transparent;
transition:
border-color 0.15s ease,
color 0.15s ease;
}
.nav-bar-tag-group-header:hover {
color: var(--sidebar-accent-foreground);
}
.nav-bar-tag-group-title {
flex: 1;
min-width: 0;
}
.nav-bar-tags-under-group {
border-inline-start: 1px solid var(--border);
margin-inline-start: 10px;
}
.nav-bar-tag {
color: var(--primary);
border-inline-start: 4px solid transparent;
font-weight: 600;
padding: 10px 15px 10px 10px;
text-transform: capitalize;
min-width: 0;
}
.nav-bar-tag a,
.nav-bar-tag-title,
a.nav-bar-tag-title {
color: inherit;
text-decoration: none;
flex: 1;
min-width: 0;
}
.nav-bar-tag a:hover,
.nav-bar-tag-title:hover,
a.nav-bar-tag-title:hover {
color: inherit;
text-decoration: none;
}
/* a description-only tag (show-unused-tags) is itself the link */
a.nav-bar-tag {
text-decoration: none;
}
.nav-bar-components,
.nav-bar-h1,
.nav-bar-h2,
.nav-bar-info,
.nav-bar-tag,
.nav-bar-path {
display: flex;
cursor: pointer;
/* Border-box and no underline here too: getNavCss() (@rapidoc/prerender) styles these on a page
without the component's global box-sizing reset and link styles */
box-sizing: border-box;
width: 100%;
border: none;
color: var(--sidebar-foreground);
background: transparent;
border-inline-start: 4px solid transparent;
text-decoration: none;
transition:
background 0.15s ease,
color 0.15s ease;
}
.nav-bar-path,
a.nav-bar-path {
align-items: center;
justify-content: space-between;
gap: 8px;
min-width: 0;
}
a.nav-bar-info:hover,
a.nav-bar-path:hover {
text-decoration: none;
}
.nav-bar-path > * {
pointer-events: none;
}
.nav-bar-path.deprecated {
filter: opacity(0.5);
}
.portal-sidebar-footer-link {
padding: 16px 12px;
}
.nav-bar-path-label {
display: flex;
align-items: baseline;
min-width: 0;
flex: 1;
}
.nav-bar-webhook {
font-weight: bold;
margin-right: 8px;
font-size: var(--font-size-xs);
flex-shrink: 0;
}
/* A path in place of the summary (use-path-in-nav-bar); also in the static navigation, which has no font styles */
.nav-bar-path-label .mono-font {
font-family: var(--font-mono);
}
.nav-method {
font-weight: bold;
margin-inline-start: auto;
flex-shrink: 0;
font-size: var(--font-size-xs);
white-space: nowrap;
&.false {
display: none;
}
}
.nav-method.as-colored-text {
color: var(--method-default);
}
.nav-method.as-colored-text.get {
color: var(--method-get);
}
.nav-method.as-colored-text.put {
color: var(--method-put);
}
.nav-method.as-colored-text.post {
color: var(--method-post);
}
.nav-method.as-colored-text.delete {
color: var(--method-delete);
}
.nav-method.as-colored-text.head {
color: var(--method-head);
}
.nav-method.as-colored-text.patch {
color: var(--method-patch);
}
.nav-method.as-colored-text.options {
color: var(--method-options);
}
.nav-method.as-colored-text.trace {
color: var(--method-trace);
}
.nav-method.as-colored-text.query {
color: var(--method-query);
}
.nav-method.as-colored-text.copy {
color: var(--method-default);
}
.nav-method.as-colored-text.purge {
color: var(--method-default);
}
.nav-method.as-colored-block {
padding: 1px 4px;
min-width: 32px;
text-align: center;
border-radius: 4px;
color: var(--method-badge-fg);
background: var(--method-default);
font-weight: 600;
}
:host([color-scheme='light']) .nav-method.as-colored-block {
color: var(--method-badge-fg);
}
@media (prefers-color-scheme: light) {
:host([color-scheme='system']) .nav-method.as-colored-block {
color: var(--method-badge-fg);
}
}
.colored-block .nav-method.as-colored-block {
outline: 1px solid;
}
.nav-method.as-colored-block.get {
background: var(--method-get);
}
.nav-method.as-colored-block.put {
background: var(--method-put);
}
.nav-method.as-colored-block.post {
background: var(--method-post);
}
.nav-method.as-colored-block.delete {
background: var(--method-delete);
}
.nav-method.as-colored-block.head {
background: var(--method-head);
}
.nav-method.as-colored-block.patch {
background: var(--method-patch);
}
.nav-method.as-colored-block.options {
background: var(--method-options);
}
.nav-method.as-colored-block.trace {
background: var(--method-trace);
}
.nav-method.as-colored-block.query {
background: var(--method-query);
}
.nav-method.as-colored-block.copy {
background: var(--method-default);
}
.nav-method.as-colored-block.purge {
background: var(--method-default);
}
.nav-bar-h1,
.nav-bar-h2,
.nav-bar-path {
font-weight: 400;
padding: var(--sidebar-item-padding);
}
.nav-bar-info {
padding: 12px 10px;
font-weight: 600;
}
.nav-bar-section {
display: flex;
flex-direction: row;
justify-content: space-between;
color: var(--foreground);
padding: var(--sidebar-item-padding);
font-weight: 700;
}
.nav-bar-section.operations {
display: none ;
}
.nav-bar-section:first-child {
display: none;
}
.nav-bar-h2 {
padding-inline-start: 28px;
}
/* Active item indicator - always left-bar style */
.nav-bar-h1.active,
.nav-bar-h2.active,
.nav-bar-info.active,
.nav-bar-tag.active,
.nav-bar-path.active,
.nav-bar-section.operations.active,
.nav-bar-h1.left-bar.active,
.nav-bar-h2.left-bar.active,
.nav-bar-info.left-bar.active,
.nav-bar-tag.left-bar.active,
.nav-bar-path.left-bar.active,
.nav-bar-section.left-bar.operations.active {
border-inline-start: 4px solid var(--sidebar-primary);
color: var(--sidebar-primary);
}
.nav-bar-h1.active:hover,
.nav-bar-h2.active:hover,
.nav-bar-info.active:hover,
.nav-bar-tag.active:hover,
.nav-bar-path.active:hover,
.nav-bar-section.operations.active:hover,
.nav-bar-h1.left-bar.active:hover,
.nav-bar-h2.left-bar.active:hover,
.nav-bar-info.left-bar.active:hover,
.nav-bar-tag.left-bar.active:hover,
.nav-bar-path.left-bar.active:hover,
.nav-bar-section.left-bar.operations.active:hover {
color: var(--sidebar-primary);
}
/* Highlight collapsed parents using modern CSS :has() */
.nav-bar-tag-and-paths.collapsed:has(.nav-bar-path.active) > .nav-bar-tag {
border-inline-start-color: var(--sidebar-primary);
color: var(--sidebar-primary);
}
.nav-bar-tag-group.collapsed:has(.active) > .nav-bar-tag-group-header {
border-inline-start-color: var(--sidebar-primary);
color: var(--sidebar-primary);
}
.nav-bar-tag-and-paths.collapsed:has(.nav-bar-path.active) > .nav-bar-tag:hover,
.nav-bar-tag-group.collapsed:has(.active) > .nav-bar-tag-group-header:hover {
color: var(--sidebar-primary);
}
.nav-bar-h1:hover,
.nav-bar-h2:hover,
.nav-bar-info:hover,
.nav-bar-tag:hover,
.nav-bar-path:hover {
color: var(--sidebar-accent-foreground);
background: var(--sidebar-accent);
}
/* nav-item-overflow: ellipsis (default) vs wrap */
:host([nav-item-overflow='ellipsis']) .nav-bar-tag-group-title,
:host(:not([nav-item-overflow])) .nav-bar-tag-group-title,
.overflow-ellipsis .nav-bar-tag-group-title,
:host([nav-item-overflow='ellipsis']) .nav-bar-tag-title,
:host(:not([nav-item-overflow])) .nav-bar-tag-title,
.overflow-ellipsis .nav-bar-tag-title,
:host([nav-item-overflow='ellipsis']) .nav-bar-path-label,
:host(:not([nav-item-overflow])) .nav-bar-path-label,
.overflow-ellipsis .nav-bar-path-label,
:host([nav-item-overflow='ellipsis']) .nav-bar-info,
:host(:not([nav-item-overflow])) .nav-bar-info,
.overflow-ellipsis .nav-bar-info,
:host([nav-item-overflow='ellipsis']) .nav-bar-section-title,
:host(:not([nav-item-overflow])) .nav-bar-section-title,
.overflow-ellipsis .nav-bar-section-title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
}
:host([nav-item-overflow='wrap']) .nav-bar-tag-group-title,
.overflow-wrap .nav-bar-tag-group-title,
:host([nav-item-overflow='wrap']) .nav-bar-tag-title,
.overflow-wrap .nav-bar-tag-title,
:host([nav-item-overflow='wrap']) .nav-bar-path-label,
.overflow-wrap .nav-bar-path-label,
:host([nav-item-overflow='wrap']) .nav-bar-info,
.overflow-wrap .nav-bar-info,
:host([nav-item-overflow='wrap']) .nav-bar-section-title,
.overflow-wrap .nav-bar-section-title {
white-space: normal;
overflow: visible;
text-overflow: clip;
word-break: break-word;
}
`;