mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Styling
This commit is contained in:
@@ -15,8 +15,6 @@ import Studios from "./components/Studios/Studios";
|
|||||||
import Tags from "./components/Tags/Tags";
|
import Tags from "./components/Tags/Tags";
|
||||||
import { SceneFilenameParser } from "./components/scenes/SceneFilenameParser";
|
import { SceneFilenameParser } from "./components/scenes/SceneFilenameParser";
|
||||||
|
|
||||||
import "bootstrap/dist/css/bootstrap.min.css";
|
|
||||||
|
|
||||||
library.add(fas);
|
library.add(fas);
|
||||||
|
|
||||||
export const App: React.FC = () => (
|
export const App: React.FC = () => (
|
||||||
|
|||||||
22
ui/v2.5/src/components/Shared/LoadingIndicator.tsx
Normal file
22
ui/v2.5/src/components/Shared/LoadingIndicator.tsx
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Spinner } from 'react-bootstrap';
|
||||||
|
|
||||||
|
interface LoadingProps {
|
||||||
|
message: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CLASSNAME = 'LoadingIndicator';
|
||||||
|
const CLASSNAME_MESSAGE = `${CLASSNAME}-message`;
|
||||||
|
|
||||||
|
const LoadingIndicator: React.FC<LoadingProps> = ({ message }) => (
|
||||||
|
<div className={CLASSNAME}>
|
||||||
|
<Spinner animation="border" role="status">
|
||||||
|
<span className="sr-only">Loading...</span>
|
||||||
|
</Spinner>
|
||||||
|
<h4 className={CLASSNAME_MESSAGE}>
|
||||||
|
{ message }
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default LoadingIndicator;
|
||||||
@@ -14,3 +14,4 @@ export { DetailsEditNavbar } from "./DetailsEditNavbar";
|
|||||||
export { DurationInput } from "./DurationInput";
|
export { DurationInput } from "./DurationInput";
|
||||||
export { TagLink } from "./TagLink";
|
export { TagLink } from "./TagLink";
|
||||||
export { HoverPopover } from "./HoverPopover";
|
export { HoverPopover } from "./HoverPopover";
|
||||||
|
export { default as LoadingIndicator } from './LoadingIndicator';
|
||||||
|
|||||||
17
ui/v2.5/src/components/Shared/styles.scss
Normal file
17
ui/v2.5/src/components/Shared/styles.scss
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
.LoadingIndicator {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 70vh;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&-message {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner-border {
|
||||||
|
height: 3rem;
|
||||||
|
width: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,63 +1,52 @@
|
|||||||
import { Spinner } from "react-bootstrap";
|
import React from "react";
|
||||||
import React, { FunctionComponent } from "react";
|
import { StashService } from "src/core/StashService";
|
||||||
import { StashService } from "../core/StashService";
|
import { LoadingIndicator } from "src/components/Shared";
|
||||||
|
|
||||||
export const Stats: FunctionComponent = () => {
|
export const Stats: React.FC = () => {
|
||||||
const { data, error, loading } = StashService.useStats();
|
const { data, error, loading } = StashService.useStats();
|
||||||
|
|
||||||
function renderStats() {
|
if (loading || !data)
|
||||||
if (!data || !data.stats) {
|
return <LoadingIndicator message="Loading..." />
|
||||||
return;
|
|
||||||
}
|
if (error)
|
||||||
|
return <span>error.message</span> ;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav id="details-container" className="level">
|
<div className="w-75 m-auto">
|
||||||
<div className="level-item has-text-centered">
|
<nav className="w-75 m-auto d-flex flex-row">
|
||||||
|
<div className="flex-grow-1">
|
||||||
<div>
|
<div>
|
||||||
<p className="heading">Scenes</p>
|
<p className="heading">Scenes</p>
|
||||||
<p className="title">{data.stats.scene_count}</p>
|
<p className="title">{data.stats.scene_count}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="level-item has-text-centered">
|
<div className="flex-grow-1">
|
||||||
<div>
|
<div>
|
||||||
<p className="heading">Galleries</p>
|
<p className="heading">Galleries</p>
|
||||||
<p className="title">{data.stats.gallery_count}</p>
|
<p className="title">{data.stats.gallery_count}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="level-item has-text-centered">
|
<div className="flex-grow-1">
|
||||||
<div>
|
<div>
|
||||||
<p className="heading">Performers</p>
|
<p className="heading">Performers</p>
|
||||||
<p className="title">{data.stats.performer_count}</p>
|
<p className="title">{data.stats.performer_count}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="level-item has-text-centered">
|
<div className="flex-grow-1">
|
||||||
<div>
|
<div>
|
||||||
<p className="heading">Studios</p>
|
<p className="heading">Studios</p>
|
||||||
<p className="title">{data.stats.studio_count}</p>
|
<p className="title">{data.stats.studio_count}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="level-item has-text-centered">
|
<div className="flex-grow-1">
|
||||||
<div>
|
<div>
|
||||||
<p className="heading">Tags</p>
|
<p className="heading">Tags</p>
|
||||||
<p className="title">{data.stats.tag_count}</p>
|
<p className="title">{data.stats.tag_count}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
<h5>Notes</h5>
|
||||||
<div id="details-container">
|
|
||||||
{!data || loading ? (
|
|
||||||
<Spinner animation="border" role="status" size="sm">
|
|
||||||
<span className="sr-only">Loading...</span>
|
|
||||||
</Spinner>
|
|
||||||
) : (
|
|
||||||
undefined
|
|
||||||
)}
|
|
||||||
{error ? <span>error.message</span> : undefined}
|
|
||||||
{renderStats()}
|
|
||||||
|
|
||||||
<h3>Notes</h3>
|
|
||||||
<pre>
|
<pre>
|
||||||
{`
|
{`
|
||||||
This is still an early version, some things are still a work in progress.
|
This is still an early version, some things are still a work in progress.
|
||||||
|
|||||||
@@ -209,9 +209,7 @@ export const ListFilter: React.FC<IListFilterProps> = (
|
|||||||
return (
|
return (
|
||||||
<Dropdown>
|
<Dropdown>
|
||||||
<Dropdown.Toggle variant="secondary" id="more-menu">
|
<Dropdown.Toggle variant="secondary" id="more-menu">
|
||||||
<Button>
|
|
||||||
<Icon icon="ellipsis-h" />
|
<Icon icon="ellipsis-h" />
|
||||||
</Button>
|
|
||||||
</Dropdown.Toggle>
|
</Dropdown.Toggle>
|
||||||
<Dropdown.Menu>{options}</Dropdown.Menu>
|
<Dropdown.Menu>{options}</Dropdown.Menu>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
@@ -245,12 +243,13 @@ export const ListFilter: React.FC<IListFilterProps> = (
|
|||||||
function render() {
|
function render() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="filter-container">
|
<div className="d-flex justify-content-center m-auto">
|
||||||
<Form.Control
|
<Form.Control
|
||||||
placeholder="Search..."
|
placeholder="Search..."
|
||||||
value={props.filter.searchTerm}
|
value={props.filter.searchTerm}
|
||||||
onChange={onChangeQuery}
|
onChange={onChangeQuery}
|
||||||
className="filter-item"
|
className="filter-item"
|
||||||
|
style={{ width: 'inherit' }}
|
||||||
/>
|
/>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
as="select"
|
as="select"
|
||||||
@@ -265,7 +264,7 @@ export const ListFilter: React.FC<IListFilterProps> = (
|
|||||||
<ButtonGroup className="filter-item">
|
<ButtonGroup className="filter-item">
|
||||||
<Dropdown>
|
<Dropdown>
|
||||||
<Dropdown.Toggle variant="secondary" id="more-menu">
|
<Dropdown.Toggle variant="secondary" id="more-menu">
|
||||||
<Button>{props.filter.sortBy}</Button>
|
{props.filter.sortBy}
|
||||||
</Dropdown.Toggle>
|
</Dropdown.Toggle>
|
||||||
<Dropdown.Menu>{renderSortByOptions()}</Dropdown.Menu>
|
<Dropdown.Menu>{renderSortByOptions()}</Dropdown.Menu>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export const PerformerCard: React.FC<IPerformerCardProps> = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className="col-3">
|
<Card className="grid-item">
|
||||||
<Link
|
<Link
|
||||||
to={`/performers/${props.performer.id}`}
|
to={`/performers/${props.performer.id}`}
|
||||||
className="performer previewable image"
|
className="performer previewable image"
|
||||||
@@ -34,15 +34,14 @@ export const PerformerCard: React.FC<IPerformerCardProps> = (
|
|||||||
{maybeRenderFavoriteBanner()}
|
{maybeRenderFavoriteBanner()}
|
||||||
</Link>
|
</Link>
|
||||||
<div className="card-section">
|
<div className="card-section">
|
||||||
<h4 className="text-truncate">{props.performer.name}</h4>
|
<h5 className="text-truncate">{props.performer.name}</h5>
|
||||||
{age !== 0 ? <div>{ageString}</div> : ""}
|
{age !== 0 ? <div className="text-muted">{ageString}</div> : ""}
|
||||||
<span>
|
<div className="text-muted">Stars in {props.performer.scene_count}{" "}
|
||||||
Stars in {props.performer.scene_count}{" "}
|
|
||||||
<Link to={NavUtils.makePerformerScenesUrl(props.performer)}>
|
<Link to={NavUtils.makePerformerScenesUrl(props.performer)}>
|
||||||
scenes
|
scenes
|
||||||
</Link>
|
</Link>
|
||||||
.
|
.
|
||||||
</span>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
@import "~normalize.css";
|
@import "styles/theme";
|
||||||
|
|
||||||
@import "styles/form/grid";
|
@import "styles/form/grid";
|
||||||
|
|
||||||
@import "styles/shared/details";
|
@import "styles/shared/details";
|
||||||
@@ -583,3 +582,8 @@ span.block {
|
|||||||
.scrubber-button:hover {
|
.scrubber-button:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* BOOTSTRAP OVERRIDES */
|
||||||
|
.form-control {
|
||||||
|
width: inherit;
|
||||||
|
}
|
||||||
|
|||||||
9
ui/v2.5/src/styles/_theme.scss
Normal file
9
ui/v2.5/src/styles/_theme.scss
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
/* Blueprint dark theme */
|
||||||
|
$text-muted: #bfccd6;
|
||||||
|
$link-color: #48aff0;
|
||||||
|
$link-hover-color: #48aff0;
|
||||||
|
$text-color: f5f8fa;
|
||||||
|
$pre-color: $text-color;
|
||||||
|
|
||||||
|
@import "node_modules/bootstrap/scss/bootstrap";
|
||||||
Reference in New Issue
Block a user