* { box-sizing: border-box; scrollbar-width: thin; scrollbar-color: var(--border-secondary) transparent; } :root { color-scheme: light; --bg-primary: #fff; --bg-secondary: #fafafa; --bg-tertiary: #fff; --bg-hover: #f5f5f5; --text-primary: #0a0a0a; --text-secondary: #606060; --text-tertiary: #8a8a8a; --text-accent: #111; --svg-primary: #0a0a0a; --svg-secondary: #666; --svg-tertiary: #666; --border-primary: rgba(0, 0, 0, 0.09); --border-secondary: #e5e5e5; --accent: #5e6ad2; --shadow-pop: 0 8px 24px rgba(0, 0, 0, 0.08); --ease-out: cubic-bezier(0.23, 1, 0.32, 1); --duration-fast: 120ms; } html { font-family: -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif; line-height: 1.5; color: var(--text-primary); } body { margin: 0; background-color: var(--bg-primary); } svg { fill: none; stroke: var(--svg-primary); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; transition: stroke var(--duration-fast) ease; } .hidden { display: none !important; } .head { z-index: 1; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; padding: 0.6em 1em; position: sticky; top: 0; background-color: var(--bg-tertiary); border-bottom: 1px solid var(--border-primary); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); } @supports ((backdrop-filter: blur(0px)) or (-webkit-backdrop-filter: blur(0px))) { .head { background-color: color-mix(in srgb, var(--bg-tertiary) 85%, transparent); -webkit-backdrop-filter: blur(12px) saturate(180%); backdrop-filter: blur(12px) saturate(180%); } } .breadcrumb { font-size: 1.25em; padding-right: 0.6em; word-break: break-all; font-weight: 600; letter-spacing: -0.01em; } .breadcrumb>a { color: var(--text-accent); text-decoration: none; text-decoration-color: transparent; text-underline-offset: 3px; } .breadcrumb>a:hover { text-decoration: underline; text-decoration-color: currentColor; } /* final breadcrumb */ .breadcrumb>b { color: var(--text-primary); } .breadcrumb>.separator { color: var(--text-tertiary); padding: 0 0.25em; } .breadcrumb svg { height: 100%; stroke: var(--svg-secondary); } .toolbox { display: flex; margin-right: 10px; } .toolbox>a, .toolbox>div { /* vertically align with breadcrumb text */ height: 1.1rem; } .toolbox .control { cursor: pointer; padding-left: 0.25em; } .upload-file input { display: none; } .upload-file label { cursor: pointer; } .searchbar { display: flex; align-items: center; justify-content: center; flex-wrap: nowrap; background-color: var(--bg-secondary); transition: border-color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out); border: 1px var(--border-primary) solid; border-radius: 15px; margin-bottom: 2px; padding-left: 0.5rem; } .searchbar:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(94, 106, 210, 0.18); } .searchbar #search { box-sizing: border-box; width: 100%; height: 100%; font-size: 16px; line-height: 16px; padding: 1px; padding-left: 0.5rem; color: var(--text-primary); background-color: transparent; border: none; outline: none; } .searchbar .icon { color: var(--svg-tertiary); padding: 6px 3px 3px 0; cursor: pointer; } .searchbar svg { stroke: var(--svg-tertiary); } .main { padding: 0; } .empty-folder { color: var(--text-tertiary); text-align: center; padding: 3rem 1rem; animation: fade-in 200ms ease-out; } .readme { margin: 2em 1em; padding: 1em 1.5em; background-color: var(--bg-tertiary); border: 1px solid var(--border-primary); border-radius: 10px; box-shadow: var(--shadow-pop); font-size: 0.95em; line-height: 1.6; overflow-wrap: break-word; animation: fade-in 200ms ease-out; max-width: 80ch; } .readme> :first-child { margin-top: 0; } .readme> :last-child { margin-bottom: 0; } .readme h1, .readme h2, .readme h3, .readme h4, .readme h5, .readme h6 { margin: 1.2em 0 0.5em; line-height: 1.3; font-weight: 600; color: var(--text-primary); } .readme h1 { font-size: 1.5em; } .readme h2 { font-size: 1.25em; } .readme h3 { font-size: 1.1em; } .readme h4, .readme h5, .readme h6 { font-size: 1em; } .readme a { color: var(--text-accent); text-decoration: none; text-underline-offset: 2px; } .readme a:hover { text-decoration: underline; } .readme ul, .readme ol { padding-left: 1.6em; margin: 0.5em 0; } .readme li { margin: 0.25em 0; } .readme li> :first-child { margin-top: 0; } .readme code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.9em; background-color: var(--bg-hover); border-radius: 4px; padding: 0.15em 0.35em; } .readme pre { background-color: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 8px; padding: 0.8em 1em; overflow-x: auto; margin: 0.8em 0; } .readme pre code { background-color: transparent; padding: 0; } .readme blockquote { margin: 0.8em 0; padding: 0.1em 1em; border-left: 3px solid var(--border-primary); color: var(--text-secondary); } .readme table { border-collapse: collapse; margin: 0.8em 0; display: block; overflow-x: auto; } .readme th, .readme td { border: 1px solid var(--border-primary); padding: 0.4em 0.8em; text-align: left; } .readme img { max-width: 100%; } .readme hr { border: none; border-top: 1px solid var(--border-primary); margin: 1.2em 0; } .uploaders-table th { text-align: left; font-weight: unset; color: var(--text-secondary); white-space: nowrap; } .uploaders-table td { white-space: nowrap; } .uploaders-table .cell-status { width: 80px; padding-left: 0.6em; } .cell-status span { display: inline-block; } @media (min-width: 768px) { .paths-table { display: grid; grid-template-columns: 24px minmax(0, 1fr) 120px 70px 130px; column-gap: 1.5em; align-items: center; } .paths-header, .paths-body { display: contents; } .paths-header-row, .path-item { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; } } .path-item { padding: 0.4em; border-radius: 6px; transition: background-color var(--duration-fast) ease; } @media (hover: hover) and (pointer: fine) { .path-item:hover { background-color: var(--bg-hover); } .path-item .cell-actions { opacity: 0.4; transition: opacity var(--duration-fast) ease; } .path-item:hover .cell-actions { opacity: 1; } } .paths-header-row { padding: 0.4em 1em; color: var(--text-secondary); font-weight: unset; border-bottom: 1px solid var(--border-primary); font-size: 0.9em; letter-spacing: 0.02em; } .paths-header-row .h-sort { color: unset; text-decoration: none; white-space: nowrap; transition: color var(--duration-fast) ease; } .paths-header-row .h-sort:hover { color: var(--text-primary); } .paths-header-row .h-sort.active { color: var(--accent); } .paths-header-row .h-sort>span { padding-left: 2px; } .path-item .cell-size { text-align: right; } .path-item .cell-mtime, .path-item .cell-size { font-variant-numeric: tabular-nums; white-space: nowrap; } .path-item .cell-actions { display: flex; align-items: center; justify-content: flex-start; } .path-item .cell-more { display: none; position: relative; } .path svg, .path-item .cell-icon svg { height: 16px; stroke: var(--svg-secondary); vertical-align: text-top; } .path { list-style: none; } .path-item .cell-name a { color: var(--text-accent); text-overflow: ellipsis; white-space: nowrap; overflow: hidden; display: block; text-decoration: none; text-decoration-color: transparent; text-underline-offset: 2px; font-weight: 500; } .path-item .cell-name a:hover { text-decoration: underline; text-decoration-color: currentColor; } .path-item .cell-name a, .menu-btn, .more-btn { -webkit-tap-highlight-color: transparent; } .menu-btn, .more-btn { border-radius: 6px; transition: background-color var(--duration-fast) ease; } .menu-btn:hover, .menu-btn:active, .more-btn:hover, .more-btn:active { background-color: var(--bg-hover); } .path-item:has(.cell-name a:hover), .path-item:has(.cell-name a:active) { background-color: var(--bg-hover); } .action-btn { padding-right: 0.3em; cursor: pointer; transition: transform 100ms ease-out, opacity var(--duration-fast) ease; } .action-btn:active { transform: scale(0.9); } @media (hover: hover) and (pointer: fine) { .action-btn:hover svg { stroke: var(--accent); } } .uploaders-table { padding: 0.5em 0; } .uploader { padding-right: 1em; } .editor { width: 100%; height: calc(100vh - 5rem); border: 1px solid var(--border-secondary); background: var(--bg-primary); color: var(--text-primary); outline: none; padding: 5px; transition: border-color var(--duration-fast) ease, box-shadow var(--duration-fast) ease; } .editor:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(94, 106, 210, 0.18); } a:focus-visible, .control:focus-visible, .login-btn:focus-visible, .logout-btn:focus-visible, .save-btn:focus-visible, .action-btn:focus-visible, .menu-btn:focus-visible, .more-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .toolbox-right { margin-left: auto; margin-right: 2em; } .login-btn { cursor: pointer; } .save-btn { cursor: pointer; -webkit-user-select: none; user-select: none; } .logout-btn { cursor: pointer; display: flex; align-items: center; } .user-name { padding-left: 0.5em; font-size: 0.9rem; color: var(--text-secondary); } .not-editable { font-style: italic; } .retry-btn { cursor: pointer; } @media (min-width: 768px) { .cell-icon { margin-right: -1.75em; } .menu, .menu-content { display: contents; } .menu-toggle, .menu-btn { display: none; } .toolbox { margin-left: auto; gap: 1em; } .toolbox .control { padding-left: 0; } .searchbar { margin-right: 10px; } .toolbox-right { margin-left: 0; margin-right: 0; } .toolbox .control, .toolbox-right>div, .toolbox>a { transition: transform 100ms ease-out, background-color var(--duration-fast) ease; border-radius: 6px; } .toolbox .control:hover, .toolbox-right>div:hover, .toolbox>a:hover { background-color: var(--bg-hover); } .toolbox .control:hover svg, .toolbox-right>div:hover svg, .toolbox>a:hover svg { stroke: var(--accent); } .toolbox .control:active, .toolbox-right>div:active, .toolbox>a:active { transform: scale(0.9); } } @media (max-width: 767.98px) { .menu { position: relative; margin-left: auto; } .menu-toggle { display: none; } .menu-btn { display: flex; align-items: center; justify-content: center; cursor: pointer; padding: 0.2em; user-select: none; } .menu-content { position: absolute; right: 0; top: calc(100% + 6px); z-index: 100; display: flex; flex-direction: column; min-width: 250px; padding: 0.4em; background-color: var(--bg-tertiary); border: 1px solid var(--border-primary); border-radius: 10px; box-shadow: var(--shadow-pop); opacity: 0; visibility: hidden; transform: translateY(-4px) scale(0.96); transform-origin: top right; pointer-events: none; transition: opacity 150ms var(--ease-out), transform 150ms var(--ease-out), visibility 0s linear 150ms; } .menu-toggle:checked ~ .menu-content { opacity: 1; visibility: visible; transform: translateY(0) scale(1); pointer-events: auto; transition-delay: 0s; } .menu-content .searchbar { order: -1; box-sizing: border-box; margin: 0 0 0.4em; padding: 0.3em 0.8em; background-color: var(--bg-secondary); border-radius: 8px; display: flex; height: fit-content; align-items: center; justify-content: center; } .menu-content .toolbox, .menu-content .toolbox-right { display: flex; flex-wrap: wrap; gap: 0.4em; margin: 0; padding: 0.5em 0.3em 0.3em; } .menu-content .toolbox .control, .menu-content .toolbox-right > .login-btn, .menu-content .toolbox-right > .logout-btn, .menu-content .toolbox-right > .save-btn { display: flex; align-items: center; height: auto; padding: 0.4em 0.5em; border-radius: 8px; cursor: pointer; } .menu-content .toolbox .control:hover, .menu-content .toolbox-right > .login-btn:hover, .menu-content .toolbox-right > .logout-btn:hover, .menu-content .toolbox-right > .save-btn:hover { background-color: var(--bg-hover); } .menu-content .upload-file, .menu-content .upload-file label { cursor: pointer; } .menu-content .upload-file.hidden label { pointer-events: none; } .menu-content .toolbox .control.hidden { display: flex !important; opacity: 0.35; cursor: default; pointer-events: none; } .menu-content .toolbox .control.hidden:hover { background-color: transparent; } .menu-content .toolbox-right > .login-btn:not(.hidden)::after { content: "Log In"; font-size: 0.95em; margin-left: 0.4em; } .paths-header-row { display: none; } .path-item { display: flex; align-items: center; gap: 0.5em; } .path-item .cell-icon { flex: 0 0 24px; } .path-item .cell-name { flex: 1; min-width: 0; } .path-item .cell-mtime, .path-item .cell-size, .path-item .cell-actions { display: none; } .path-item .cell-more { flex: 0 0 28px; display: block; } .more-toggle { display: none; } .more-btn { display: block; cursor: pointer; font-size: 1.4em; line-height: 1; text-align: center; user-select: none; } .more-panel { position: absolute; right: 0; top: 100%; z-index: 100; display: flex; flex-direction: column; gap: 0.5em; padding: 0.6em; background-color: var(--bg-tertiary); border: 1px solid var(--border-primary); border-radius: 8px; box-shadow: var(--shadow-pop); min-width: 180px; white-space: nowrap; opacity: 0; visibility: hidden; transform: translateY(-4px) scale(0.96); transform-origin: top right; pointer-events: none; transition: opacity 150ms var(--ease-out), transform 150ms var(--ease-out), visibility 0s linear 150ms; } .more-toggle:checked ~ .more-panel { opacity: 1; visibility: visible; transform: translateY(0) scale(1); pointer-events: auto; transition-delay: 0s; } .more-row { display: flex; gap: 0.5em; align-items: center; justify-content: space-between; } .more-label { color: var(--text-secondary); } .more-content { color: var(--text-primary); } .more-actions { display: flex; gap: 0.4em; align-items: center; justify-content: flex-start; padding-top: 0.3em; border-top: 1px solid var(--border-primary); } } /* dark theme */ @media (prefers-color-scheme: dark) { :root { color-scheme: dark; --bg-primary: #0a0a0a; --bg-secondary: #111; --bg-tertiary: #0f0f10; --bg-hover: #161617; --text-primary: #ededed; --text-secondary: #9a9a9a; --text-tertiary: #71717a; --text-accent: #ededed; --svg-primary: #ededed; --svg-secondary: #a1a1aa; --svg-tertiary: #a1a1aa; --border-primary: rgba(255, 255, 255, 0.12); --border-secondary: #2a2a2b; --shadow-pop: 0 8px 24px rgba(0, 0, 0, 0.5); } } @keyframes fade-in { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: translateY(0); } } .status-swap { animation: fade-in 200ms ease-out; } .cell-icon { display: flex; align-items: center; justify-content: center; } .path-basename { font-weight: 500; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }