From e9e431da0b2b177aef6735fcd90b47cc64ee3eb2 Mon Sep 17 00:00:00 2001 From: nexalapp <108235158+nexalapp@users.noreply.github.com> Date: Fri, 2 Oct 2026 18:27:40 -0600 Subject: [PATCH] Theme-Velour: new theme (deep plum, dusty rose accents, italic serif titles, framed cards) --- themes/Theme-Velour/README.md | 34 ++ themes/Theme-Velour/Theme-Velour.yml | 12 + .../assets/fonts/InstrumentSerif-400.woff2 | Bin 0 -> 15040 bytes .../assets/fonts/InstrumentSerif-400i.woff2 | Bin 0 -> 15684 bytes themes/Theme-Velour/assets/fonts/LICENSE.md | 8 + .../assets/fonts/OFL-InstrumentSerif.txt | 93 ++++ .../Theme-Velour/assets/fonts/OFL-Outfit.txt | 93 ++++ .../assets/fonts/Outfit-var.woff2 | Bin 0 -> 32228 bytes themes/Theme-Velour/base.css | 404 ++++++++++++++ themes/Theme-Velour/cards.css | 493 ++++++++++++++++++ themes/Theme-Velour/detail.css | 480 +++++++++++++++++ themes/Theme-Velour/shell.css | 422 +++++++++++++++ themes/Theme-Velour/tokens.css | 140 +++++ 13 files changed, 2179 insertions(+) create mode 100644 themes/Theme-Velour/README.md create mode 100644 themes/Theme-Velour/Theme-Velour.yml create mode 100644 themes/Theme-Velour/assets/fonts/InstrumentSerif-400.woff2 create mode 100644 themes/Theme-Velour/assets/fonts/InstrumentSerif-400i.woff2 create mode 100644 themes/Theme-Velour/assets/fonts/LICENSE.md create mode 100644 themes/Theme-Velour/assets/fonts/OFL-InstrumentSerif.txt create mode 100644 themes/Theme-Velour/assets/fonts/OFL-Outfit.txt create mode 100644 themes/Theme-Velour/assets/fonts/Outfit-var.woff2 create mode 100644 themes/Theme-Velour/base.css create mode 100644 themes/Theme-Velour/cards.css create mode 100644 themes/Theme-Velour/detail.css create mode 100644 themes/Theme-Velour/shell.css create mode 100644 themes/Theme-Velour/tokens.css diff --git a/themes/Theme-Velour/README.md b/themes/Theme-Velour/README.md new file mode 100644 index 00000000..d58c1ccb --- /dev/null +++ b/themes/Theme-Velour/README.md @@ -0,0 +1,34 @@ +# Velour + +A velvet-lounge look for Stash v0.31+. Deep plum that reads as black until lit, +dusty rose for actions, champagne for small flourishes, and italic Instrument +Serif titles over Outfit. + +- Cards are framed plum tiles: the cover sits inset with rounded corners and the + text runs below it, lifting with a soft rose glow on hover. +- Controls are 10px rounded rectangles; main actions are rose pills. +- Covers the list toolbar, filter sidebar, selection toolbar, pagination, list, + wall and tagger views, scene and detail pages, stats and settings, at desktop + and phone widths. +- Fonts are bundled in `assets/fonts` (SIL OFL 1.1), so the theme makes no + external requests. + +Pure CSS; no change to Stash behaviour. Enable one theme at a time. + +## Screenshots + +Taken on Stash v0.31.1 with demo content: fictional titles and names, blurred openly licensed photos (credits on the [screenshots branch](https://github.com/nexalapp/CommunityScripts/tree/screenshots)). + +| Scenes | Scene | +|---|---| +| ![Scenes](https://raw.githubusercontent.com/nexalapp/CommunityScripts/b03f96d614bb72c4df7a72e5227bcd8f2e04833f/Theme-Velour/desktop-scenes.jpg) | ![Scene](https://raw.githubusercontent.com/nexalapp/CommunityScripts/b03f96d614bb72c4df7a72e5227bcd8f2e04833f/Theme-Velour/desktop-scene.jpg) | + +| Performer | Studios | +|---|---| +| ![Performer](https://raw.githubusercontent.com/nexalapp/CommunityScripts/b03f96d614bb72c4df7a72e5227bcd8f2e04833f/Theme-Velour/desktop-performer.jpg) | ![Studios](https://raw.githubusercontent.com/nexalapp/CommunityScripts/b03f96d614bb72c4df7a72e5227bcd8f2e04833f/Theme-Velour/desktop-studios.jpg) | + +| Performers | Settings | +|---|---| +| ![Performers](https://raw.githubusercontent.com/nexalapp/CommunityScripts/b03f96d614bb72c4df7a72e5227bcd8f2e04833f/Theme-Velour/desktop-performers.jpg) | ![Settings](https://raw.githubusercontent.com/nexalapp/CommunityScripts/b03f96d614bb72c4df7a72e5227bcd8f2e04833f/Theme-Velour/desktop-settings.jpg) | + +Scenes on a phone A scene on a phone diff --git a/themes/Theme-Velour/Theme-Velour.yml b/themes/Theme-Velour/Theme-Velour.yml new file mode 100644 index 00000000..da3760c6 --- /dev/null +++ b/themes/Theme-Velour/Theme-Velour.yml @@ -0,0 +1,12 @@ +name: Theme - Velour +description: A velvet lounge. Deep plum, dusty rose actions, champagne flourishes, italic serif titles, framed cards. Self-hosted fonts; no external requests. +version: 0.1.0 +ui: + css: + - tokens.css + - base.css + - shell.css + - cards.css + - detail.css + assets: + /: assets diff --git a/themes/Theme-Velour/assets/fonts/InstrumentSerif-400.woff2 b/themes/Theme-Velour/assets/fonts/InstrumentSerif-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..17653042acca7f87268c8c29dc8c0cc094c0b124 GIT binary patch literal 15040 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 literal 0 HcmV?d00001 diff --git a/themes/Theme-Velour/assets/fonts/InstrumentSerif-400i.woff2 b/themes/Theme-Velour/assets/fonts/InstrumentSerif-400i.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ce3c417c8d0e9f012bb697d25a0874d148ea89e6 GIT binary patch literal 15684 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 iZ)@2i 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 z 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 CX=#W6 literal 0 HcmV?d00001 diff --git a/themes/Theme-Velour/base.css b/themes/Theme-Velour/base.css new file mode 100644 index 00000000..c211902e --- /dev/null +++ b/themes/Theme-Velour/base.css @@ -0,0 +1,404 @@ +/* Buttons, form controls, menus, modals, tabs, toggles. */ + +/* ---------- Buttons ---------- */ +.btn { + font-family: var(--vel-font-body); + font-size: 13px; + font-weight: 500; + border-radius: var(--vel-r-ctl); + transition: background-color 0.15s, color 0.15s, box-shadow 0.15s, transform 0.15s var(--vel-ease); +} +.btn:active { + transform: scale(0.98); +} + +/* Primary actions: rose pill (controls elsewhere are rounded rectangles) */ +.btn-primary:not(.minimal), +.btn-success { + border-radius: 999px !important; + background-color: var(--vel-acc) !important; + border-color: var(--vel-acc) !important; + color: var(--vel-acc-ink) !important; + font-weight: 600; +} +.btn-primary:not(.minimal):hover, +.btn-success:hover { + background-color: var(--vel-acc-hover) !important; + border-color: var(--vel-acc-hover) !important; +} + +/* Secondary: neutral raised pill */ +.btn-secondary, +.btn-info, +.btn-light, +.btn-outline-secondary { + background-color: var(--vel-bg3) !important; + border-color: transparent !important; + color: var(--vel-t1) !important; +} +.btn-secondary:hover, +.btn-info:hover, +.btn-light:hover, +.btn-outline-secondary:hover { + background-color: var(--vel-bg4) !important; +} +.btn-secondary.active, +.btn-secondary:not(:disabled):not(.disabled):active { + background-color: var(--vel-bg4) !important; + color: var(--vel-acc) !important; +} + +/* Destructive: quiet outline until hovered */ +.btn-danger { + background-color: transparent !important; + border: 1px solid var(--vel-bg3) !important; + color: var(--vel-t2) !important; +} +.btn-danger:hover { + background-color: var(--vel-danger) !important; + border-color: var(--vel-danger) !important; + color: #fff !important; +} + +/* Icon-only "minimal" buttons */ +.btn.minimal { + background-color: transparent !important; + border-color: transparent !important; + color: var(--vel-t2) !important; + box-shadow: none !important; +} +.btn.minimal:hover { + color: var(--vel-t1) !important; + background-color: var(--vel-bg2) !important; +} + +.btn-link { + color: var(--vel-acc) !important; +} + +.btn:disabled, +.btn.disabled { + opacity: 0.45; +} + +.btn:focus, +.btn.focus { + box-shadow: none !important; +} +.btn:focus-visible { + box-shadow: var(--vel-ring) !important; +} + +/* ---------- Form controls ---------- */ +.form-control, +.custom-select, +.input-control, +.react-select__control, +.date-input, +.text-input { + background-color: var(--vel-bg2) !important; + border: 1px solid transparent !important; + color: var(--vel-t1) !important; + border-radius: 10px !important; + font-size: 13px; + box-shadow: none !important; +} +.form-control:focus, +.react-select__control--is-focused { + border-color: var(--vel-acc) !important; + box-shadow: 0 0 0 3px var(--vel-acc-soft) !important; +} +.form-control::placeholder, +.react-select__placeholder { + color: var(--vel-t3) !important; +} +.form-control:disabled, +.form-control[readonly] { + background-color: var(--vel-bg1) !important; + color: var(--vel-t2) !important; +} +textarea.form-control { + border-radius: 10px !important; +} + +/* Single-line inputs are pills */ +input.form-control:not([type="checkbox"]):not([type="range"]), +select.form-control, +.custom-select { + border-radius: var(--vel-r-ctl) !important; + padding-left: 14px; + padding-right: 14px; +} + +.input-group > .form-control:not(:last-child) { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.input-group > .input-group-append > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.react-select__menu, +.react-select__menu-list { + background-color: var(--vel-bg2) !important; + border-radius: var(--vel-r-card) !important; + box-shadow: var(--vel-shadow-pop) !important; +} +.react-select__option { + background-color: transparent !important; + color: var(--vel-t2) !important; + border-radius: 7px; +} +.react-select__option--is-focused, +.react-select__option--is-selected { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; +} +.react-select__multi-value { + background-color: var(--vel-bg3) !important; + border-radius: 999px !important; +} +.react-select__multi-value__label, +.react-select__single-value, +.react-select__input-container { + color: var(--vel-t1) !important; +} + +label, +.form-label, +.col-form-label { + color: var(--vel-t2); + font-size: 13px; + font-weight: 500; +} + +/* Checkboxes */ +input[type="checkbox"], +input[type="radio"] { + accent-color: var(--vel-acc); +} + +/* Toggles (Bootstrap custom-switch) */ +.custom-switch .custom-control-label::before { + background-color: var(--vel-bg3) !important; + border-color: var(--vel-bg3) !important; + border-radius: 999px !important; +} +.custom-switch .custom-control-label::after { + background-color: var(--vel-t3) !important; +} +.custom-switch .custom-control-input:checked ~ .custom-control-label::before { + background-color: var(--vel-acc) !important; + border-color: var(--vel-acc) !important; +} +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: var(--vel-acc-ink) !important; +} +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 3px var(--vel-acc-soft) !important; +} + +/* Range sliders */ +input[type="range"] { + accent-color: var(--vel-acc); +} + +/* ---------- Menus ---------- */ +.dropdown-menu, +.popover { + background-color: var(--vel-bg2) !important; + border: 1px solid var(--vel-line) !important; + border-radius: var(--vel-r-card) !important; + box-shadow: var(--vel-shadow-pop) !important; + padding: 6px !important; + color: var(--vel-t1); +} +.dropdown-item { + color: var(--vel-t2) !important; + border-radius: 7px; + padding: 6px 10px !important; + font-size: 13px; +} +.dropdown-item:hover, +.dropdown-item:focus { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; +} +.dropdown-item.active, +.dropdown-item:active { + background-color: var(--vel-bg3) !important; + color: var(--vel-acc) !important; +} +.dropdown-divider { + border-color: var(--vel-line) !important; +} +.popover-header { + background: transparent !important; + border-color: var(--vel-line) !important; + color: var(--vel-t1); +} +.popover-body { + color: var(--vel-t1) !important; +} +.popover .arrow::after { + border-top-color: var(--vel-bg2) !important; + border-bottom-color: var(--vel-bg2) !important; +} + +.tooltip-inner { + background-color: var(--vel-bg3); + color: var(--vel-t1); + border-radius: 8px; + font-size: 12px; +} + +/* ---------- Modals ---------- */ +.modal-backdrop.show { + opacity: 1 !important; + background-color: rgba(0, 0, 0, 0.45) !important; + backdrop-filter: blur(2px); +} +.modal-content { + background-color: var(--vel-bg1) !important; + border: 1px solid var(--vel-line) !important; + border-radius: var(--vel-r-card) !important; + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6); + color: var(--vel-t1); +} +.modal-header, +.modal-footer { + border-color: var(--vel-line) !important; + background-color: transparent !important; +} +.modal-header, +.modal-header .modal-title { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 22px; +} +.modal-body { + background-color: transparent !important; +} +.close { + color: var(--vel-t2) !important; + text-shadow: none !important; +} + +/* ---------- Tabs (underline) ---------- */ +.nav-tabs { + border-bottom: 1px solid var(--vel-line) !important; + gap: 18px; +} +.nav-tabs .nav-link { + background: transparent !important; + border: 0 !important; + border-bottom: 2px solid transparent !important; + border-radius: 0 !important; + color: var(--vel-t2) !important; + font-size: 13px; + font-weight: 500; + padding: 6px 0 9px !important; +} +.nav-tabs .nav-link:hover { + color: var(--vel-t1) !important; +} +.nav-tabs .nav-link.active { + color: var(--vel-t1) !important; + border-bottom-color: var(--vel-acc) !important; +} +.nav-tabs .nav-link .left-spacing, +.nav-tabs .badge, +.nav-link .count { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; + border-radius: 999px !important; + font-size: 11px; + font-weight: 500; + padding: 1px 7px; +} + +/* Pills (settings menu) */ +.nav-pills .nav-link { + color: var(--vel-t2) !important; + border-radius: 999px !important; + font-size: 13px; + font-weight: 500; + padding: 7px 12px; +} +.nav-pills .nav-link:hover { + color: var(--vel-t1) !important; + background-color: var(--vel-bg2) !important; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; +} + +/* Badges and tag chips */ +.badge { + border-radius: 999px; + font-weight: 500; +} +.badge-secondary, +.tag-item, +.badge.tag-item { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; + border-radius: 999px !important; + font-size: 12px; + font-weight: 500; + padding: 4px 10px; +} +.badge-primary, +.badge-info { + background-color: var(--vel-acc-soft) !important; + color: var(--vel-acc) !important; +} + +/* Generic panels */ +.card { + background-color: var(--vel-bg1); + border: 0; + border-radius: var(--vel-r-card); + box-shadow: none; + color: var(--vel-t1); +} +.card-header, +.card-footer { + background-color: transparent; + border-color: var(--vel-line); +} + +.table { + color: var(--vel-t1); +} +.table td, +.table th { + border-color: var(--vel-line) !important; +} + +/* Rating stars: off-white on, neutral off */ +.rating-stars .star-fill, +.rating-stars .filled, +.rating-stars button.star-fill svg { + color: var(--vel-rating) !important; +} +.rating-stars .unfilled, +.rating-stars button:not(.star-fill) svg { + color: var(--vel-bg4) !important; +} + +/* Toasts */ +.toast { + background-color: var(--vel-bg2) !important; + border: 1px solid var(--vel-line) !important; + border-radius: var(--vel-r-card) !important; + color: var(--vel-t1); +} +.toast-header { + background-color: transparent !important; + color: var(--vel-t1) !important; + border-color: var(--vel-line) !important; +} diff --git a/themes/Theme-Velour/cards.css b/themes/Theme-Velour/cards.css new file mode 100644 index 00000000..8ef2faf8 --- /dev/null +++ b/themes/Theme-Velour/cards.css @@ -0,0 +1,493 @@ +/* Cards. Everything is a framed plum tile: the image inset with 10px + corners, text below it, a rose glow on hover. + Stash sets each card's width inline from the zoom slider: never override + width here, only aspect and contents. */ + +.grid-card { + margin: 6px !important; + border: 0 !important; + border-radius: var(--vel-r-card) !important; + transition: transform 0.22s var(--vel-ease), box-shadow 0.22s var(--vel-ease); +} +.grid-card hr { + display: none; +} +.row.justify-content-center:has(> .grid-card) { + padding: 8px 10px 16px; +} + +/* Selection check: a ring on hover, a filled wine dot when checked */ +.grid-card .card-controls { + position: absolute; + top: 10px; + left: 10px; + z-index: 4; + opacity: 0; + transition: opacity 0.15s; +} +.grid-card:hover .card-controls, +.grid-card .card-controls:has(.card-check:checked) { + opacity: 1; +} +.grid-card .card-check { + -webkit-appearance: none; + appearance: none; + width: 20px !important; + height: 20px !important; + margin: 0 !important; + padding: 0 !important; + border-radius: 50% !important; + border: 2px solid var(--vel-t1) !important; + background: rgba(22, 22, 22, 0.35) !important; + cursor: pointer; +} +.grid-card .card-check:checked { + border-color: var(--vel-acc) !important; + background: var(--vel-acc) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / 12px no-repeat !important; +} +.grid-card:has(.card-check:checked) { + box-shadow: var(--vel-ring) !important; +} + +/* Count buttons at the foot of a card */ +.grid-card .card-popovers { + justify-content: flex-start !important; + gap: 10px; + margin: 0 !important; + padding: 0 !important; + flex-wrap: nowrap; +} +.grid-card .card-popovers .btn { + padding: 0 !important; + height: auto; + font-size: 11px !important; + font-weight: 500; + color: var(--vel-t2) !important; + background: transparent !important; +} +.grid-card .card-popovers .btn:hover { + color: var(--vel-t1) !important; +} +.grid-card .card-popovers svg { + width: 11px; + margin-right: 4px; + opacity: 0.8; +} + +/* ================= Framed media cards: scenes, performers ================= + A plum tile with 5px of padding; the image sits inset with 10px corners + and the text runs below it. */ +.scene-card.grid-card, +.performer-card.grid-card { + position: relative; + overflow: hidden; + padding: 5px !important; + background-color: var(--vel-bg1) !important; +} +.scene-card.grid-card:hover, +.performer-card.grid-card:hover { + transform: translateY(-2px); + box-shadow: var(--vel-glow); +} + +.scene-card .thumbnail-section, +.performer-card .thumbnail-section { + position: relative !important; + margin: 0 !important; + border-radius: 10px; + overflow: hidden; + background: var(--vel-media); + max-height: none !important; +} +.scene-card .thumbnail-section { + aspect-ratio: 16 / 9; + height: auto !important; +} +.performer-card .thumbnail-section { + aspect-ratio: 2 / 3; + height: auto !important; +} +.scene-card .scene-card-link, +.scene-card .scene-card-preview, +.performer-card .thumbnail-section > a:first-child { + display: block; + height: 100% !important; + max-height: none !important; + aspect-ratio: auto !important; +} +.scene-card .scene-card-preview-image, +.scene-card .scene-card-preview-video, +.performer-card .performer-card-image { + width: 100% !important; + height: 100% !important; + max-height: none !important; + min-width: 0 !important; + aspect-ratio: auto !important; + object-fit: cover; + object-position: center top; + border-radius: 0 !important; +} + +/* Text below the image */ +.scene-card .card-section, +.performer-card .card-section { + padding: 10px 9px 4px !important; + margin: 0 !important; + background: transparent !important; + display: grid; + gap: 3px; +} +.scene-card .card-popovers, +.performer-card .card-popovers { + padding: 3px 9px 6px !important; +} +.scene-card .card-popovers .btn, +.performer-card .card-popovers .btn { + color: var(--vel-t3) !important; +} + +.scene-card .card-section-title, +.performer-card .card-section-title { + font-family: var(--vel-font-title) !important; + font-style: var(--vel-title-style); + font-size: var(--vel-title-card) !important; + line-height: var(--vel-title-lh) !important; + font-weight: 400 !important; + color: var(--vel-t1) !important; + text-shadow: none !important; + margin: 0 !important; +} +.scene-card .card-section-title .TruncatedText { + -webkit-line-clamp: 2 !important; +} +.scene-card .scene-card__details { + display: grid; + gap: 3px; + margin: 0 !important; +} +.scene-card .scene-card__date { + font-size: 11px; + font-weight: 500; + color: var(--vel-t3) !important; +} +.scene-card .scene-card__description { + font-size: 12px !important; + line-height: 1.4 !important; + color: var(--vel-t2) !important; + -webkit-line-clamp: 2 !important; + margin: 0 !important; +} +.scene-card .extra-scene-info { + display: none !important; +} + +/* "1080P · 21:04" in champagne, bottom right of the image */ +.scene-card .scene-specs-overlay { + position: absolute !important; + top: auto !important; + right: 8px !important; + bottom: 8px !important; + left: auto !important; + z-index: 3; + padding: 3px 7px; + border-radius: var(--vel-r-chip); + background: rgba(0, 0, 0, 0.55); + color: var(--vel-acc2) !important; + font-size: 10px !important; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + text-shadow: none !important; + display: flex; +} +.scene-card .scene-specs-overlay > span { + font-size: 10px !important; + font-weight: 600 !important; + margin: 0 !important; + padding: 0 !important; + color: inherit !important; + text-shadow: none !important; +} +.scene-card .scene-specs-overlay .overlay-resolution + .overlay-duration::before { + content: "\00a0·\00a0"; +} + +/* Studio logo, top left of the image */ +.scene-card .studio-overlay { + position: absolute !important; + top: 8px !important; + left: 8px !important; + right: auto !important; + z-index: 3; + max-width: 45%; + padding: 3px 7px; + border-radius: var(--vel-r-chip); + background: rgba(0, 0, 0, 0.45); + opacity: 0.9; + height: auto !important; + display: flex; + align-items: center; +} +/* Stock gives the logo link a fixed height; let the chip wrap the logo */ +.scene-card .studio-overlay a { + display: block; + height: auto !important; + line-height: 0; +} +.scene-card .studio-overlay .image-thumbnail { + display: block; + height: 18px !important; + max-height: 18px !important; + max-width: 100%; + width: auto; + object-fit: contain; +} + +/* The selection check sits top right on these cards */ +.scene-card .card-controls, +.performer-card .card-controls { + left: auto !important; + right: 13px; + top: 13px; +} + +.scene-card .progress-bar { + z-index: 3; + background-color: var(--vel-acc) !important; +} + +/* Rating as a small chip */ +.grid-card .rating-banner { + transform: none !important; + left: 13px !important; + right: auto !important; + top: auto !important; + bottom: auto !important; + width: auto !important; + padding: 2px 7px !important; + border-radius: var(--vel-r-chip) !important; + background: rgba(0, 0, 0, 0.55) !important; + color: var(--vel-acc) !important; + font-size: 10px !important; + font-weight: 600; + letter-spacing: 0.06em; + z-index: 3; + box-shadow: none !important; +} + +/* ---- Performer specifics ---- */ +.performer-card .card-section-title { + display: flex !important; + align-items: baseline; + gap: 8px; +} +.performer-card .card-section-title .gender-icon, +.performer-card .card-section-title svg { + color: var(--vel-t3) !important; + width: 12px; + flex: none; +} +.performer-card .card-section-title span, +.performer-card .performer-name { + font-size: inherit !important; +} +.performer-card .performer-card__age { + font-size: 11px !important; + font-weight: 500; + color: var(--vel-t3) !important; +} +.performer-card .performer-card__country-flag { + display: none !important; +} +.performer-card .thumbnail-section > a:has(.performer-card__country-string) { + position: absolute; + right: 8px; + bottom: 8px; + height: auto !important; + z-index: 3; +} +.performer-card .performer-card__country-string { + display: inline-block !important; + padding: 3px 7px; + border-radius: var(--vel-r-chip); + background: rgba(0, 0, 0, 0.55); + color: var(--vel-t1); + font-size: 10px; + font-weight: 600; + letter-spacing: 0.08em; +} +/* Favourite heart: top-right, mirroring the selection check on the left, at + the same 20px. No black halo or pill; off-white until it's a favourite. */ +.grid-card button.btn.favorite-button { + position: absolute !important; + z-index: 4; + top: 10px !important; + right: 10px !important; + left: auto !important; + width: 20px; + height: 20px; + padding: 0 !important; + margin: 0 !important; + display: grid; + place-items: center; + background: none !important; + border: 0 !important; + box-shadow: none !important; + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.45)) !important; + color: var(--vel-acc) !important; +} +.grid-card button.btn.favorite-button svg.fa-icon, +.grid-card button.btn.favorite-button svg { + width: 18px !important; + height: 18px !important; + font-size: 18px !important; + margin: 0 !important; +} +.grid-card button.btn.favorite-button.not-favorite { + color: rgba(243, 240, 238, 0.85) !important; +} +.grid-card button.btn.favorite-button:hover { + background: none !important; + transform: scale(1.1); +} + +/* ================= Framed tiles: studios, tags, galleries, groups ================= */ +.studio-card.grid-card, +.tag-card.grid-card, +.gallery-card.grid-card, +.group-card.grid-card, +.image-card.grid-card { + background-color: var(--vel-bg1) !important; + padding: 5px !important; + overflow: hidden; +} +.studio-card.grid-card:hover, +.tag-card.grid-card:hover, +.gallery-card.grid-card:hover, +.group-card.grid-card:hover, +.image-card.grid-card:hover { + transform: translateY(-2px); + box-shadow: var(--vel-glow); +} +.studio-card .thumbnail-section, +.tag-card .thumbnail-section, +.gallery-card .thumbnail-section, +.group-card .thumbnail-section, +.image-card .thumbnail-section { + border-radius: 10px; + overflow: hidden; + background-color: var(--vel-bg2); + position: relative; +} +/* Fixed 16:9 logo box. The logo is positioned inside it, so a tall logo + can't stretch the box and every tile in a grid comes out the same size. */ +.studio-card .studio-card-header, +.tag-card .tag-card-header { + display: block !important; + position: relative; + aspect-ratio: 16 / 9; + width: 100%; + height: auto !important; + min-height: 0 !important; + max-height: none !important; + overflow: hidden; + background-color: var(--vel-bg2); +} +.studio-card .studio-card-image, +.tag-card .tag-card-image { + position: absolute; + inset: 0; + width: 100% !important; + height: 100% !important; + max-width: none !important; + max-height: none !important; + min-height: 0 !important; + object-fit: contain; + padding: 10% 12%; + aspect-ratio: auto !important; +} +.gallery-card .gallery-card-image, +.group-card .group-card-image, +.image-card .image-card-preview-image { + border-radius: 0; + object-fit: cover; +} +.studio-card .card-section, +.tag-card .card-section, +.gallery-card .card-section, +.group-card .card-section, +.image-card .card-section { + padding: 10px 9px 4px !important; + background: transparent !important; +} +.studio-card .card-section-title, +.tag-card .card-section-title, +.gallery-card .card-section-title, +.group-card .card-section-title, +.image-card .card-section-title { + font-size: var(--vel-title-card) !important; + line-height: var(--vel-title-lh) !important; + color: var(--vel-t1) !important; + margin-bottom: 3px !important; + text-align: left !important; +} +.studio-card__details, +.studio-card__details a, +.tag-card .tag-description, +.gallery-card__details, +.group-card__details { + font-size: 11px !important; + color: var(--vel-t3) !important; + font-weight: 500; +} +.studio-card .card-popovers, +.tag-card .card-popovers, +.gallery-card .card-popovers, +.group-card .card-popovers, +.image-card .card-popovers { + padding: 2px 9px 6px !important; +} +.studio-card .card-popovers .btn, +.tag-card .card-popovers .btn, +.gallery-card .card-popovers .btn, +.group-card .card-popovers .btn { + color: var(--vel-t3) !important; +} + +/* Home-page carousels ("Recently added ...") size each card from its + contents, so a wide studio logo made a wide card. Pin them like stock. */ +.recommendation-row .grid-card { + width: 320px !important; + max-width: 320px; +} +.recommendation-row .studio-card .studio-card-image, +.recommendation-row .tag-card .tag-card-image { + max-width: 100% !important; +} + +/* Reserve the "Part of …" line so studio tiles stay the same height with or + without a parent studio. */ +.studio-card .studio-card__details { + min-height: 1.5em; +} + +/* Performer cards have no studio chip, so the check goes back top-left and + the favourite heart takes the top-right corner. */ +.performer-card .card-controls { + left: 13px !important; + right: auto !important; +} +.performer-card button.btn.favorite-button { + top: 8px !important; /* + the 5px tile padding = 13px, matching the check */ + right: 8px !important; +} + +/* Framed tiles place the heart inside the 5px-inset image box; offset it so + it sits as far from the corner as the check does. */ +.studio-card button.btn.favorite-button, +.tag-card button.btn.favorite-button, +.gallery-card button.btn.favorite-button, +.group-card button.btn.favorite-button { + top: 5px !important; + right: 5px !important; +} diff --git a/themes/Theme-Velour/detail.css b/themes/Theme-Velour/detail.css new file mode 100644 index 00000000..7a04e50b --- /dev/null +++ b/themes/Theme-Velour/detail.css @@ -0,0 +1,480 @@ +/* Scene page, entity detail headers, list/wall/tagger views, stats, + settings, empty states. */ + +/* Bootstrap utility Stash uses for menus and panels */ +.bg-secondary { + background-color: var(--vel-bg2) !important; +} +.dropdown-menu .bg-secondary.dropdown-item { + background-color: transparent !important; +} +.dropdown-menu .bg-secondary.dropdown-item:hover, +.dropdown-menu .bg-secondary.dropdown-item:focus { + background-color: var(--vel-bg3) !important; +} +.text-white { + color: var(--vel-t1) !important; +} + +/* ================= Scene page ================= */ +.scene-tabs { + background-color: var(--vel-bg1); + border-right: 1px solid var(--vel-line); + padding: 0 16px 16px !important; +} +.scene-tabs .scene-header-container .studio-logo { + margin: 0 -16px 18px !important; + padding: 16px; + min-height: 0; +} +.scene-tabs .scene-header-container img.studio-logo { + max-height: 100px; + object-fit: contain; +} +.scene-tabs .scene-header { + font-family: var(--vel-font-title) !important; + font-style: var(--vel-title-style); + font-size: var(--vel-title-page) !important; + line-height: 1.1 !important; + font-weight: 400; + color: var(--vel-t1); + margin-bottom: 6px; +} +.scene-subheader { + font-size: 13px; + color: var(--vel-t2); +} +.scene-subheader .resolution { + color: var(--vel-t1); + font-weight: 600; +} +.scene-subheader .divider { + opacity: 0; + margin: 0 2px; +} +.scene-subheader .frame-rate::after { + content: " ·"; +} +.scene-toolbar { + color: var(--vel-t2); + margin-top: 4px; +} +.scene-tabs .nav-tabs { + margin-top: 10px; +} +.scene-details h6, +.scene-file-info dt, +.scene-file-info dd, +.scene-details .detail-item { + font-family: var(--vel-font-body); + font-size: 13px !important; + font-weight: 400; + line-height: 1.6; + color: var(--vel-t2); +} +.scene-details a, +.scene-file-info a { + color: var(--vel-acc) !important; +} +.scene-description, +.scene-details .TruncatedText { + font-size: 13px; + line-height: 1.6; + color: var(--vel-t2); +} +.scene-file-info dt { + color: var(--vel-t1); + font-weight: 500; +} + +/* The collapse handle between the panel and the player */ +.scene-divider .btn { + background-color: transparent !important; + border: 0 !important; + color: var(--vel-t3) !important; + width: 14px; + padding: 0 !important; + border-radius: 0 !important; +} +.scene-divider .btn:hover { + background-color: var(--vel-bg2) !important; + color: var(--vel-t1) !important; +} + +/* Player */ +.scene-player-container { + background-color: var(--vel-bg0); +} +.video-js .vjs-play-progress, +.video-js .vjs-volume-level { + background-color: var(--vel-acc) !important; +} +.video-js .vjs-load-progress { + background: rgba(255, 255, 255, 0.25) !important; +} +.video-js .vjs-progress-holder { + background: rgba(255, 255, 255, 0.18) !important; + border-radius: 2px; +} +.video-js .vjs-control-bar { + background: linear-gradient(180deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.7)) !important; +} +.video-js .vjs-big-play-button { + width: 72px !important; + height: 72px !important; + line-height: 72px !important; + margin-left: -36px !important; + margin-top: -36px !important; + border: 0 !important; + border-radius: 50% !important; + background-color: rgba(255, 255, 255, 0.14) !important; + backdrop-filter: blur(6px); +} + +/* Scrubber strip under the player */ +.scrubber-wrapper { + gap: 8px; + padding: 10px 16px 12px; + margin: 0 !important; +} +.scrubber-wrapper .scrubber-button { + width: 22px !important; + min-width: 22px; + padding: 0 !important; + border: 0 !important; + border-radius: var(--vel-r-chip) !important; + background-color: var(--vel-bg2) !important; + color: var(--vel-acc) !important; + font-weight: 400; +} +.scrubber-wrapper .scrubber-button:hover { + background-color: var(--vel-bg3) !important; +} +.scrubber-content { + border-radius: var(--vel-r-chip); + background-color: var(--vel-bg1); + margin: 0 !important; +} +.scrubber-tags-background { + background-color: var(--vel-bg3) !important; +} +#scrubber-current-position { + background-color: var(--vel-t1) !important; +} +.scrubber-tag { + background-color: var(--vel-acc) !important; + color: var(--vel-acc-ink) !important; + border-radius: 4px; +} + +/* Edit panels: Save stands out, the rest stay neutral */ +.details-edit .btn-primary:not(.edit):not(.save), +.scraper-menu .btn-primary, +.search-item .btn-primary:not(.minimal):not(.input-group-append .btn), +.setting-section .btn-primary:not(.minimal), +#settings-menu-container .btn-primary { + border-radius: var(--vel-r-ctl) !important; + background-color: var(--vel-bg3) !important; + border-color: transparent !important; + color: var(--vel-t1) !important; + font-weight: 500; +} +#scene-edit-details .edit-buttons-container, +.edit-buttons-container { + background-color: var(--vel-bg1) !important; +} +.form-group .col-form-label, +.form-group label { + color: var(--vel-t2); +} + +/* ================= Detail headers: performer, studio, tag, group ================= */ +.detail-header, +.detail-header.full-width { + background-color: var(--vel-bg1) !important; + border-bottom: 1px solid var(--vel-line); + color: var(--vel-t1); +} +.detail-header .background-image-container { + opacity: 0.18; +} +.detail-header-image { + position: relative; +} +.detail-header-image .btn-link { + padding: 0 !important; +} +.detail-header-image img.performer, +.detail-header-image img { + border-radius: 0 !important; + box-shadow: none !important; +} +.detail-header h2, +.detail-header .performer-name, +.detail-header .studio-name, +.detail-header .tag-name { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 40px; + line-height: 1; + font-weight: 400; + color: var(--vel-t1); +} +.detail-header .alias-head { + font-size: 13px; + color: var(--vel-t2); +} +.detail-header .detail-item { + font-size: 13px; + line-height: 1.75; +} +.detail-header .detail-item-title { + color: var(--vel-t3); + font-weight: 500; + width: 130px; + display: inline-block; +} +.detail-header .detail-item-value { + color: var(--vel-t1); +} +.detail-header .details-edit { + gap: 8px; + margin-top: 10px; +} +.detail-header .name-icons .favorite-button:not(.not-favorite) { + color: var(--vel-acc) !important; +} +.detail-header .name-icons .link, +.detail-header a { + color: var(--vel-acc); +} + +/* StashDB / stash-box ID chips */ +.stash-id-pill, +.stash-id-pill span, +.stash-id-pill a { + border-radius: 999px !important; +} +.stash-id-pill span:first-child { + background-color: var(--vel-acc-soft) !important; + color: var(--vel-acc) !important; +} +.stash-id-pill span:last-child, +.stash-id-pill a { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; +} + +/* Tabs under a detail header, centred */ +.detail-body .nav-tabs, +.performer-tabs .nav-tabs, +.studio-tabs .nav-tabs, +.tag-tabs .nav-tabs { + justify-content: center; + gap: 22px; +} + +/* Sticky header shown when scrolled */ +.sticky.detail-header { + background-color: rgba(30, 30, 30, 0.92) !important; + backdrop-filter: blur(10px); +} +.sticky.detail-header .sticky.detail-header-group a, +.sticky.detail-header .sticky.detail-header-group span { + color: var(--vel-t1) !important; +} + +/* ================= List (table) view ================= */ +.table-list table { + color: var(--vel-t1); +} +.table-list table thead th { + font-size: 12px; + font-weight: 600; + color: var(--vel-t2) !important; + border-bottom: 1px solid var(--vel-line) !important; + border-top: 0 !important; +} +.table-list table tbody tr { + border-bottom: 1px solid var(--vel-line); +} +.table-list table tbody tr:hover { + background-color: var(--vel-bg1); +} +.table-list table td { + vertical-align: middle; + border: 0 !important; + font-size: 13px; +} +.table-list table td img { + border-radius: 8px; +} +.table-list .title-link, +.table-list td.title-data a, +.table-list td a.performer-name { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 16px; + color: var(--vel-t1) !important; +} +.table-list td a { + color: var(--vel-t1); +} + +/* ================= Wall view ================= */ +.wall-item, +.wall-item-container { + border-radius: var(--vel-r-chip) !important; + overflow: hidden; +} +.wall-item-text, +.wall-item .wall-item-text { + background: linear-gradient(180deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.8)) !important; + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 18px; + color: var(--vel-t1) !important; + text-shadow: none !important; +} + +/* ================= Tagger ================= */ +.tagger-container .search-item, +.tagger-container .tagger-item, +.search-item { + background-color: var(--vel-bg1) !important; + border: 0 !important; + border-radius: var(--vel-r-card) !important; + padding: 14px !important; + margin-bottom: 12px; +} +.tagger-container .search-item .scene-card-link img, +.search-item img { + border-radius: 10px; +} +.tagger-container .input-group-prepend .input-group-text, +.input-group-text { + background-color: var(--vel-bg3) !important; + border: 0 !important; + color: var(--vel-t2) !important; + font-size: 12px; + font-weight: 500; +} +.tagger-container .input-group .form-control { + border-radius: 0 !important; +} +.tagger-container .input-group > :first-child, +.tagger-container .input-group > :first-child .input-group-text { + border-radius: var(--vel-r-ctl) 0 0 var(--vel-r-ctl) !important; +} +.tagger-container .input-group .input-group-append .btn { + border-radius: 0 var(--vel-r-ctl) var(--vel-r-ctl) 0 !important; +} + +/* ================= Stats ================= */ +#stats-page .stats-element, +.stats .stats-element { + text-align: center; +} +#stats-page .stats-element .title, +.stats .title { + font-family: var(--vel-font-title) !important; + font-style: var(--vel-title-style); + font-size: 52px !important; + line-height: 1; + font-weight: 400 !important; + color: var(--vel-t1) !important; +} +#stats-page .stats-element .heading, +.stats .heading { + margin-top: 12px; + font-size: 11px !important; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--vel-t3) !important; + font-weight: 500; +} + +/* ================= Settings ================= */ +#settings-menu-container .nav-pills, +.settings-menu-container .nav-pills { + gap: 2px; +} +#settings-container h1, +#settings-container h2, +#settings-container h3, +.setting-section h1 { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 28px; + font-weight: 400; + color: var(--vel-t1); +} +.setting-section .card, +#settings-container .card, +#settings-container .setting-group { + background-color: var(--vel-bg1) !important; + border-radius: var(--vel-r-card) !important; + border: 0 !important; +} +.setting-section .setting, +#settings-container .setting { + border-color: var(--vel-line) !important; +} +.setting-section .setting h3, +.setting-section .setting-group h3, +#settings-container .setting h3, +#settings-container .setting-group h3, +#settings-container .setting-section h3, +.setting-section h3 { + font-family: var(--vel-font-body); + font-style: normal !important; + font-size: 15px; + font-weight: 600; +} +.setting .sub-heading, +.setting-section .sub-heading, +#settings-container .sub-heading { + font-size: 12px; + color: var(--vel-t2) !important; +} +.job-table.card { + background-color: var(--vel-bg1) !important; + border-radius: var(--vel-r-card) !important; + color: var(--vel-t2); +} +#tasks-panel .tasks-panel-queue h1 { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); +} +.logs .log-entry, +.LogEntry, +#log-entries { + font-size: 12px; +} + +/* ================= Empty list ================= */ +.item-list-container .sidebar-pane-content:not(:has(.grid-card, .table-list, .scene-wall, .wall, .tagger-container, .card, [class*="wall"])) > .pagination-index-container::after { + content: "Nothing here yet"; + display: block; + margin: 18vh auto 0; + text-align: center; + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 26px; + color: var(--vel-t2); +} + +/* Big play button: Stash draws the icon at 100px, larger than the 72px circle, + so it overflowed off-centre. Size the glyph to the circle and nudge it right + so the triangle looks optically centred. */ +.video-js .vjs-big-play-button { + font-size: 36px !important; + border: 0 !important; +} +.video-js .vjs-big-play-button .vjs-icon-placeholder::before { + font-size: 36px !important; + line-height: 72px !important; + width: 100% !important; + height: 100% !important; + text-indent: 3px; +} diff --git a/themes/Theme-Velour/shell.css b/themes/Theme-Velour/shell.css new file mode 100644 index 00000000..4ccd2dc9 --- /dev/null +++ b/themes/Theme-Velour/shell.css @@ -0,0 +1,422 @@ +/* Top bar, list toolbar, pagination, result count, filter sidebar. */ + +/* ---------- Top bar ---------- */ +.top-nav, +.top-nav.bg-dark, +.top-nav .bg-dark { + background-color: var(--vel-bg1) !important; +} +.top-nav { + border-bottom: 1px solid var(--vel-line); + box-shadow: none !important; + padding-left: 16px !important; + padding-right: 16px !important; +} + +.top-nav .navbar-brand .brand-link { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-size: 22px !important; + line-height: 1; + color: var(--vel-t1) !important; + background: transparent !important; + padding: 0 18px 0 0 !important; + letter-spacing: 0; +} +.top-nav .navbar-brand .brand-link:hover { + background: transparent !important; +} + +@media (min-width: 1200px) { + .top-nav .navbar-nav .nav-link { + padding: 0 1px !important; + } + .top-nav .navbar-nav .nav-link > a.btn { + padding: 6px 12px !important; + border-radius: 999px !important; + font-size: 13px; + font-weight: 500; + color: var(--vel-t2) !important; + } + .top-nav .navbar-nav .nav-link > a.btn:hover { + background-color: var(--vel-bg2) !important; + color: var(--vel-t1) !important; + } + .top-nav .navbar-nav .nav-link > a.btn.active { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; + } + /* Words, not icons, in the desktop bar */ + .top-nav .navbar-nav .nav-link > a.btn .nav-menu-icon { + display: none !important; + } +} + +.top-nav .nav-utility .btn, +.top-nav .navbar-buttons .btn.minimal, +.top-nav .logout-button { + color: var(--vel-t2) !important; + border-radius: 999px !important; +} +.top-nav .navbar-buttons a[href$="/new"] .btn { + height: 32px; + padding: 0 14px; + border-radius: 999px !important; +} + +/* Theme Switch's own menu */ +.theme-plugin-menu .card, +.theme-plugin-menu .card-header, +.theme-plugin-menu .modal-header { + background-color: transparent !important; + color: var(--vel-t1) !important; + border-color: var(--vel-line) !important; + font-family: var(--vel-font-body); + font-size: 13px; +} + +/* ---------- Page container ---------- */ +.main.container-fluid { + background: transparent; +} + +/* ---------- List toolbar ---------- */ +.filtered-list-toolbar { + background-color: transparent !important; + padding-top: 12px !important; + padding-bottom: 0 !important; + gap: 8px !important; +} +.filtered-list-toolbar > * { + margin: 0 !important; +} + +/* Grouped controls become one pill with segments inside */ +.filtered-list-toolbar .btn-group, +.filtered-list-toolbar .sort-by-select { + background-color: var(--vel-bg2); + border-radius: var(--vel-r-ctl); + padding: 3px; + gap: 2px; + height: var(--vel-ctl-h); + align-items: center; + border: 0 !important; +} +.filtered-list-toolbar .btn-group .btn-group, +.filtered-list-toolbar .list-operations .btn-group .btn-group { + padding: 0; + background: transparent; + height: auto; +} +.filtered-list-toolbar .btn-group > .btn, +.filtered-list-toolbar .btn-group > .btn-group > .btn, +.filtered-list-toolbar .btn-group > .dropdown > .btn, +.filtered-list-toolbar .sort-by-select .btn { + background-color: transparent !important; + border: 0 !important; + border-radius: var(--vel-r-in) !important; + color: var(--vel-t2) !important; + height: 28px; + min-width: 30px; + padding: 0 9px; + display: inline-flex; + align-items: center; + justify-content: center; + margin: 0 !important; +} +.filtered-list-toolbar .btn-group .btn:hover, +.filtered-list-toolbar .sort-by-select .btn:hover { + color: var(--vel-t1) !important; + background-color: var(--vel-bg3) !important; +} +.filtered-list-toolbar .btn-group .btn.active { + background-color: var(--vel-bg3) !important; + color: var(--vel-acc) !important; +} + +/* Sort: label, hairline, direction */ +.filtered-list-toolbar .sort-by-select .input-group-prepend .btn { + color: var(--vel-t1) !important; + font-weight: 500; + padding: 0 12px; +} +.filtered-list-toolbar .sort-by-select .input-group-prepend { + margin: 0; + border-right: 1px solid var(--vel-line); +} +.filtered-list-toolbar .sort-by-select .dropdown-toggle::after { + display: none; +} + +/* Search */ +.filtered-list-toolbar .search-term-input .form-control, +.filtered-list-toolbar .search-term-input input { + height: var(--vel-ctl-h); + width: 220px; + padding-left: 34px !important; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236f6a66' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-3.5-3.5'/%3E%3C/svg%3E") !important; + background-repeat: no-repeat !important; + background-position: 13px center !important; +} + +/* Page size */ +.filtered-list-toolbar .page-size-selector select { + height: var(--vel-ctl-h); + font-weight: 500; + border: 0 !important; +} + +/* Zoom slider: hairline track, light knob */ +.filtered-list-toolbar .zoom-slider-container { + margin-left: 4px !important; +} +input[type="range"].zoom-slider { + -webkit-appearance: none; + appearance: none; + background: transparent !important; + width: 70px; + max-width: 70px; +} +input[type="range"].zoom-slider::-webkit-slider-runnable-track { + height: 3px; + border-radius: 2px; + background: var(--vel-bg3) !important; +} +input[type="range"].zoom-slider::-webkit-slider-thumb { + -webkit-appearance: none; + width: 13px; + height: 13px; + margin-top: -5px; + border-radius: 50%; + background: var(--vel-t1) !important; + border: 0; +} +input[type="range"].zoom-slider::-moz-range-track { + height: 3px; + border-radius: 2px; + background: var(--vel-bg3) !important; +} +input[type="range"].zoom-slider::-moz-range-progress { + height: 3px; + border-radius: 2px; + background: var(--vel-acc); +} +input[type="range"].zoom-slider::-moz-range-thumb { + width: 13px; + height: 13px; + border-radius: 50%; + background: var(--vel-t1) !important; + border: 0; +} + +/* Filter-sidebar toggle */ +.sidebar-toggle-button-container .sidebar-toggle-button { + width: var(--vel-ctl-h); + height: var(--vel-ctl-h); + padding: 0 !important; + margin-left: 0 !important; + border: 0 !important; + border-radius: var(--vel-r-ctl) !important; + background-color: var(--vel-bg2) !important; + color: var(--vel-t2) !important; + opacity: 1 !important; + top: calc(48.75px + 12px) !important; + display: grid; + place-items: center; +} +.sidebar-toggle-button-container .sidebar-toggle-button:hover { + color: var(--vel-t1) !important; + background-color: var(--vel-bg3) !important; +} + +/* Selection toolbar: sticky over the grid, so it needs a solid backing */ +.item-list-container .filtered-list-toolbar.has-selection { + background-color: var(--vel-bg0) !important; + border: 1px solid var(--vel-line); + border-radius: var(--vel-r-card); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); + padding: 6px 8px !important; +} +.filtered-list-toolbar.has-selection .selected-items-info, +.filtered-list-toolbar.has-selection .selected-items-info span { + color: var(--vel-acc) !important; + font-weight: 600; +} +.filtered-list-toolbar .btn.btn-danger, +.filtered-list-toolbar .btn-group > .btn.btn-danger { + background-color: var(--vel-danger) !important; + color: #fff !important; +} + +/* ---------- Pagination ---------- */ +.pagination-index-container { + margin-top: 10px; + display: flex; + flex-direction: column; + align-items: center; +} +.pagination.btn-group { + width: auto !important; + flex: none !important; + background-color: var(--vel-bg2); + border-radius: var(--vel-r-ctl); + padding: 3px; + gap: 2px; + margin-bottom: 0 !important; + box-shadow: none !important; +} +.pagination .btn, +.pagination .page-count-container .btn { + background-color: transparent !important; + border: 0 !important; + border-radius: var(--vel-r-in) !important; + color: var(--vel-t2) !important; + height: 26px; + min-width: 28px; + padding: 0 8px !important; + font-size: 12px; + font-weight: 500; + display: inline-flex; + align-items: center; + justify-content: center; +} +.pagination .btn:hover:not(:disabled) { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; +} +.pagination .btn:disabled { + color: var(--vel-t3) !important; + opacity: 1; +} +.pagination .page-count { + color: var(--vel-t1) !important; + padding: 0 4px 0 10px !important; +} +.pagination .btn.active, +.pagination .btn-secondary.active { + background-color: var(--vel-bg3) !important; + color: var(--vel-t1) !important; +} +.pagination-footer .pagination.btn-group { + box-shadow: var(--vel-shadow-pop) !important; + border: 1px solid var(--vel-line); +} + +/* "1–40 of 6,715 · 3M 1W 3D · 7.9 TiB" */ +.paginationIndex { + display: block !important; + text-align: center; + margin: 8px 0 0 !important; + font-size: 11px !important; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--vel-t3) !important; +} +.paginationIndex br { + display: none; +} +.paginationIndex .scenes-stats, +.paginationIndex .images-stats { + font-size: 0; + color: var(--vel-t3); +} +.paginationIndex .scenes-stats > span, +.paginationIndex .images-stats > span { + font-size: 11px; +} +.paginationIndex .scenes-stats > span::before, +.paginationIndex .images-stats > span::before { + content: " · "; +} + +/* ---------- Filter sidebar ---------- */ +.sidebar-pane .sidebar, +.sidebar .sidebar-footer, +.sidebar-toolbar { + background-color: var(--vel-bg1) !important; +} +.sidebar-pane .sidebar { + border-right: 1px solid var(--vel-line); + padding: 12px 12px 0 !important; +} +.sidebar .sidebar-section, +.sidebar .sidebar-list-filter { + border: 0 !important; +} +.sidebar .collapse-button, +.sidebar .sidebar-section-header, +.sidebar .btn.minimal { + color: var(--vel-t1) !important; + font-size: 13px; + font-weight: 500; + border-radius: 8px !important; +} +.sidebar .collapse-button:hover { + background-color: var(--vel-bg2) !important; +} +.sidebar .collapse-button svg { + color: var(--vel-t3); +} + +/* Tables (list view, package manager) */ +.table-list table thead, +.package-manager table thead { + background-color: var(--vel-bg0) !important; +} +#tasks-panel .tasks-panel-queue { + background-color: var(--vel-bg0) !important; +} + +/* ---------- Rows under the toolbar: filter chips, pagination, count ---------- + One 10px rhythm between toolbar, chips, pagination and grid. On wide + screens the result count leaves its own line and sits right-aligned on the + first row under the toolbar (the filter chips if any, else pagination). */ +.sidebar-pane-content > .filter-tags { + margin: 10px 0 0 !important; + padding: 0 16px; + justify-content: center; +} +.sidebar-pane-content > .pagination-index-container { + margin-top: 10px !important; +} +.sidebar-pane-content > .pagination-index-container:not(:has(.pagination)) { + margin-top: 0 !important; +} +.row.justify-content-center:has(> .grid-card) { + padding-top: 10px !important; +} +@media (min-width: 1200px) { + .sidebar-pane-content { + position: relative; + } + .sidebar-pane-content > .pagination-index-container > .paginationIndex { + position: absolute; + right: 16px; + top: 49px; /* toolbar bottom (39px) + the 10px gap */ + height: 32px; + margin: 0 !important; + display: flex !important; + align-items: center; + white-space: nowrap; + } + /* keep centred chips clear of the count on the right */ + .sidebar-pane-content > .filter-tags { + padding: 0 190px; + } + /* nothing else on the row: hold the space so the grid doesn't slide under the count */ + .sidebar-pane-content:not(:has(> .filter-tags)) > .pagination-index-container:not(:has(.pagination)) { + min-height: 32px; + margin-top: 10px !important; + } +} +@media (min-width: 1200px) { + /* on the chip row, match the chips' height so the text centres on them */ + .sidebar-pane-content:has(> .filter-tags) > .pagination-index-container > .paginationIndex { + height: 24px; + } +} +/* flex grids (studios, tags, performers) carry a 6px card margin; trim the + row padding so every grid starts 10px below the row above */ +.row.justify-content-center:has(> .grid-card:not(.scene-card)) { + padding-top: 4px !important; +} diff --git a/themes/Theme-Velour/tokens.css b/themes/Theme-Velour/tokens.css new file mode 100644 index 00000000..bcc10eae --- /dev/null +++ b/themes/Theme-Velour/tokens.css @@ -0,0 +1,140 @@ +/* Velour: a velvet lounge. Deep plum that reads as black until lit; dusty + rose for actions, champagne for flourishes; italic serif titles over a + quiet sans. Framed 16:9 cards. + + Fonts are self-hosted (assets/fonts, OFL) so pages make no external + requests. The yml maps the plugin's assets/ folder to + /plugin/Theme-Velour/assets/; font URLs are relative to the stylesheet. */ + +@font-face { + font-family: "Outfit"; + font-style: normal; + font-weight: 400 600; + font-display: swap; + src: url("assets/fonts/Outfit-var.woff2") format("woff2"); +} +@font-face { + font-family: "Instrument Serif"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("assets/fonts/InstrumentSerif-400.woff2") format("woff2"); +} +@font-face { + font-family: "Instrument Serif"; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("assets/fonts/InstrumentSerif-400i.woff2") format("woff2"); +} + +:root { + /* Surfaces, darkest to lightest */ + --vel-bg0: #17121a; + --vel-bg1: #1f1922; + --vel-bg2: #28212c; + --vel-bg3: #352b3a; + --vel-bg4: #413546; + --vel-line: rgba(255, 255, 255, 0.07); + --vel-line-strong: rgba(255, 255, 255, 0.12); + + /* Text */ + --vel-t1: #f6eef0; + --vel-t2: #b9a9b1; + --vel-t3: #7f707a; + + /* Accent: dusty rose for actions, champagne for flourishes */ + --vel-acc2: #d9b36b; + --vel-acc: #d97a8c; + --vel-acc-hover: #e48d9d; + --vel-acc-ink: #2a0d14; + --vel-acc-soft: rgba(217, 122, 140, 0.16); + --vel-danger: #c9574f; + --vel-rating: #d97a8c; + + /* Type */ + --vel-font-body: "Outfit", system-ui, -apple-system, "Segoe UI", sans-serif; + --vel-font-title: "Instrument Serif", Georgia, "Times New Roman", serif; + --vel-title-style: italic; + --vel-title-card: 19px; + --vel-title-page: 34px; + --vel-title-lh: 1.1; + + /* Shape */ + --vel-r-ctl: 10px; /* buttons, inputs, control groups */ + --vel-r-in: 7px; /* segments inside a control group */ + --vel-r-card: 14px; + --vel-r-panel: 14px; + --vel-r-chip: 6px; + --vel-ctl-h: 34px; + + /* Depth and motion */ + --vel-shadow-pop: 0 16px 40px rgba(0, 0, 0, 0.55); + --vel-glow: 0 10px 28px rgba(217, 122, 140, 0.16); + --vel-ring: 0 0 0 2px var(--vel-acc); + --vel-ease: cubic-bezier(0.2, 0.8, 0.2, 1); + --vel-media: repeating-linear-gradient(135deg, #2c242f 0 8px, #261f29 8px 16px); +} + +html, +body { + background-color: var(--vel-bg0) !important; + color: var(--vel-t1); + font-family: var(--vel-font-body); + -webkit-font-smoothing: antialiased; +} + +body { + font-size: 14px; + line-height: 1.45; +} + +a { + color: var(--vel-t1); +} +a:hover { + color: #fff; +} + +h1, h2, h3, h4, +.card-section-title, +.modal-title { + font-family: var(--vel-font-title); + font-style: var(--vel-title-style); + font-weight: 400; + letter-spacing: 0; +} + +::selection { + background: var(--vel-acc-soft); +} + +/* Quiet scrollbars */ +* { + scrollbar-color: var(--vel-bg3) transparent; + scrollbar-width: thin; +} +::-webkit-scrollbar { + width: 10px; + height: 10px; +} +::-webkit-scrollbar-track { + background: transparent; +} +::-webkit-scrollbar-thumb { + background: var(--vel-bg3); + border: 3px solid var(--vel-bg0); + border-radius: 999px; +} + +:focus-visible { + outline: 2px solid var(--vel-acc) !important; + outline-offset: 2px; +} + +.text-muted { + color: var(--vel-t3) !important; +} +hr { + border-color: var(--vel-line); +}