UNPKG

express-file-index

Version:

A simple file index middleware for Express that serves static files and shows a browser for directories.

453 lines (428 loc) 11.3 kB
/* Dark colors */ [data-color-mode='dark'] { --c-bg: hsl(0, 0%, 10%); --c-text-normal: white; --c-text-secondary: hsl(0, 0%, 70%); --c-text-muted: hsl(0, 0%, 60%); --c-border: hsl(0, 0%, 25%); --c-btn-primary-bg: hsl(0, 0%, 100%); --c-btn-primary-bg-hover: hsl(0, 0%, 90%); --c-btn-primary-border-hover: hsl(0, 0%, 100%); --c-btn-primary-text: black; --c-btn-secondary-bg: hsl(0, 0%, 20%); --c-btn-secondary-bg-hover: hsl(0, 0%, 30%); --c-btn-secondary-border-hover: hsl(0, 0%, 40%); --c-btn-secondary-text: white; --c-contextmenu-bg: hsl(0, 0%, 15%); --c-contextmenu-border: hsl(0, 0%, 25%); --c-contextmenu-item-text: hsl(0, 0%, 80%); --c-contextmenu-item-bg-hover: hsl(0, 0%, 25%); --c-contextmenu-item-border-hover: hsl(0, 0%, 35%); --c-table-header-bg: hsl(0, 0%, 18%); --c-code-bg: hsl(0, 0%, 15%); --c-slider-track-bg: hsl(0, 0%, 30%); --c-slider-track-bg-filled: hsl(0, 0%, 80%); --c-slider-thumb-bg: hsl(0, 0%, 100%); --c-slider-thumb-bg-hover: hsl(0, 0%, 90%); --c-slider-thumb-border: hsl(0, 0%, 100%); --c-syntax-comment: #8b949e; --c-syntax-constant: #79c0ff; --c-syntax-entity: #d2a8ff; --c-syntax-storage-modifier-import: #c9d1d9; --c-syntax-entity-tag: #7ee787; --c-syntax-keyword: #ff7b72; --c-syntax-string: #a5d6ff; --c-syntax-variable: #ffa657; } /* Light colors */ [data-color-mode='light'] { --c-bg: hsl(0, 0%, 95%); --c-text-normal: hsl(0, 0%, 0%); --c-text-secondary: hsl(0, 0%, 30%); --c-text-muted: hsl(0, 0%, 50%); --c-border: hsl(0, 0%, 80%); --c-btn-primary-bg: hsl(0, 0%, 0%); --c-btn-primary-bg-hover: hsl(0, 0%, 30%); --c-btn-primary-border-hover: hsl(0, 0%, 0%); --c-btn-primary-text: white; --c-btn-secondary-bg: hsl(0, 0%, 85%); --c-btn-secondary-bg-hover: hsl(0, 0%, 75%); --c-btn-secondary-border-hover: hsl(0, 0%, 65%); --c-btn-secondary-text: black; --c-contextmenu-bg: hsl(0, 0%, 95%); --c-contextmenu-border: hsl(0, 0%, 80%); --c-contextmenu-item-text: hsl(0, 0%, 30%); --c-contextmenu-item-bg-hover: hsl(0, 0%, 90%); --c-contextmenu-item-border-hover: hsl(0, 0%, 80%); --c-table-header-bg: hsl(0, 0%, 90%); --c-code-bg: hsl(0, 0%, 95%); --c-slider-track-bg: hsl(0, 0%, 70%); --c-slider-track-bg-filled: hsl(0, 0%, 20%); --c-slider-thumb-bg: hsl(0, 0%, 30%); --c-slider-thumb-bg-hover: hsl(0, 0%, 40%); --c-slider-thumb-border: hsl(0, 0%, 45%); --c-syntax-comment: #6e7781; --c-syntax-constant: #0550ae; --c-syntax-entity: #8250df; --c-syntax-storage-modifier-import: #24292f; --c-syntax-entity-tag: #116329; --c-syntax-keyword: #cf222e; --c-syntax-string: #0a3069; --c-syntax-variable: #953800; } body { background: var(--c-bg); font-family: 'Inter', sans-serif; font-size: 14px; line-height: 1.2; color: var(--c-text-normal); } body, * { box-sizing: border-box; scrollbar-color: var(--c-border) transparent; -webkit-text-size-adjust: 100%; /* For Safari */ text-size-adjust: 100%; /* For other browsers */ min-width: 0px; } h1, h2, h3, h4, h5, h6 { font-weight: bold; margin: 1em 0px 0.6em 0px; padding-bottom: 0.2em; line-height: 1.2; } h1, h2 { border-bottom: 1px solid var(--c-border); } h1 { font-size: 28px } h2 { font-size: 24px } h3 { font-size: 20px } h4 { font-size: 18px } h5 { font-size: 16px } h6 { font-size: 14px } p, li { font-size: 15px; line-height: 1.5; } p { margin: 0px 0px 0.8em 0px; } li { margin: 0px 0px 0.5em 0px; } ul:not(:last-child), ol:not(:last-child) { margin: 0px 0px 0.8em 0px; } a { text-decoration: underline; color: var(--c-text-secondary); display: inline-block; } a:hover, a:focus-visible { text-decoration: underline; color: var(--c-text-normal); } hr { border: none; border-top: 1px solid var(--c-border); margin: 1em 0px; } pre { padding: 12px; border-radius: 8px; border: 1px solid var(--c-border); background: var(--c-code-bg); overflow-x: auto; } pre code { font-family: 'Roboto Mono', monospace; line-height: 1.4; font-size: 14px; } code:not(pre code) { padding: 1px 4px; border-radius: 4px; border: 1px solid var(--c-border); font-family: 'Roboto Mono', monospace; background: var(--c-code-bg); } .cm-comment, .cm-meta, .cm-hr, code .token.comment, code .token.deleted, code .token.prolog, code .token.doctype, code .token.cdata { color: var(--c-syntax-comment) !important } .cm-header, .cm-def, .cm-variable, .cm-variable-3, .cm-number, .cm-builtin, .cm-atom, .cm-qualifier, .cm-attribute, code .token.class, code .token.builtin, code .token.property, code .token.attr-name, code .token.boolean, code .token.number, code .token.constant { color: var(--c-syntax-constant) !important } .cm-variable-2, .cm-type, code .token.color, code .token.variable { color: var(--c-syntax-variable) !important } .cm-calle, code .token.function, code .token.symbol, code .token.entity { color: var(--c-syntax-entity) !important } .cm-tag, code .token.class-name, code .token.selector, code .token.tag { color: var(--c-syntax-entity-tag) !important } .cm-keyword, .cm-operator, code .token.important, code .token.keyword, code .token.operator, code .token.atrule, code .token.unit { color: var(--c-syntax-keyword) !important } .cm-quote, .cm-string, .cm-string-2, .cm-link, code .token.string, code .token.char, code .token.regex, code .token.url, code .token.attr-value { color: var(--c-syntax-string) !important } .cm-property, .cm-positive, .cm-negative, .cm-bracket, .cm-error, .cm-invalidchar, code .token.punctuation, code .token.inserted, code .token.interpolation-punctuation { color: var(--c-text-normal) !important } code .token.bold { font-weight: bold; } code .token.italic { font-style: italic } code .token.namespace { color: var(--f3) } blockquote { margin: 0px 0px 0.8em 16px; padding: 8px 12px; border-left: 4px solid var(--c-border); border-radius: 4px; } img { max-width: 100%; border-radius: 8px; } table { border-collapse: collapse; } th { background: var(--c-table-header-bg); } th, td { border: 1px solid var(--c-border); padding: 8px 12px; line-height: 1.4; } input[type="range"] { -webkit-appearance: none; width: 100%; height: 5px; /* Reduced track height */ background: transparent; margin: 20px 0; border-radius: 5px; margin: 8px 0px; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; background: var(--c-slider-thumb-bg); cursor: pointer; border-radius: 50%; border: 2px solid var(--c-slider-thumb-border); margin-top: -5.5px; /* Center thumb vertically */ } input[type="range"]::-webkit-slider-thumb:hover { background: var(--c-slider-thumb-bg-hover); } input[type="range"]::-moz-range-thumb { width: 16px; height: 16px; background: var(--c-slider-thumb-bg); cursor: pointer; border-radius: 50%; border: 2px solid var(--c-slider-thumb-border); margin-top: -5.5px; /* Center thumb vertically */ } input[type="range"]::-moz-range-thumb:hover { background: var(--c-slider-thumb-bg-hover); } input[type="range"]::-ms-thumb { width: 16px; height: 16px; background: var(--c-slider-thumb-bg); cursor: pointer; border-radius: 50%; border: 2px solid var(--c-slider-thumb-border); margin-top: -5.5px; /* Center thumb vertically */ } input[type="range"]::-ms-thumb:hover { background: var(--c-slider-thumb-bg-hover); } input[type="range"]::-webkit-slider-runnable-track { width: 100%; height: 5px; cursor: pointer; background: linear-gradient(to right, var(--c-slider-track-bg-filled) 0%, var(--c-slider-track-bg-filled) calc(var(--value) * 1%), var(--c-slider-track-bg) calc(var(--value) * 1%), var(--c-slider-track-bg) 100%); border-radius: 5px; } input[type="range"]::-moz-range-track { width: 100%; height: 5px; cursor: pointer; background: linear-gradient(to right, var(--c-slider-track-bg-filled) 0%, var(--c-slider-track-bg-filled) calc(var(--value) * 1%), var(--c-slider-track-bg) calc(var(--value) * 1%), var(--c-slider-track-bg) 100%); border-radius: 5px; } input[type="range"]::-ms-track { width: 100%; height: 5px; cursor: pointer; background: linear-gradient(to right, var(--c-slider-track-bg-filled) 0%, var(--c-slider-track-bg-filled) calc(var(--value) * 1%), var(--c-slider-track-bg) calc(var(--value) * 1%), var(--c-slider-track-bg) 100%); border-radius: 5px; border-color: transparent; border-width: 6px 0; color: transparent; } .container { margin: 0px auto; padding: 24px 16px; max-width: 1000px; } .btn { height: 36px; padding: 0px 12px; border: 1px solid transparent; border-radius: 8px; font-family: 'Inter'; font-weight: bold; font-size: 12px; color: var(--c-btn-primary-text); background: var(--c-btn-primary-bg); cursor: pointer; flex-shrink: 0; user-select: none; display: flex; gap: 8px; align-items: center; justify-content: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1; text-decoration: none; } .btn:hover, .btn:focus-visible { background: var(--c-btn-primary-bg-hover); border: 1px solid var(--c-btn-primary-border-hover); text-decoration: none; color: var(--c-btn-primary-text); } .btn.secondary { background: var(--c-btn-secondary-bg); color: var(--c-btn-secondary-text); } .btn.secondary:hover, .btn.secondary:focus-visible { background: var(--c-btn-secondary-bg-hover); border: 1px solid var(--c-btn-secondary-border-hover); color: var(--c-btn-secondary-text); } .btn.square { border-radius: 8px; padding: 0px; width: 36px; height: 36px; } .btn .icon { font-size: 22px; font-family: 'Material Symbols Outlined'; font-weight: normal; } .contextMenu { position: fixed; background: var(--c-contextmenu-bg); border: 1px solid var(--c-contextmenu-border); max-height: calc(100% - 8px); margin: 4px; padding: 8px; border-radius: 16px; box-shadow: 0px 8px 24px rgba(0, 0, 0, 0.2); z-index: 100; scrollbar-width: none; user-select: none; } .contextMenu::backdrop { background: transparent; margin: 0px; padding: 0px; } .contextMenu:not(.visible) { opacity: 0; } .contextMenu.visible { opacity: 1; } .contextMenu .item { justify-content: flex-start; text-align: left; height: 32px; background: transparent; border-color: transparent; color: var(--c-contextmenu-item-text); width: 100%; } .contextMenu .item:hover, .contextMenu .item:focus-visible { background: var(--c-contextmenu-item-bg-hover); border-color: var(--c-contextmenu-item-border-hover); } .contextMenu .item .icon { font-size: 20px; } .contextMenu .separator { height: 0px; border-bottom: 1px solid var(--c-contextmenu-border); margin: 8px; flex-shrink: 0; }