mirror of
https://github.com/stashapp/stash.git
synced 2025-12-10 02:15:30 +01:00
Rename component folders, and prune styles
This commit is contained in:
parent
fd560c2147
commit
c33639d824
50 changed files with 348 additions and 447 deletions
|
|
@ -7,8 +7,8 @@ import { ErrorBoundary } from "./components/ErrorBoundary";
|
|||
import Galleries from "./components/Galleries/Galleries";
|
||||
import { MainNavbar } from "./components/MainNavbar";
|
||||
import { PageNotFound } from "./components/PageNotFound";
|
||||
import Performers from "./components/performers/performers";
|
||||
import Scenes from "./components/scenes/scenes";
|
||||
import Performers from "./components/Performers/Performers";
|
||||
import Scenes from "./components/Scenes/Scenes";
|
||||
import { Settings } from "./components/Settings/Settings";
|
||||
import { Stats } from "./components/Stats";
|
||||
import Studios from "./components/Studios/Studios";
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ export const GalleryList: React.FC = () => {
|
|||
}
|
||||
if (filter.displayMode === DisplayMode.List) {
|
||||
return (
|
||||
<Table className="m-auto">
|
||||
<Table className="col col-sm-6 mx-auto">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Preview</th>
|
||||
|
|
|
|||
7
ui/v2.5/src/components/Galleries/styles.scss
Normal file
7
ui/v2.5/src/components/Galleries/styles.scss
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
/* stylelint-disable selector-class-pattern */
|
||||
.react-photo-gallery--gallery {
|
||||
img {
|
||||
object-fit: contain;
|
||||
}
|
||||
}
|
||||
/* stylelint-enable selector-class-pattern */
|
||||
|
|
@ -2,7 +2,7 @@ import React from "react";
|
|||
import * as GQL from "src/core/generated-graphql";
|
||||
import { PerformersCriterion } from "src/models/list-filter/criteria/performers";
|
||||
import { ListFilterModel } from "src/models/list-filter/filter";
|
||||
import { SceneList } from "../../scenes/SceneList";
|
||||
import { SceneList } from "src/components/Scenes/SceneList";
|
||||
|
||||
interface IPerformerDetailsProps {
|
||||
performer: Partial<GQL.PerformerDataFragment>;
|
||||
|
|
@ -1,17 +1,4 @@
|
|||
#performer-details {
|
||||
td {
|
||||
padding: 2px 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
td:first-child {
|
||||
min-width: 10rem;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.scrape-url-button {
|
||||
color: $text-color;
|
||||
float: right;
|
||||
|
|
@ -28,7 +15,7 @@
|
|||
margin: 10px auto;
|
||||
overflow: hidden;
|
||||
|
||||
.image-container img {
|
||||
.image-container .performer {
|
||||
max-height: 960px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@ import {
|
|||
} from "src/components/Shared";
|
||||
import { TextUtils } from "src/utils";
|
||||
import { useToast } from "src/hooks";
|
||||
import { Pagination } from "../list/Pagination";
|
||||
import { Pagination } from "src/components/List/Pagination";
|
||||
import { IParserInput, ParserInput } from "./ParserInput";
|
||||
import { ParserField } from "./ParserField";
|
||||
|
||||
|
|
@ -513,7 +513,7 @@ export const SceneFilenameParser: React.FC = () => {
|
|||
const ids = items.map(i => i.id);
|
||||
onChangeHandler(ids);
|
||||
}}
|
||||
initialIds={props.parserResult.value}
|
||||
ids={props.parserResult.value}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
@ -591,7 +591,7 @@ export const SceneFilenameParser: React.FC = () => {
|
|||
|
||||
return (
|
||||
<tr className="scene-parser-row">
|
||||
<td className="text-left">{props.scene.filename}</td>
|
||||
<td className="text-left parser-field-filename">{props.scene.filename}</td>
|
||||
<SceneParserField
|
||||
key="title"
|
||||
fieldName="Title"
|
||||
|
|
@ -688,14 +688,14 @@ export const SceneFilenameParser: React.FC = () => {
|
|||
|
||||
return (
|
||||
<>
|
||||
<td className="w-15">
|
||||
<th className="w-15">
|
||||
<Form.Check
|
||||
checked={allSet}
|
||||
onChange={() => {
|
||||
onAllSet(!allSet);
|
||||
}}
|
||||
/>
|
||||
</td>
|
||||
</th>
|
||||
<th>{fieldName}</th>
|
||||
</>
|
||||
);
|
||||
|
|
@ -708,50 +708,48 @@ export const SceneFilenameParser: React.FC = () => {
|
|||
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
<div className="scene-parser-results">
|
||||
<Table>
|
||||
<thead>
|
||||
<tr className="scene-parser-row">
|
||||
<th className="w-25">Filename</th>
|
||||
{renderHeader("Title", allTitleSet, onSelectAllTitleSet)}
|
||||
{renderHeader("Date", allDateSet, onSelectAllDateSet)}
|
||||
{renderHeader(
|
||||
"Performers",
|
||||
allPerformerSet,
|
||||
onSelectAllPerformerSet
|
||||
)}
|
||||
{renderHeader("Tags", allTagSet, onSelectAllTagSet)}
|
||||
{renderHeader("Studio", allStudioSet, onSelectAllStudioSet)}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{parserResult.map(scene => (
|
||||
<SceneParserRow
|
||||
scene={scene}
|
||||
key={scene.id}
|
||||
onChange={changedScene => onChange(scene, changedScene)}
|
||||
/>
|
||||
))}
|
||||
</tbody>
|
||||
</Table>
|
||||
</div>
|
||||
<Pagination
|
||||
currentPage={parserInput.page}
|
||||
itemsPerPage={parserInput.pageSize}
|
||||
totalItems={totalItems}
|
||||
onChangePage={page => onPageChanged(page)}
|
||||
/>
|
||||
<Button variant="primary" onClick={onApply}>
|
||||
Apply
|
||||
</Button>
|
||||
<div className="scene-parser-results">
|
||||
<Table>
|
||||
<thead>
|
||||
<tr className="scene-parser-row">
|
||||
<th className="w-25">Filename</th>
|
||||
{renderHeader("Title", allTitleSet, onSelectAllTitleSet)}
|
||||
{renderHeader("Date", allDateSet, onSelectAllDateSet)}
|
||||
{renderHeader(
|
||||
"Performers",
|
||||
allPerformerSet,
|
||||
onSelectAllPerformerSet
|
||||
)}
|
||||
{renderHeader("Tags", allTagSet, onSelectAllTagSet)}
|
||||
{renderHeader("Studio", allStudioSet, onSelectAllStudioSet)}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{parserResult.map(scene => (
|
||||
<SceneParserRow
|
||||
scene={scene}
|
||||
key={scene.id}
|
||||
onChange={changedScene => onChange(scene, changedScene)}
|
||||
/>
|
||||
))}
|
||||
</tbody>
|
||||
</Table>
|
||||
</div>
|
||||
<Pagination
|
||||
currentPage={parserInput.page}
|
||||
itemsPerPage={parserInput.pageSize}
|
||||
totalItems={totalItems}
|
||||
onChangePage={page => onPageChanged(page)}
|
||||
/>
|
||||
<Button variant="primary" onClick={onApply}>
|
||||
Apply
|
||||
</Button>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Card id="parser-container">
|
||||
<Card id="parser-container" className="col col-sm-9 mx-auto">
|
||||
<h4>Scene Filename Parser</h4>
|
||||
<ParserInput
|
||||
input={parserInput}
|
||||
|
|
|
|||
37
ui/v2.5/src/components/SceneFilenameParser/styles.scss
Normal file
37
ui/v2.5/src/components/SceneFilenameParser/styles.scss
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
.scene-parser-results {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.scene-parser-row {
|
||||
.parser-field-filename {
|
||||
width: 10ch;
|
||||
}
|
||||
|
||||
.parser-field-title {
|
||||
width: 40ch;
|
||||
}
|
||||
|
||||
.parser-field-date {
|
||||
width: 13ch;
|
||||
}
|
||||
|
||||
.parser-field-performers {
|
||||
width: 20ch;
|
||||
}
|
||||
|
||||
.parser-field-tags {
|
||||
width: 20ch;
|
||||
}
|
||||
|
||||
.parser-field-studio {
|
||||
width: 15ch;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
min-width: 10ch;
|
||||
}
|
||||
|
||||
.form-control + .form-control {
|
||||
margin-top: .5rem;
|
||||
}
|
||||
}
|
||||
|
|
@ -205,7 +205,7 @@ export class ScenePlayerImpl extends React.Component<
|
|||
|
||||
public render() {
|
||||
return (
|
||||
<HotKeys keyMap={KeyMap} handlers={this.KeyHandlers} className="row">
|
||||
<HotKeys keyMap={KeyMap} handlers={this.KeyHandlers} className="row scene-player">
|
||||
<div
|
||||
id="jwplayer-container"
|
||||
className="w-100 col-sm-9 m-sm-auto no-gutter"
|
||||
|
|
@ -346,7 +346,7 @@ export const ScenePlayerScrubber: React.FC<IScenePlayerScrubberProps> = (
|
|||
style={getStyleForSprite(index)}
|
||||
{...dataAttrs}
|
||||
>
|
||||
<span>
|
||||
<span className="scrubber-item-time">
|
||||
{TextUtils.secondsToTimestamp(spriteItem.start)} -{" "}
|
||||
{TextUtils.secondsToTimestamp(spriteItem.end)}
|
||||
</span>
|
||||
1
ui/v2.5/src/components/ScenePlayer/index.ts
Normal file
1
ui/v2.5/src/components/ScenePlayer/index.ts
Normal file
|
|
@ -0,0 +1 @@
|
|||
export { ScenePlayer } from './ScenePlayer';
|
||||
|
|
@ -1,3 +1,7 @@
|
|||
.scene-player:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.scrubber-wrapper {
|
||||
margin: 5px 0;
|
||||
overflow: hidden;
|
||||
|
|
@ -13,8 +17,9 @@
|
|||
}
|
||||
|
||||
.scrubber-button {
|
||||
background-color: transparent;
|
||||
border: 1px solid #555;
|
||||
color: #fff;
|
||||
color: $link-color;
|
||||
cursor: pointer;
|
||||
font-size: 20px;
|
||||
font-weight: 800;
|
||||
|
|
@ -35,18 +40,10 @@
|
|||
position: relative;
|
||||
-webkit-user-select: none;
|
||||
width: 96%;
|
||||
}
|
||||
|
||||
.scrubber-content.dragging {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.scrubber-tags-background {
|
||||
background-color: #555;
|
||||
height: 20px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
&.dragging {
|
||||
cursor: grabbing;
|
||||
}
|
||||
}
|
||||
|
||||
#scrubber-position-indicator {
|
||||
|
|
@ -85,6 +82,14 @@
|
|||
height: 20px;
|
||||
margin-bottom: 10px;
|
||||
position: relative;
|
||||
|
||||
&-background {
|
||||
background-color: #555;
|
||||
height: 20px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.scrubber-tag {
|
||||
|
|
@ -94,22 +99,22 @@
|
|||
padding: 0 10px;
|
||||
position: absolute;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.scrubber-tag:hover {
|
||||
background-color: #444;
|
||||
z-index: 1;
|
||||
}
|
||||
&:hover {
|
||||
background-color: #444;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.scrubber-tag::after {
|
||||
border-left: solid 5px transparent;
|
||||
border-right: solid 5px transparent;
|
||||
border-top: solid 5px #000;
|
||||
bottom: -5px;
|
||||
content: "";
|
||||
left: 50%;
|
||||
margin-left: -5px;
|
||||
position: absolute;
|
||||
&::after {
|
||||
border-left: solid 5px transparent;
|
||||
border-right: solid 5px transparent;
|
||||
border-top: solid 5px #000;
|
||||
bottom: -5px;
|
||||
content: "";
|
||||
left: 50%;
|
||||
margin-left: -5px;
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
||||
.scrubber-item {
|
||||
|
|
@ -121,10 +126,10 @@
|
|||
position: absolute;
|
||||
text-align: center;
|
||||
text-shadow: 1px 1px black;
|
||||
}
|
||||
|
||||
.scrubber-item span {
|
||||
align-self: flex-end;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
&-time {
|
||||
align-self: flex-end;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
|
@ -182,7 +182,7 @@ export const SceneCard: React.FC<ISceneCardProps> = (
|
|||
>
|
||||
<Form.Control
|
||||
type="checkbox"
|
||||
className="card-select d-none d-sm-block"
|
||||
className="scene-card-check d-none d-sm-block"
|
||||
checked={props.selected}
|
||||
onChange={() => props.onSelectedChanged(!props.selected, shiftKey)}
|
||||
onClick={(event: React.MouseEvent<HTMLInputElement, MouseEvent>) => {
|
||||
|
|
@ -6,7 +6,7 @@ import * as GQL from "src/core/generated-graphql";
|
|||
import { StashService } from "src/core/StashService";
|
||||
import { GalleryViewer } from "src/components/Galleries/GalleryViewer";
|
||||
import { LoadingIndicator } from "src/components/Shared";
|
||||
import { ScenePlayer } from "src/components/scenes/ScenePlayer/ScenePlayer";
|
||||
import { ScenePlayer } from "src/components/ScenePlayer";
|
||||
import { ScenePerformerPanel } from "./ScenePerformerPanel";
|
||||
import { SceneMarkersPanel } from "./SceneMarkersPanel";
|
||||
import { SceneFileInfoPanel } from "./SceneFileInfoPanel";
|
||||
|
|
@ -50,7 +50,7 @@ export const Scene: React.FC = () => {
|
|||
return (
|
||||
<>
|
||||
<ScenePlayer scene={scene} timestamp={timestamp} autoplay={autoplay} />
|
||||
<div id="details-container" className="col col-sm-9 m-sm-auto">
|
||||
<div id="scene-details-container" className="col col-sm-9 m-sm-auto">
|
||||
<Tabs id="scene-tabs" mountOnEnter>
|
||||
<Tab eventKey="scene-details-panel" title="Details">
|
||||
<SceneDetailPanel scene={scene} />
|
||||
|
|
@ -49,12 +49,12 @@ export const SceneDetailPanel: React.FC<ISceneDetailProps> = props => {
|
|||
<div className="col-4 offset-2">
|
||||
{props.scene.studio && (
|
||||
<Link
|
||||
className="studio-logo"
|
||||
to={`/studios/${props.scene.studio.id}`}
|
||||
>
|
||||
<img
|
||||
src={props.scene.studio.image_path ?? ""}
|
||||
alt={`${props.scene.studio.name} logo`}
|
||||
className="studio-logo"
|
||||
/>
|
||||
</Link>
|
||||
)}
|
||||
|
|
@ -293,7 +293,7 @@ export const SceneEditPanel: React.FC<IProps> = (props: IProps) => {
|
|||
return (
|
||||
<div className="form-container row">
|
||||
<div className="col-6">
|
||||
<Table id="scene-details">
|
||||
<Table id="scene-edit-details">
|
||||
<tbody>
|
||||
{TableUtils.renderInputGroup({
|
||||
title: "Title",
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import React, { FunctionComponent } from "react";
|
||||
import * as GQL from "src/core/generated-graphql";
|
||||
import { PerformerCard } from "src/components/performers/PerformerCard";
|
||||
import { PerformerCard } from "src/components/Performers/PerformerCard";
|
||||
|
||||
interface IScenePerformerPanelProps {
|
||||
scene: GQL.SceneDataFragment;
|
||||
|
|
@ -55,7 +55,7 @@ export const SceneListTable: React.FC<ISceneListTableProps> = (
|
|||
)
|
||||
|
||||
return (
|
||||
<div className="row justify-content-center table-list">
|
||||
<div className="row table-list col col-lg-8 mx-auto">
|
||||
<Table striped bordered>
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
@ -3,33 +3,22 @@
|
|||
justify-content: center;
|
||||
margin-bottom: 10px;
|
||||
|
||||
button {
|
||||
.btn {
|
||||
padding-bottom: 3px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
svg {
|
||||
.fa-icon {
|
||||
margin-right: 7px;
|
||||
}
|
||||
}
|
||||
|
||||
.row {
|
||||
.scene-card {
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.scene-card-link {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.card-section {
|
||||
margin-bottom: 0;
|
||||
padding: .5rem 1rem 0 1rem;
|
||||
}
|
||||
|
||||
.card-select {
|
||||
.scene-card-check {
|
||||
left: .5rem;
|
||||
margin-top: -12px;
|
||||
opacity: .5;
|
||||
|
|
@ -78,17 +67,15 @@
|
|||
}
|
||||
|
||||
.studio-logo {
|
||||
img {
|
||||
margin-top: 1rem;
|
||||
max-width: 100%;
|
||||
}
|
||||
margin-top: 1rem;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.scene-header {
|
||||
flex-basis: auto;
|
||||
}
|
||||
|
||||
#details-container {
|
||||
#scene-details-container {
|
||||
.tab-content {
|
||||
min-height: 15rem;
|
||||
}
|
||||
|
|
@ -104,12 +91,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
#scene-details {
|
||||
input {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
#details {
|
||||
min-height: 150px;
|
||||
}
|
||||
|
|
@ -147,3 +128,85 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.scene-specs-overlay {
|
||||
bottom: 1rem;
|
||||
color: $text-color;
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
letter-spacing: -.03rem;
|
||||
position: absolute;
|
||||
right: .7rem;
|
||||
text-shadow: 0 0 3px #000;
|
||||
}
|
||||
|
||||
.scene-studio-overlay {
|
||||
display: block;
|
||||
font-weight: 900;
|
||||
height: 10%;
|
||||
max-width: 40%;
|
||||
opacity: .75;
|
||||
position: absolute;
|
||||
right: .7rem;
|
||||
top: .7rem;
|
||||
z-index: 9;
|
||||
|
||||
.image-thumbnail {
|
||||
height: auto;
|
||||
max-height: 50px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: $text-color;
|
||||
display: inline-block;
|
||||
letter-spacing: -.03rem;
|
||||
text-align: right;
|
||||
text-decoration: none;
|
||||
text-shadow: 0 0 3px #000;
|
||||
}
|
||||
}
|
||||
|
||||
.overlay-resolution {
|
||||
font-weight: 900;
|
||||
margin-right: .3rem;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.scene-card {
|
||||
&.card {
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&-link {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.scene-specs-overlay,
|
||||
.rating-banner,
|
||||
.scene-studio-overlay {
|
||||
transition: opacity .5s;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.scene-specs-overlay,
|
||||
.rating-banner,
|
||||
.scene-studio-overlay {
|
||||
opacity: 0;
|
||||
transition: opacity .5s;
|
||||
}
|
||||
|
||||
.scene-studio-overlay:hover {
|
||||
opacity: .75;
|
||||
transition: opacity .5s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.scene-cover {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@ export const Settings: React.FC = () => {
|
|||
const onSelect = (val: string) => history.push(`?tab=${val}`);
|
||||
|
||||
return (
|
||||
<Card id="details-container">
|
||||
<Card className="col col-lg-9 mx-auto">
|
||||
<Tab.Container
|
||||
defaultActiveKey={defaultTab}
|
||||
id="configuration-tabs"
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ interface IIcon {
|
|||
}
|
||||
|
||||
const Icon: React.FC<IIcon> = ({ icon, className, color }) => (
|
||||
<FontAwesomeIcon icon={icon} className={className} color={color} />
|
||||
<FontAwesomeIcon icon={icon} className={`fa-icon ${className}`} color={color} />
|
||||
);
|
||||
|
||||
export default Icon;
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ export const Studio: React.FC = () => {
|
|||
})}
|
||||
>
|
||||
{isNew && <h2>Add Studio</h2>}
|
||||
<img className="logo" alt={name} src={imagePreview} />
|
||||
<img className="logo w-100" alt={name} src={imagePreview} />
|
||||
<Table>
|
||||
<tbody>
|
||||
{TableUtils.renderInputGroup({
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import React from "react";
|
|||
import * as GQL from "src/core/generated-graphql";
|
||||
import { StudiosCriterion } from "src/models/list-filter/criteria/studios";
|
||||
import { ListFilterModel } from "src/models/list-filter/filter";
|
||||
import { SceneList } from "../../scenes/SceneList";
|
||||
import { SceneList } from "src/components/Scenes/SceneList";
|
||||
|
||||
interface IStudioScenesPanel {
|
||||
studio: Partial<GQL.StudioDataFragment>;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
.studio-details {
|
||||
.logo {
|
||||
margin: 4rem 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -103,20 +103,20 @@ export const TagList: React.FC = () => {
|
|||
{tag.name}
|
||||
</Button>
|
||||
<div className="ml-auto">
|
||||
<Button variant="secondary" onClick={() => onAutoTag(tag)}>
|
||||
<Button variant="secondary" className="tag-list-button" onClick={() => onAutoTag(tag)}>
|
||||
Auto Tag
|
||||
</Button>
|
||||
<Button variant="secondary">
|
||||
<Link to={NavUtils.makeTagScenesUrl(tag)}>
|
||||
<Button variant="secondary" className="tag-list-button">
|
||||
<Link to={NavUtils.makeTagScenesUrl(tag)} className="tag-list-anchor">
|
||||
Scenes: {tag.scene_count}
|
||||
</Link>
|
||||
</Button>
|
||||
<Button variant="secondary">
|
||||
<Link to={NavUtils.makeTagSceneMarkersUrl(tag)}>
|
||||
<Button variant="secondary" className="tag-list-button">
|
||||
<Link to={NavUtils.makeTagSceneMarkersUrl(tag)} className="tag-list-anchor">
|
||||
Markers: {tag.scene_marker_count}
|
||||
</Link>
|
||||
</Button>
|
||||
<span>
|
||||
<span className="tag-list-count">
|
||||
Total: {(tag.scene_count || 0) + (tag.scene_marker_count || 0)}
|
||||
</span>
|
||||
<Button variant="danger" onClick={() => setDeletingTag(tag)}>
|
||||
|
|
@ -128,7 +128,7 @@ export const TagList: React.FC = () => {
|
|||
});
|
||||
|
||||
return (
|
||||
<div id="tag-list-container">
|
||||
<div className="col col-sm-8 m-auto">
|
||||
<Button
|
||||
variant="primary"
|
||||
className="mt-2"
|
||||
|
|
|
|||
|
|
@ -1,25 +1,20 @@
|
|||
#tag-list-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin: 0 auto;
|
||||
width: 50vw;
|
||||
.tag-list {
|
||||
&-row {
|
||||
margin: .5rem 0;
|
||||
}
|
||||
|
||||
a,
|
||||
.btn {
|
||||
&-button {
|
||||
margin: 0 .5rem;
|
||||
width: 8rem;
|
||||
}
|
||||
|
||||
&-anchor {
|
||||
color: $text-color;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.tag-list-row {
|
||||
cursor: pointer;
|
||||
margin: 10px;
|
||||
|
||||
.btn {
|
||||
margin: 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.tag-list-row:hover {
|
||||
text-decoration: underline;
|
||||
&-count {
|
||||
display: inline-block;
|
||||
margin: 0 .5rem;
|
||||
min-width: 6rem;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,10 +87,10 @@ export const WallItem: React.FC<IWallItemProps> = (props: IWallItemProps) => {
|
|||
)}`
|
||||
);
|
||||
const thisTags = props.sceneMarker.tags.map(tag => (
|
||||
<span key={tag.id}>{tag.name}</span>
|
||||
<span key={tag.id} className="wall-tag">{tag.name}</span>
|
||||
));
|
||||
thisTags.unshift(
|
||||
<span key={props.sceneMarker.primary_tag.id}>
|
||||
<span key={props.sceneMarker.primary_tag.id} className="wall-tag">
|
||||
{props.sceneMarker.primary_tag.name}
|
||||
</span>
|
||||
);
|
||||
|
|
@ -130,6 +130,7 @@ export const WallItem: React.FC<IWallItemProps> = (props: IWallItemProps) => {
|
|||
<video
|
||||
src={videoPath}
|
||||
poster={screenshotPath}
|
||||
className="scene-wall-video"
|
||||
style={videoHoverHook.isHovering.current ? {} : { display: "none" }}
|
||||
autoPlay
|
||||
loop
|
||||
|
|
@ -137,6 +138,7 @@ export const WallItem: React.FC<IWallItemProps> = (props: IWallItemProps) => {
|
|||
/>
|
||||
<img
|
||||
alt={title}
|
||||
className="scene-wall-image"
|
||||
src={previewPath || screenshotPath}
|
||||
onError={() => previewNotFound()}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -35,10 +35,17 @@
|
|||
z-index: 2;
|
||||
}
|
||||
|
||||
.double-scale img {
|
||||
.double-scale .scene-wall-image {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.scene-wall-video,
|
||||
.scene-wall-image {
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.scene-wall-item-container {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
|
|
@ -49,7 +56,7 @@
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
.scene-wall-item-container video {
|
||||
.scene-wall-item-container .scene-wall-video {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
|
|
@ -69,7 +76,7 @@
|
|||
text-align: center;
|
||||
width: 100%;
|
||||
|
||||
& span {
|
||||
.wall-tag {
|
||||
font-size: 10px;
|
||||
font-weight: 400;
|
||||
line-height: 1;
|
||||
|
|
@ -97,12 +104,5 @@
|
|||
@media (max-width: 576px) {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
video,
|
||||
img {
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16,8 +16,8 @@ import {
|
|||
FindPerformersQueryResult
|
||||
} from "src/core/generated-graphql";
|
||||
import { LoadingIndicator } from "src/components/Shared";
|
||||
import { ListFilter } from "src/components/list/ListFilter";
|
||||
import { Pagination } from "src/components/list/Pagination";
|
||||
import { ListFilter } from "src/components/List/ListFilter";
|
||||
import { Pagination } from "src/components/List/Pagination";
|
||||
import { StashService } from "src/core/StashService";
|
||||
import { Criterion } from "src/models/list-filter/criteria/criterion";
|
||||
import { ListFilterModel } from "src/models/list-filter/filter";
|
||||
|
|
|
|||
|
|
@ -1,21 +1,24 @@
|
|||
@import "styles/theme";
|
||||
@import "styles/range";
|
||||
@import "styles/scrollbars";
|
||||
@import "src/components/Tags/styles.scss";
|
||||
@import "src/components/performers/styles.scss";
|
||||
@import "src/components/list/styles.scss";
|
||||
@import "src/components/Galleries/styles.scss";
|
||||
@import "src/components/List/styles.scss";
|
||||
@import "src/components/Performers/styles.scss";
|
||||
@import "src/components/Scenes/styles.scss";
|
||||
@import "src/components/SceneFilenameParser/styles.scss";
|
||||
@import "src/components/ScenePlayer/styles.scss";
|
||||
@import "src/components/Settings/styles.scss";
|
||||
@import "src/components/Studios/styles.scss";
|
||||
@import "src/components/Shared/styles.scss";
|
||||
@import "src/components/Wall/Wall.scss";
|
||||
@import "src/components/scenes/ScenePlayer/ScenePlayerScrubber.scss";
|
||||
@import "src/components/scenes/styles.scss";
|
||||
@import "src/components/Tags/styles.scss";
|
||||
@import "src/components/Wall/styles.scss";
|
||||
|
||||
body {
|
||||
color: $text-color;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
margin: 0;
|
||||
padding: $pt-navbar-height 0 0 0;
|
||||
padding: 4rem 0 0 0;
|
||||
|
||||
@media (min-width: 600px) {
|
||||
min-width: 845px;
|
||||
|
|
@ -31,11 +34,6 @@ code {
|
|||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.card {
|
||||
margin: 5px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.zoom-0 {
|
||||
width: 15rem;
|
||||
|
|
@ -88,18 +86,13 @@ code {
|
|||
width: 20rem;
|
||||
}
|
||||
|
||||
.filter-item,
|
||||
.operation-item {
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
.edit-button {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.tag-item {
|
||||
background-color: $muted-gray;
|
||||
color: #182026;
|
||||
color: $dark-text;
|
||||
font-size: 12px;
|
||||
font-weight: 400;
|
||||
line-height: 16px;
|
||||
|
|
@ -114,7 +107,7 @@ code {
|
|||
background: none;
|
||||
border: none;
|
||||
bottom: 2px;
|
||||
color: #182026;
|
||||
color: $dark-text;
|
||||
font-size: 12px;
|
||||
line-height: 1rem;
|
||||
margin-left: .5rem;
|
||||
|
|
@ -145,6 +138,11 @@ code {
|
|||
margin: 10px auto;
|
||||
}
|
||||
|
||||
.filter-item,
|
||||
.operation-item {
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
.rating-5 {
|
||||
background: #ff2f39;
|
||||
}
|
||||
|
|
@ -181,180 +179,6 @@ code {
|
|||
transform: rotate(-36deg);
|
||||
}
|
||||
|
||||
.scene-specs-overlay {
|
||||
bottom: 1rem;
|
||||
color: $text-color;
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
letter-spacing: -.03rem;
|
||||
position: absolute;
|
||||
right: .7rem;
|
||||
text-shadow: 0 0 3px #000;
|
||||
}
|
||||
|
||||
.scene-studio-overlay {
|
||||
display: block;
|
||||
font-weight: 900;
|
||||
height: 10%;
|
||||
max-width: 40%;
|
||||
opacity: .75;
|
||||
position: absolute;
|
||||
right: .7rem;
|
||||
top: .7rem;
|
||||
z-index: 9;
|
||||
|
||||
.image-thumbnail {
|
||||
height: auto;
|
||||
max-height: 50px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
a {
|
||||
color: $text-color;
|
||||
display: inline-block;
|
||||
letter-spacing: -.03rem;
|
||||
text-align: right;
|
||||
text-decoration: none;
|
||||
text-shadow: 0 0 3px #000;
|
||||
}
|
||||
}
|
||||
|
||||
.overlay-resolution {
|
||||
font-weight: 900;
|
||||
margin-right: .3rem;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.scene-card {
|
||||
.scene-specs-overlay,
|
||||
.rating-banner,
|
||||
.scene-studio-overlay {
|
||||
transition: opacity .5s;
|
||||
}
|
||||
}
|
||||
|
||||
.scene-card:hover {
|
||||
.scene-specs-overlay,
|
||||
.rating-banner,
|
||||
.scene-studio-overlay {
|
||||
opacity: 0;
|
||||
transition: opacity .5s;
|
||||
}
|
||||
|
||||
.scene-studio-overlay:hover {
|
||||
opacity: .75;
|
||||
transition: opacity .5s;
|
||||
}
|
||||
}
|
||||
|
||||
#jwplayer-container {
|
||||
margin: 10px auto;
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.video-js {
|
||||
height: 90vh;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.pre {
|
||||
white-space: pre-line;
|
||||
}
|
||||
|
||||
/* stylelint-disable selector-class-pattern */
|
||||
.react-photo-gallery--gallery {
|
||||
img {
|
||||
object-fit: contain;
|
||||
}
|
||||
}
|
||||
/* stylelint-enable selector-class-pattern */
|
||||
|
||||
#parser-container {
|
||||
margin: 10px auto;
|
||||
width: 75%;
|
||||
|
||||
.inputs label {
|
||||
width: 12rem;
|
||||
}
|
||||
|
||||
.scene-parser-results {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.scene-parser-row .parser-field-title input {
|
||||
width: 50ch;
|
||||
}
|
||||
|
||||
.scene-parser-row .parser-field-date input {
|
||||
width: 13ch;
|
||||
}
|
||||
|
||||
.scene-parser-row .parser-field-performers input {
|
||||
width: 20ch;
|
||||
}
|
||||
|
||||
.scene-parser-row .parser-field-tags input {
|
||||
width: 20ch;
|
||||
}
|
||||
|
||||
.scene-parser-row .parser-field-studio input {
|
||||
width: 15ch;
|
||||
}
|
||||
|
||||
.scene-parser-row input {
|
||||
min-width: 10ch;
|
||||
}
|
||||
|
||||
.scene-parser-row div:first-child > input {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.aliases-field > label {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.scene-cover {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.collapsible-label {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.label-icon {
|
||||
margin-right: .3rem;
|
||||
vertical-align: middle;
|
||||
|
||||
+ span {
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
.main {
|
||||
color: $text-color;
|
||||
}
|
||||
|
||||
.table {
|
||||
color: $text-color;
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
.table td {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.table-striped tr:nth-child(odd) td {
|
||||
background: rgba(92, 112, 128, .15);
|
||||
}
|
||||
|
||||
.tab-pane {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: #30404d;
|
||||
border-radius: 3px;
|
||||
|
|
@ -374,64 +198,6 @@ code {
|
|||
}
|
||||
}
|
||||
|
||||
.button-link {
|
||||
background-color: transparent;
|
||||
border-width: 0;
|
||||
color: $link-color;
|
||||
cursor: pointer;
|
||||
display: inline;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.button-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.scrubber-button {
|
||||
background-color: transparent;
|
||||
color: $link-color;
|
||||
}
|
||||
|
||||
.scrubber-button:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* BOOTSTRAP OVERRIDES */
|
||||
.form-control {
|
||||
&-plaintext {
|
||||
color: $text-color;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
option {
|
||||
color: black;
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.popover {
|
||||
&-body {
|
||||
.btn {
|
||||
color: $text-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.modal {
|
||||
.modal-body,
|
||||
.modal-footer {
|
||||
background-color: rgb(235, 241, 245);
|
||||
}
|
||||
}
|
||||
|
||||
.image-input {
|
||||
margin-bottom: 0;
|
||||
margin-left: .5rem;
|
||||
|
|
@ -461,21 +227,15 @@ code {
|
|||
}
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
/* stylelint-disable selector-class-pattern */
|
||||
.svg-inline--fa {
|
||||
.fa-icon {
|
||||
margin: 0 .4rem;
|
||||
}
|
||||
|
||||
.btn .svg-inline--fa {
|
||||
.btn .fa-icon {
|
||||
&:last-child:first-child {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
/* stylelint-enable */
|
||||
|
||||
.brand-icon {
|
||||
padding: 3px 6px;
|
||||
|
|
@ -487,7 +247,7 @@ code {
|
|||
|
||||
.top-nav {
|
||||
@media (max-width: 576px) {
|
||||
a {
|
||||
.btn {
|
||||
padding: 6px;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
::selection {
|
||||
background-color: #cce2ff;
|
||||
color: rgba(0, 0, 0, .87);
|
||||
color: $dark-text;
|
||||
}
|
||||
|
||||
/* Form */
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
textarea::selection,
|
||||
input::selection {
|
||||
background-color: rgba(100, 100, 100, .4);
|
||||
color: rgba(0, 0, 0, .87);
|
||||
color: $dark-text;
|
||||
}
|
||||
|
||||
/* Force Simple Scrollbars */
|
||||
|
|
|
|||
|
|
@ -16,11 +16,12 @@ $theme-colors: (
|
|||
$body-bg: #202b33;
|
||||
$text-muted: $muted-gray;
|
||||
$link-color: #48aff0;
|
||||
$link-hover-color: #48aff0;
|
||||
$link-hover-color: $link-color;
|
||||
$text-color: #f5f8fa;
|
||||
$pre-color: $text-color;
|
||||
$navbar-dark-color: rgb(245, 248, 250);
|
||||
$popover-bg: $secondary;
|
||||
$dark-text: #182026;
|
||||
|
||||
@import "node_modules/bootstrap/scss/bootstrap";
|
||||
|
||||
|
|
@ -30,8 +31,6 @@ $sepia1: #63411e;
|
|||
$dark-gray2: #202b33;
|
||||
$dark-gray5: #394b59;
|
||||
|
||||
$pt-navbar-height: 4rem;
|
||||
|
||||
.btn.active:not(.disabled),
|
||||
.btn.active.minimal:not(.disabled) {
|
||||
background-color: rgba(138, 155, 168, .3);
|
||||
|
|
@ -56,6 +55,10 @@ button.minimal {
|
|||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
.dropdown-toggle::after {
|
||||
content: none;
|
||||
}
|
||||
|
|
@ -67,6 +70,7 @@ button.minimal {
|
|||
.nav-tabs {
|
||||
border: none;
|
||||
margin: auto;
|
||||
margin-bottom: .5rem;
|
||||
|
||||
.nav-link {
|
||||
border: none;
|
||||
|
|
@ -78,34 +82,38 @@ button.minimal {
|
|||
color: $link-color;
|
||||
|
||||
&:hover {
|
||||
border-bottom-color: $link-color;
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border-bottom: 2px solid white;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 5px 0;
|
||||
.tab-content {
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
.table-striped tr:nth-child(odd) td {
|
||||
background: rgba(92, 112, 128, .15);
|
||||
}
|
||||
|
||||
.table {
|
||||
border: none;
|
||||
color: $text-color;
|
||||
|
||||
thead {
|
||||
th {
|
||||
border: none;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, .15);
|
||||
border-top: none;
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
a {
|
||||
color: $text-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.table {
|
||||
td {
|
||||
border: none;
|
||||
padding: .25rem .75rem;
|
||||
}
|
||||
}
|
||||
|
|
@ -116,4 +124,43 @@ hr {
|
|||
|
||||
.card {
|
||||
border: none;
|
||||
margin: 5px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
&-plaintext {
|
||||
color: $text-color;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
option {
|
||||
color: black;
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.popover {
|
||||
&-body {
|
||||
.btn {
|
||||
color: $text-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.modal {
|
||||
color: $dark-text;
|
||||
|
||||
.modal-body,
|
||||
.modal-footer {
|
||||
background-color: rgb(235, 241, 245);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue