UNPKG

express-file-index

Version:

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

288 lines (264 loc) 5.59 kB
[data-color-mode='dark'] { --c-readme-bg: hsl(0, 0%, 12%); --c-bg-entry-hover: hsl(0, 0%, 15%); } [data-color-mode='light'] { --c-readme-bg: hsl(0, 0%, 97%); --c-bg-entry-hover: hsl(0, 0%, 92%); } body { --c-icon-folder: hsl(40, 40%, 60%); --c-icon-text: hsl(180, 40%, 60%); --c-icon-image: hsl(220, 40%, 60%); --c-icon-video: hsl(0, 40%, 60%); --c-icon-audio: hsl(300, 40%, 60%); --c-icon-file: var(--c-text-secondary); } .header { margin-bottom: 24px; } .ancestors { color: var(--c-text-muted); margin-left: -4px; } .ancestors .link { text-decoration: none; color: var(--c-text-muted); font-size: 15px; border: 1px solid transparent; padding: 3px 4px 2px 4px; border-radius: 4px; line-height: 1.4; } .ancestors .link:hover, .ancestors .link:focus-visible { background: var(--c-bg-entry-hover); border: 1px solid var(--c-border); color: var(--c-text-normal); text-decoration: none; } .ancestors .sep { color: var(--c-text-normal); padding: 0px 2px; } .header .actions { display: flex; gap: 12px; margin-top: 12px; flex-wrap: wrap; } .title { font-size: 26px; font-weight: bold; } .colHeaders, .files .entry { display: flex; align-items: center; padding: 0px 8px; gap: 8px; font-size: 14px; } .colHeaders { color: var(--c-text-muted); padding-bottom: 8px; border-bottom: 1px solid var(--c-border); margin-bottom: 4px; font-size: 12px; } .colHeaders > * { display: flex; gap: 4px; align-items: center; } .colHeaders .icon { font-size: 18px; font-family: 'Material Symbols Outlined'; margin: -8px 0px; user-select: none; } .files .entry { color: var(--c-text-normal); text-decoration: none; height: 36px; border-radius: 8px; border: 1px solid transparent; user-select: none; } .files .entry:hover, .files .entry:focus-visible { background: var(--c-bg-entry-hover); border: 1px solid var(--c-border); color: var(--c-text-normal); text-decoration: none; } .colHeaders *, .files .entry * { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .colHeaders > .icon, .files .entry > .icon { width: 36px; flex-shrink: 0; text-align: center; font-family: 'Material Symbols Outlined'; font-size: 24px; color: var(--c-icon-file); } .colHeaders .name, .files .entry .name { flex-grow: 1; } .files .entry .name { display: flex; flex-direction: column; gap: 2px; } .files .entry .nameLore { display: none; font-size: 12px; color: var(--c-text-secondary); gap: 4px; } .colHeaders .modified, .files .entry .modified { width: 150px; flex-shrink: 0; } .colHeaders .size, .files .entry .size { width: 100px; flex-shrink: 0; } .files .entry .icon.folder, .contextMenu .file .icon.folder { color: var(--c-icon-folder); } .files .entry .icon.text, .contextMenu .file .icon.text { color: var(--c-icon-text); } .files .entry .icon.image, .contextMenu .file .icon.image { color: var(--c-icon-image); } .files .entry .icon.video, .contextMenu .file .icon.video { color: var(--c-icon-video); } .files .entry .icon.audio, .contextMenu .file .icon.audio { color: var(--c-icon-audio); } .files .entry .icon.file, .contextMenu .file .icon.file { color: var(--c-icon-file); } .files .entry .modified, .files .entry .size { color: var(--c-text-secondary); } .contextMenu > .file { display: flex; align-items: center; gap: 12px; max-width: 300px; padding: 8px; } .contextMenu > .file .icon { width: 32px; text-align: center; font-size: 32px; flex-shrink: 0; font-family: 'Material Symbols Outlined'; color: var(--c-icon-file); } .contextMenu > .file .details { display: flex; flex-direction: column; gap: 2px; flex-grow: 1; min-width: 0px; } .contextMenu > .file .name { font-size: 14px; color: var(--c-text-normal); } .contextMenu > .file .modified, .contextMenu > .file .size { font-size: 12px; color: var(--c-text-secondary); } #showMoreCont { position: relative; height: 100px; margin-top: -100px; padding-bottom: 8px; display: flex; justify-content: center; align-items: flex-end; background: linear-gradient( to bottom, transparent 0%, var(--c-bg) 100% ); z-index: 2; pointer-events: none; } #showMore { pointer-events: all; } #readme { margin: 16px -8px 0px -8px; border-radius: 16px; background: var(--c-readme-bg); border: 1px solid var(--c-border); overflow: hidden; } #readme .top { display: flex; padding: 8px 16px; align-items: center; border: 1px solid var(--c-border); gap: 12px; border-radius: 0px 0px 16px 16px; margin: -1px; } #readme .top .icon { font-size: 24px; font-family: 'Material Symbols Outlined'; color: var(--c-text-muted); flex-shrink: 0; user-select: none; } #readme .body { padding: 16px; } #readme .body > *:first-child { margin-top: 0px; } #readme .body > *:last-child { margin-bottom: 0px; } .footer { font-size: 12px; color: var(--c-text-muted); text-align: center; margin-top: 24px; } @media (max-width: 600px) { .container { padding: 24px 8px; } .colHeaders, .files .entry .modified, .files .entry .size { display: none; } .files .entry { height: 48px; } .files .entry .nameLore { display: flex; } }