From 14d72805b3b9f36aa13adb6ec7278ad171fc0cff Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Thu, 31 Oct 2024 16:47:55 -0400 Subject: [PATCH 01/33] style: global pass to improve stylings. --- client/components/LogoutButton.tsx | 2 +- client/components/edit/Breadcrumbs.tsx | 3 +- client/components/edit/CopyPidButton.tsx | 2 +- .../edit/ObjectButtonBar.module.css | 14 + client/components/edit/ObjectButtonBar.tsx | 40 +-- .../components/edit/ObjectStatus.module.css | 22 +- client/components/edit/ObjectStatus.tsx | 29 ++- client/components/edit/children/Child.tsx | 55 ++-- .../edit/children/ChildList.module.css | 50 +++- client/components/edit/children/ChildList.tsx | 78 +++--- client/components/paginate/JobPaginator.tsx | 37 +-- .../components/paginate/PaginatorControls.tsx | 108 ++++---- .../components/shared/Breadcrumbs.module.css | 7 - client/package.json | 1 - client/pages/_app.tsx | 14 +- client/styles/client.css | 201 --------------- client/styles/global.css | 128 +++++++++ client/styles/globals.css | 16 -- client/styles/job-paginator.css | 181 +++++++++++++ client/styles/normalize.css | 2 - client/styles/object-editor.css | 0 client/styles/reset.css | 2 + client/styles/variables.css | 43 +++ client/styles/vendor/colors-tailwindcss.css | 244 ++++++++++++++++++ client/styles/vendor/modern-normalize.css | 3 + 25 files changed, 899 insertions(+), 383 deletions(-) create mode 100644 client/components/edit/ObjectButtonBar.module.css delete mode 100644 client/styles/client.css create mode 100644 client/styles/global.css delete mode 100644 client/styles/globals.css create mode 100644 client/styles/job-paginator.css delete mode 100644 client/styles/normalize.css create mode 100644 client/styles/object-editor.css create mode 100644 client/styles/reset.css create mode 100644 client/styles/variables.css create mode 100644 client/styles/vendor/colors-tailwindcss.css create mode 100644 client/styles/vendor/modern-normalize.css diff --git a/client/components/LogoutButton.tsx b/client/components/LogoutButton.tsx index a5296cbf5..546a65003 100644 --- a/client/components/LogoutButton.tsx +++ b/client/components/LogoutButton.tsx @@ -14,7 +14,7 @@ const LogoutButton = (): React.ReactElement => { }, [token]); return showButton ? (
- + Log Out
diff --git a/client/components/edit/Breadcrumbs.tsx b/client/components/edit/Breadcrumbs.tsx index 5b377c01c..b36a2da51 100644 --- a/client/components/edit/Breadcrumbs.tsx +++ b/client/components/edit/Breadcrumbs.tsx @@ -1,4 +1,3 @@ -import styles from "../shared/Breadcrumbs.module.css"; import React, { useEffect, useState } from "react"; import BasicBreadcrumbs from "../shared/BasicBreadcrumbs"; import { TreeNode, processBreadcrumbData } from "../../util/Breadcrumbs"; @@ -71,7 +70,7 @@ const Breadcrumbs = ({ pid = null, initiallyShallow = true }: BreadcrumbsProps): , ); return ( - + `; exports[`ChildList allows models to be toggled on 1`] = ` -[ - , - , - , +
+ + + +
+
+
+
, -] + +
`; exports[`ChildList allows thumbnails to be toggled on 1`] = ` -[ - , - , - , +
+ + + +
+
+
+
, -] + +
`; exports[`ChildList displays a paginator when appropriate 1`] = ` -[ - , - , - , -

- Showing - 1 - - - 10 - of - - 10000 -

, - "Pagination", +
+ + + +
+
+

+ Showing + 1 + - + 10 + of + + 10000 +

+
+
+ Pagination +
+ , -] + + `; exports[`ChildList renders using SelectableChild when a callback is provided 1`] = ` -[ - , - , - , +
+ + + +
+
+
+
, -] + +
`; exports[`ChildList renders using ajax-loaded object data 1`] = ` -[ - , - , - , +
+ + + +
+
+
+
, -] + +
`; exports[`ChildList renders using ajax-loaded root data 1`] = ` -[ - , - , - , +
+ + + +
+
+
+
, -] + +
`; diff --git a/client/components/paginate/__snapshots__/JobPaginator.test.tsx.snap b/client/components/paginate/__snapshots__/JobPaginator.test.tsx.snap index 82cd74c74..bb0cc7d1a 100644 --- a/client/components/paginate/__snapshots__/JobPaginator.test.tsx.snap +++ b/client/components/paginate/__snapshots__/JobPaginator.test.tsx.snap @@ -1,47 +1,56 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`JobPaginator renders 1`] = ` -
+[ + ,
JobPaginatorZoomToggle
-

- - Main Menu - - > - - Paginator - - > - testCategory - - > - testJob -

PaginatorControls PaginatorList
-
-
+ , +] `; From ce62e3f66615526faa97b0148a03078e49167e5d Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Wed, 20 Nov 2024 13:15:44 -0500 Subject: [PATCH 05/33] test: make button text more flexible --- client/components/edit/ObjectButtonBar.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/edit/ObjectButtonBar.test.tsx b/client/components/edit/ObjectButtonBar.test.tsx index 04aaf565b..3efa27095 100644 --- a/client/components/edit/ObjectButtonBar.test.tsx +++ b/client/components/edit/ObjectButtonBar.test.tsx @@ -41,7 +41,7 @@ describe("ObjectButtonBar", () => { it("can refresh a list of children", async () => { render(); const refreshIcon = screen.getByRole("button"); - expect(refreshIcon.textContent).toEqual("Refresh"); + expect(refreshIcon.textContent.trim()).toEqual("Refresh"); await userEvent.setup().click(refreshIcon); await waitFor(() => expect(mockContext.action.clearPidFromChildListStorage).toHaveBeenCalledTimes(1)); expect(mockContext.action.clearPidFromChildListStorage).toHaveBeenCalledWith(pid); From 098d1ca2c5c039a777b991d837f05c84b8594e09 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:10:24 +0000 Subject: [PATCH 06/33] Commit from GitHub Actions (Lint Pull Requests) --- client/next-env.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/next-env.d.ts b/client/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/client/next-env.d.ts +++ b/client/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. From 8d4cc463222b28a13f572fc841c6bf7ca42f2744 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 14 Jan 2025 13:53:41 -0500 Subject: [PATCH 07/33] chore: root format. --- client/components/edit/ObjectButtonBar.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/components/edit/ObjectButtonBar.tsx b/client/components/edit/ObjectButtonBar.tsx index b80572669..674dce7b8 100644 --- a/client/components/edit/ObjectButtonBar.tsx +++ b/client/components/edit/ObjectButtonBar.tsx @@ -28,7 +28,8 @@ const ObjectButtonBar = ({ pid }: ObjectButtonBarProps): React.ReactElement => { onClick={() => clearPidFromChildListStorage(pid)} title="Refresh children" > - Refresh + + Refresh From 719bc59cda0efdc1923b76bfc181a8624d05af51 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 14 Jan 2025 14:01:32 -0500 Subject: [PATCH 08/33] feat: add icon for Deleted state. i think this is the right state. --- client/components/edit/ObjectStatus.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/components/edit/ObjectStatus.tsx b/client/components/edit/ObjectStatus.tsx index 89503b81c..32173c057 100644 --- a/client/components/edit/ObjectStatus.tsx +++ b/client/components/edit/ObjectStatus.tsx @@ -6,6 +6,7 @@ import { useEditorContext } from "../../context/EditorContext"; import ObjectLoader from "./ObjectLoader"; import CheckCircleIcon from "@mui/icons-material/CheckCircle"; +import CloseIcon from "@mui/icons-material/Close"; import HelpOutlineIcon from "@mui/icons-material/HelpOutline"; import ModeStandbyIcon from "@mui/icons-material/ModeStandby"; @@ -16,11 +17,13 @@ export interface ObjectStatusProps { function getStatusIcon(statusText: string) { switch (statusText) { case "Active": - return ; + return ; + case "Deleted": + return ; case "Inactive": - return ; + return ; } - return ; + return ; } export const ObjectStatus = ({ pid }: ObjectStatusProps): React.ReactElement => { From 9c2f30069a08fbcda999826443bb084d840e2cba Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:02:30 +0000 Subject: [PATCH 09/33] Commit from GitHub Actions (Lint Pull Requests) --- client/components/edit/ObjectStatus.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/edit/ObjectStatus.tsx b/client/components/edit/ObjectStatus.tsx index 32173c057..9d6c3365a 100644 --- a/client/components/edit/ObjectStatus.tsx +++ b/client/components/edit/ObjectStatus.tsx @@ -18,8 +18,8 @@ function getStatusIcon(statusText: string) { switch (statusText) { case "Active": return ; - case "Deleted": - return ; + case "Deleted": + return ; case "Inactive": return ; } From 73e52f5fca55ebc6ee00622e3d0ea3b10fd94d78 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 14 Jan 2025 14:05:33 -0500 Subject: [PATCH 10/33] chore: update snapshots. --- .../components/edit/__snapshots__/ObjectButtonBar.test.tsx.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/edit/__snapshots__/ObjectButtonBar.test.tsx.snap b/client/components/edit/__snapshots__/ObjectButtonBar.test.tsx.snap index ce47da2c8..76bc51279 100644 --- a/client/components/edit/__snapshots__/ObjectButtonBar.test.tsx.snap +++ b/client/components/edit/__snapshots__/ObjectButtonBar.test.tsx.snap @@ -12,7 +12,7 @@ exports[`ObjectButtonBar renders correctly 1`] = ` title="Refresh children" type="button" > - Refresh + Refresh ObjectPreviewButton DeleteObjectButton From 9612b1b657d38265d2340e78c6ddc00d92c44c45 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 1 Apr 2025 12:08:36 -0400 Subject: [PATCH 11/33] style: harmony colors. --- .../edit/children/ChildList.module.css | 6 +- client/next-env.d.ts | 2 +- client/pages/_app.tsx | 2 +- client/styles/global.css | 18 +- client/styles/variables.css | 45 ++- client/styles/vendor/colors-harmony.css | 301 ++++++++++++++++++ 6 files changed, 334 insertions(+), 40 deletions(-) create mode 100644 client/styles/vendor/colors-harmony.css diff --git a/client/components/edit/children/ChildList.module.css b/client/components/edit/children/ChildList.module.css index 6e5cccd2c..90c558cad 100644 --- a/client/components/edit/children/ChildList.module.css +++ b/client/components/edit/children/ChildList.module.css @@ -1,8 +1,8 @@ .childlist { padding-inline: 1rem; padding-block: 1px; - color: var(--panel-text); - background-color: var(--panel); + color: CanvasText; + background-color: var(--soft); } .childlist__list { @@ -12,7 +12,7 @@ } .childlist__list > li { margin-block: 0; - border-block-start: 1px solid var(--border); + border-block-start: 1px solid var(--edge); } .childlist__item { diff --git a/client/next-env.d.ts b/client/next-env.d.ts index a4a7b3f5c..4f11a03dc 100644 --- a/client/next-env.d.ts +++ b/client/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/client/pages/_app.tsx b/client/pages/_app.tsx index ede7791f0..6ae12949b 100644 --- a/client/pages/_app.tsx +++ b/client/pages/_app.tsx @@ -7,7 +7,7 @@ import { FetchContextProvider } from "../context/FetchContext"; import LogoutButton from "../components/LogoutButton"; import "../styles/vendor/modern-normalize.css"; -import "../styles/vendor/colors-tailwindcss.css"; +import "../styles/vendor/colors-harmony.css"; import "../styles/reset.css"; import "../styles/variables.css"; diff --git a/client/styles/global.css b/client/styles/global.css index fe10a2fd9..bebe6ee2f 100644 --- a/client/styles/global.css +++ b/client/styles/global.css @@ -1,10 +1,12 @@ @layer reset { + html { + color-scheme: light; + } + body { padding: 0; font-family: var(--family-sans-serif); line-height: 1.5; - background-color: var(--canvas); - color: var(--canvas-text); } } @@ -95,16 +97,16 @@ line-height: normal; text-decoration: none; background-color: var(--button-face); - border: 1px solid var(--border); + border: 1px solid var(--edge); border-radius: 0.25rem; cursor: pointer; &:hover { - color: var(--canvas); - background-color: var(--canvas-text); - border-color: var(--canvas-text); + color: Canvas; + background-color: CanvasText; + border-color: CanvasText; - --outline-color: var(--canvas-text); + --outline-color: CanvasText; } } @@ -125,5 +127,5 @@ svg.css-i4bv87-MuiSvgIcon-root { /* MUI: modal */ .css-tlc64q-MuiPaper-root-MuiDialog-paper { - background-color: var(--canvas); + background-color: Canvas; } diff --git a/client/styles/variables.css b/client/styles/variables.css index 7ec1ea0e3..c2db1af54 100644 --- a/client/styles/variables.css +++ b/client/styles/variables.css @@ -1,60 +1,51 @@ :root { - --light-0: white; - --light-1: #e4e4e4; - --light-2: #c9c9c9; - --light-3: #adadad; - --light-4: #8f8f8f; - --light-5: #6d6d6d; - --light-6: #434343; + --soft: var(--zinc-100); + --edge: var(--zinc-500); + --mute: var(--zinc-700); + --text: var(--zinc-900); } :root { - --canvas: var(--light-0); - --canvas-text: var(--light-6); - --panel: var(--light-1); - --panel-text: black; - --border: var(--light-3); - - --text-muted: var(--light-5); + --text-muted: var(--mute); --family-sans-serif: system-ui, ui-sans-serif, sans-serif; --family-serif: ui-serif, serif; --family-monospace: ui-monospace, monospace; - --primary: var(--sky-800); + --primary: var(--sky-700); --primary-text: white; - --secondary: var(--light-5); + --secondary: var(--mute); --secondary-text: white; - --button-face: var(--light-0); + --button-face: white; --button-text: black; --button-hover: black; --button-hover-text: white; - --active: var(--red-800); + --active: var(--red-700); --active-text: white; --selected: var(--amber-200); --selected-text: black; - --info: var(--sky-100); + --info: var(--sky-200); --info-text: var(--sky-900); - --success: var(--green-300); + --success: var(--green-200); --success-text: var(--green-900); --danger: var(--red-200); --danger-text: var(--red-950); - --object-status-active: var(--green-800); - --object-status-inactive: var(--yellow-800); - --object-status-deleted: var(--red-800); + --object-status-active: var(--green-600); + --object-status-inactive: var(--yellow-600); + --object-status-deleted: var(--red-600); --object-status-unknown: var(--gray-600); - --object-status-active-hover: var(--green-300); - --object-status-inactive-hover: var(--yellow-300); - --object-status-deleted-hover: var(--red-300); - --object-status-unknown-hover: var(--gray-300); + --object-status-active-hover: var(--green-400); + --object-status-inactive-hover: var(--yellow-400); + --object-status-deleted-hover: var(--red-400); + --object-status-unknown-hover: var(--gray-400); } diff --git a/client/styles/vendor/colors-harmony.css b/client/styles/vendor/colors-harmony.css new file mode 100644 index 000000000..ac787d194 --- /dev/null +++ b/client/styles/vendor/colors-harmony.css @@ -0,0 +1,301 @@ +:root { + --red-50: oklch(0.988281 0.0046875 20); + --red-100: oklch(0.966797 0.0171875 20); + --red-200: oklch(0.921875 0.0421875 20); + --red-300: oklch(0.861328 0.078125 20); + --red-400: oklch(0.800781 0.114063 20); + --red-500: oklch(0.742188 0.151562 20); + --red-600: oklch(0.626953 0.135937 20); + --red-700: oklch(0.535156 0.115625 20); + --red-800: oklch(0.419922 0.090625 20); + --red-900: oklch(0.306641 0.065625 20); + --red-950: oklch(0.193359 0.040625 20); + + --orange-50: oklch(0.988281 0.0046875 43.3333); + --orange-100: oklch(0.966797 0.0171875 43.3333); + --orange-200: oklch(0.921875 0.0421875 43.3333); + --orange-300: oklch(0.859375 0.078125 43.3333); + --orange-400: oklch(0.798828 0.114063 43.3333); + --orange-500: oklch(0.738281 0.151562 43.3333); + --orange-600: oklch(0.623047 0.135937 43.3333); + --orange-700: oklch(0.53125 0.115625 43.3333); + --orange-800: oklch(0.417969 0.090625 43.3333); + --orange-900: oklch(0.304688 0.065625 43.3333); + --orange-950: oklch(0.191406 0.040625 43.3333); + + --amber-50: oklch(0.988281 0.0046875 66.6667); + --amber-100: oklch(0.966797 0.0171875 66.6667); + --amber-200: oklch(0.919922 0.0421875 66.6667); + --amber-300: oklch(0.857422 0.078125 66.6667); + --amber-400: oklch(0.794922 0.114063 66.6667); + --amber-500: oklch(0.732422 0.151562 66.6667); + --amber-600: oklch(0.619141 0.135937 66.6667); + --amber-700: oklch(0.527344 0.115625 66.6667); + --amber-800: oklch(0.414063 0.090625 66.6667); + --amber-900: oklch(0.302734 0.065625 66.6667); + --amber-950: oklch(0.191406 0.040625 66.6667); + + --yellow-50: oklch(0.988281 0.0046875 90); + --yellow-100: oklch(0.964844 0.0171875 90); + --yellow-200: oklch(0.917969 0.0421875 90); + --yellow-300: oklch(0.853516 0.078125 90); + --yellow-400: oklch(0.789063 0.114063 90); + --yellow-500: oklch(0.726563 0.151562 90); + --yellow-600: oklch(0.611328 0.135937 90); + --yellow-700: oklch(0.523438 0.115625 90); + --yellow-800: oklch(0.410156 0.090625 90); + --yellow-900: oklch(0.300781 0.065625 90); + --yellow-950: oklch(0.191406 0.040625 90); + + --lime-50: oklch(0.988281 0.0046875 106.667); + --lime-100: oklch(0.964844 0.0171875 106.667); + --lime-200: oklch(0.916016 0.0421875 106.667); + --lime-300: oklch(0.849609 0.078125 106.667); + --lime-400: oklch(0.785156 0.114063 106.667); + --lime-500: oklch(0.720703 0.151562 106.667); + --lime-600: oklch(0.607422 0.135937 106.667); + --lime-700: oklch(0.519531 0.115625 106.667); + --lime-800: oklch(0.408203 0.090625 106.667); + --lime-900: oklch(0.298828 0.065625 106.667); + --lime-950: oklch(0.189453 0.040625 106.667); + + --green-50: oklch(0.988281 0.0046875 123.333); + --green-100: oklch(0.962891 0.0171875 123.333); + --green-200: oklch(0.914063 0.0421875 123.333); + --green-300: oklch(0.847656 0.078125 123.333); + --green-400: oklch(0.78125 0.114063 123.333); + --green-500: oklch(0.714844 0.151562 123.333); + --green-600: oklch(0.603516 0.135937 123.333); + --green-700: oklch(0.515625 0.115625 123.333); + --green-800: oklch(0.404297 0.090625 123.333); + --green-900: oklch(0.296875 0.065625 123.333); + --green-950: oklch(0.1875 0.040625 123.333); + + --emerald-50: oklch(0.988281 0.0046875 140); + --emerald-100: oklch(0.962891 0.0171875 140); + --emerald-200: oklch(0.914063 0.0421875 140); + --emerald-300: oklch(0.845703 0.078125 140); + --emerald-400: oklch(0.777344 0.114063 140); + --emerald-500: oklch(0.710938 0.151562 140); + --emerald-600: oklch(0.597656 0.135937 140); + --emerald-700: oklch(0.511719 0.115625 140); + --emerald-800: oklch(0.400391 0.090625 140); + --emerald-900: oklch(0.294922 0.065625 140); + --emerald-950: oklch(0.1875 0.040625 140); + + --teal-50: oklch(0.988281 0.0046875 160); + --teal-100: oklch(0.962891 0.0171875 160); + --teal-200: oklch(0.912109 0.0421875 160); + --teal-300: oklch(0.84375 0.078125 160); + --teal-400: oklch(0.775391 0.114063 160); + --teal-500: oklch(0.705078 0.151562 160); + --teal-600: oklch(0.59375 0.135937 160); + --teal-700: oklch(0.507813 0.115625 160); + --teal-800: oklch(0.398438 0.090625 160); + --teal-900: oklch(0.291016 0.065625 160); + --teal-950: oklch(0.183594 0.040625 160); + + --cyan-50: oklch(0.988281 0.0046875 180); + --cyan-100: oklch(0.962891 0.0171875 180); + --cyan-200: oklch(0.912109 0.0421875 180); + --cyan-300: oklch(0.84375 0.078125 180); + --cyan-400: oklch(0.773438 0.114063 180); + --cyan-500: oklch(0.705078 0.151562 180); + --cyan-600: oklch(0.591797 0.135937 180); + --cyan-700: oklch(0.505859 0.115625 180); + --cyan-800: oklch(0.396484 0.090625 180); + --cyan-900: oklch(0.289063 0.065625 180); + --cyan-950: oklch(0.181641 0.040625 180); + + --sky-50: oklch(0.988281 0.0046875 210); + --sky-100: oklch(0.962891 0.0171875 210); + --sky-200: oklch(0.914063 0.0421875 210); + --sky-300: oklch(0.845703 0.078125 210); + --sky-400: oklch(0.777344 0.114063 210); + --sky-500: oklch(0.708984 0.151562 210); + --sky-600: oklch(0.595703 0.135937 210); + --sky-700: oklch(0.507813 0.115625 210); + --sky-800: oklch(0.398438 0.090625 210); + --sky-900: oklch(0.291016 0.065625 210); + --sky-950: oklch(0.181641 0.040625 210); + + --blue-50: oklch(0.988281 0.0046875 240); + --blue-100: oklch(0.964844 0.0171875 240); + --blue-200: oklch(0.916016 0.0421875 240); + --blue-300: oklch(0.849609 0.078125 240); + --blue-400: oklch(0.783203 0.114063 240); + --blue-500: oklch(0.71875 0.151562 240); + --blue-600: oklch(0.605469 0.135937 240); + --blue-700: oklch(0.517578 0.115625 240); + --blue-800: oklch(0.40625 0.090625 240); + --blue-900: oklch(0.296875 0.065625 240); + --blue-950: oklch(0.1875 0.040625 240); + + --indigo-50: oklch(0.988281 0.0046875 260); + --indigo-100: oklch(0.964844 0.0171875 260); + --indigo-200: oklch(0.917969 0.0421875 260); + --indigo-300: oklch(0.853516 0.078125 260); + --indigo-400: oklch(0.789063 0.114063 260); + --indigo-500: oklch(0.726563 0.151562 260); + --indigo-600: oklch(0.613281 0.135937 260); + --indigo-700: oklch(0.523438 0.115625 260); + --indigo-800: oklch(0.412109 0.090625 260); + --indigo-900: oklch(0.300781 0.065625 260); + --indigo-950: oklch(0.191406 0.040625 260); + + --violet-50: oklch(0.988281 0.0046875 280); + --violet-100: oklch(0.964844 0.0171875 280); + --violet-200: oklch(0.919922 0.0421875 280); + --violet-300: oklch(0.857422 0.078125 280); + --violet-400: oklch(0.794922 0.114063 280); + --violet-500: oklch(0.734375 0.151562 280); + --violet-600: oklch(0.619141 0.135937 280); + --violet-700: oklch(0.529297 0.115625 280); + --violet-800: oklch(0.416016 0.090625 280); + --violet-900: oklch(0.304688 0.065625 280); + --violet-950: oklch(0.193359 0.040625 280); + + --purple-50: oklch(0.988281 0.0046875 300); + --purple-100: oklch(0.966797 0.0171875 300); + --purple-200: oklch(0.921875 0.0421875 300); + --purple-300: oklch(0.859375 0.078125 300); + --purple-400: oklch(0.798828 0.114063 300); + --purple-500: oklch(0.738281 0.151562 300); + --purple-600: oklch(0.625 0.135937 300); + --purple-700: oklch(0.533203 0.115625 300); + --purple-800: oklch(0.417969 0.090625 300); + --purple-900: oklch(0.306641 0.065625 300); + --purple-950: oklch(0.195313 0.040625 300); + + --fuchsia-50: oklch(0.988281 0.0046875 320); + --fuchsia-100: oklch(0.966797 0.0171875 320); + --fuchsia-200: oklch(0.921875 0.0421875 320); + --fuchsia-300: oklch(0.861328 0.078125 320); + --fuchsia-400: oklch(0.800781 0.114063 320); + --fuchsia-500: oklch(0.742188 0.151562 320); + --fuchsia-600: oklch(0.626953 0.135937 320); + --fuchsia-700: oklch(0.535156 0.115625 320); + --fuchsia-800: oklch(0.419922 0.090625 320); + --fuchsia-900: oklch(0.308594 0.065625 320); + --fuchsia-950: oklch(0.195313 0.040625 320); + + --pink-50: oklch(0.988281 0.0046875 340); + --pink-100: oklch(0.966797 0.0171875 340); + --pink-200: oklch(0.923828 0.0421875 340); + --pink-300: oklch(0.863281 0.078125 340); + --pink-400: oklch(0.802734 0.114063 340); + --pink-500: oklch(0.744141 0.151562 340); + --pink-600: oklch(0.628906 0.135937 340); + --pink-700: oklch(0.537109 0.115625 340); + --pink-800: oklch(0.419922 0.090625 340); + --pink-900: oklch(0.308594 0.065625 340); + --pink-950: oklch(0.195313 0.040625 340); + + --rose-50: oklch(0.988281 0.0046875 0); + --rose-100: oklch(0.966797 0.0171875 0); + --rose-200: oklch(0.923828 0.0421875 0); + --rose-300: oklch(0.863281 0.078125 0); + --rose-400: oklch(0.802734 0.114063 0); + --rose-500: oklch(0.744141 0.151562 0); + --rose-600: oklch(0.626953 0.135937 0); + --rose-700: oklch(0.535156 0.115625 0); + --rose-800: oklch(0.419922 0.090625 0); + --rose-900: oklch(0.306641 0.065625 0); + --rose-950: oklch(0.193359 0.040625 0); + + --neutral-50: oklch(0.988281 0 0); + --neutral-100: oklch(0.964844 0 0); + --neutral-200: oklch(0.917969 0 0); + --neutral-300: oklch(0.853516 0 0); + --neutral-400: oklch(0.789063 0 0); + --neutral-500: oklch(0.726563 0 0); + --neutral-600: oklch(0.611328 0 0); + --neutral-700: oklch(0.523438 0 0); + --neutral-800: oklch(0.412109 0 0); + --neutral-900: oklch(0.300781 0 0); + --neutral-950: oklch(0.193359 0 0); + + --zinc-50: oklch(0.988281 0.004875 275); + --zinc-100: oklch(0.964844 0.008 275); + --zinc-200: oklch(0.917969 0.008 275); + --zinc-300: oklch(0.853516 0.008 275); + --zinc-400: oklch(0.789063 0.008 275); + --zinc-500: oklch(0.726563 0.008 275); + --zinc-600: oklch(0.613281 0.008 275); + --zinc-700: oklch(0.523438 0.008 275); + --zinc-800: oklch(0.412109 0.008 275); + --zinc-900: oklch(0.302734 0.008 275); + --zinc-950: oklch(0.193359 0.008 275); + + --gray-50: oklch(0.988281 0.0046875 275); + --gray-100: oklch(0.964844 0.016 275); + --gray-200: oklch(0.917969 0.016 275); + --gray-300: oklch(0.853516 0.016 275); + --gray-400: oklch(0.789063 0.016 275); + --gray-500: oklch(0.726563 0.016 275); + --gray-600: oklch(0.613281 0.016 275); + --gray-700: oklch(0.523438 0.016 275); + --gray-800: oklch(0.412109 0.016 275); + --gray-900: oklch(0.302734 0.016 275); + --gray-950: oklch(0.193359 0.016 275); + + --slate-50: oklch(0.988281 0.0046875 275); + --slate-100: oklch(0.964844 0.01775 275); + --slate-200: oklch(0.917969 0.024 275); + --slate-300: oklch(0.853516 0.024 275); + --slate-400: oklch(0.789063 0.024 275); + --slate-500: oklch(0.726563 0.024 275); + --slate-600: oklch(0.613281 0.024 275); + --slate-700: oklch(0.523438 0.024 275); + --slate-800: oklch(0.412109 0.024 275); + --slate-900: oklch(0.302734 0.024 275); + --slate-950: oklch(0.193359 0.024 275); + + --mauve-50: oklch(0.988281 0.008 325); + --mauve-100: oklch(0.966797 0.008 325); + --mauve-200: oklch(0.917969 0.008 325); + --mauve-300: oklch(0.853516 0.008 325); + --mauve-400: oklch(0.789063 0.008 325); + --mauve-500: oklch(0.726563 0.008 325); + --mauve-600: oklch(0.613281 0.008 325); + --mauve-700: oklch(0.523438 0.008 325); + --mauve-800: oklch(0.412109 0.008 325); + --mauve-900: oklch(0.302734 0.008 325); + --mauve-950: oklch(0.193359 0.008 325); + + --stone-50: oklch(0.988281 0.008 75); + --stone-100: oklch(0.964844 0.008 75); + --stone-200: oklch(0.917969 0.008 75); + --stone-300: oklch(0.853516 0.008 75); + --stone-400: oklch(0.789063 0.008 75); + --stone-500: oklch(0.726563 0.008 75); + --stone-600: oklch(0.613281 0.008 75); + --stone-700: oklch(0.523438 0.008 75); + --stone-800: oklch(0.412109 0.008 75); + --stone-900: oklch(0.302734 0.008 75); + --stone-950: oklch(0.193359 0.008 75); + + --sand-50: oklch(0.988281 0.0104375 75); + --sand-100: oklch(0.964844 0.012 75); + --sand-200: oklch(0.917969 0.012 75); + --sand-300: oklch(0.853516 0.012 75); + --sand-400: oklch(0.789063 0.012 75); + --sand-500: oklch(0.726563 0.012 75); + --sand-600: oklch(0.613281 0.012 75); + --sand-700: oklch(0.523438 0.012 75); + --sand-800: oklch(0.412109 0.012 75); + --sand-900: oklch(0.302734 0.012 75); + --sand-950: oklch(0.193359 0.012 75); + + --olive-50: oklch(0.988281 0.008 120); + --olive-100: oklch(0.964844 0.008 120); + --olive-200: oklch(0.917969 0.008 120); + --olive-300: oklch(0.851563 0.008 120); + --olive-400: oklch(0.789063 0.008 120); + --olive-500: oklch(0.724609 0.008 120); + --olive-600: oklch(0.611328 0.008 120); + --olive-700: oklch(0.523438 0.008 120); + --olive-800: oklch(0.410156 0.008 120); + --olive-900: oklch(0.300781 0.008 120); + --olive-950: oklch(0.191406 0.008 120); +} From bb026a1392d65755f583f1125eeebc74ec90a02f Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 1 Apr 2025 15:22:26 -0400 Subject: [PATCH 12/33] style: padding and color adjustments. --- .../edit/ObjectButtonBar.module.css | 15 +++++++++----- .../components/edit/ObjectStatus.module.css | 4 ++++ client/components/edit/ObjectStatus.tsx | 2 +- client/components/edit/children/Child.tsx | 2 +- .../edit/children/ChildList.module.css | 20 +++++++++++++------ client/components/edit/children/ChildList.tsx | 4 ++-- client/styles/variables.css | 12 ++++++----- 7 files changed, 39 insertions(+), 20 deletions(-) diff --git a/client/components/edit/ObjectButtonBar.module.css b/client/components/edit/ObjectButtonBar.module.css index dec99aabd..4a2fab575 100644 --- a/client/components/edit/ObjectButtonBar.module.css +++ b/client/components/edit/ObjectButtonBar.module.css @@ -1,14 +1,19 @@ .objectBar { display: grid; - grid-template-columns: repeat(4, 1fr); + grid-template-columns: repeat(4, minmax(120px, 1fr)); + width: min-content; + max-width: 100%; & button { width: 100%; white-space: nowrap; - } - - & button:not(:hover, :focus) { border-color: transparent; background-color: transparent; - } + + &:hover, + &:focus { + border-color: black; + background-color: black; + } + } } diff --git a/client/components/edit/ObjectStatus.module.css b/client/components/edit/ObjectStatus.module.css index 5b8b3a0ff..b1222ef07 100644 --- a/client/components/edit/ObjectStatus.module.css +++ b/client/components/edit/ObjectStatus.module.css @@ -1,3 +1,7 @@ +.status_btn { + text-align: start; +} + .active .indicator { color: var(--object-status-active); } diff --git a/client/components/edit/ObjectStatus.tsx b/client/components/edit/ObjectStatus.tsx index 9d6c3365a..9a1bfa5d4 100644 --- a/client/components/edit/ObjectStatus.tsx +++ b/client/components/edit/ObjectStatus.tsx @@ -43,7 +43,7 @@ export const ObjectStatus = ({ pid }: ObjectStatusProps): React.ReactElement => openModal("state"); }; const stateMsg = loaded ? ( - diff --git a/client/components/edit/children/Child.tsx b/client/components/edit/children/Child.tsx index c3657bcee..4ca6b3f17 100644 --- a/client/components/edit/children/Child.tsx +++ b/client/components/edit/children/Child.tsx @@ -82,7 +82,7 @@ export const Child = ({ - + {loaded ? : ""} diff --git a/client/components/edit/children/ChildList.module.css b/client/components/edit/children/ChildList.module.css index 90c558cad..1d86276c9 100644 --- a/client/components/edit/children/ChildList.module.css +++ b/client/components/edit/children/ChildList.module.css @@ -20,9 +20,8 @@ padding-block: 0.25rem; } -.childlist__expandicon { - font-size: 1.5em; - vertical-align: bottom; +svg.childlist__expandicon { + font-size: 21px; cursor: pointer; &:hover, @@ -39,9 +38,18 @@ /* Nested */ -.childlist__list .childlist { - margin-inline-start: 1rem; - padding-inline-end: 0; +.childlist__list { + .childlist { + margin-inline-start: 0.5rem; + margin-block-end: -0.25em; + padding-inline-end: 0; + border-inline-start: 1px solid var(--edge); + } + + .childlist__pagination { + margin-block: 0.25em; + font-size: 10pt; + } } /* Pagination alignment */ diff --git a/client/components/edit/children/ChildList.tsx b/client/components/edit/children/ChildList.tsx index 6e19cc273..b0201f26a 100644 --- a/client/components/edit/children/ChildList.tsx +++ b/client/components/edit/children/ChildList.tsx @@ -127,7 +127,7 @@ export const ChildList = ({ const endNumber = startNumber + pageSize - 1; const paginatorLabel = children.numFound > 1 ? ( -

+

Showing {startNumber} - {children.numFound < endNumber ? children.numFound : endNumber} of{" "} {children.numFound}

@@ -135,7 +135,7 @@ export const ChildList = ({ return (
- + {thumbsButton} {modelsButton} {childButton} diff --git a/client/styles/variables.css b/client/styles/variables.css index c2db1af54..4f06870cf 100644 --- a/client/styles/variables.css +++ b/client/styles/variables.css @@ -1,3 +1,5 @@ +/* Harmony colors imported in _app.tsx */ + :root { --soft: var(--zinc-100); --edge: var(--zinc-500); @@ -24,7 +26,7 @@ --button-hover: black; --button-hover-text: white; - --active: var(--red-700); + --active: oklch(0.577 0.245 27.325); /* Tailwind red-600 */ --active-text: white; --selected: var(--amber-200); @@ -44,8 +46,8 @@ --object-status-deleted: var(--red-600); --object-status-unknown: var(--gray-600); - --object-status-active-hover: var(--green-400); - --object-status-inactive-hover: var(--yellow-400); - --object-status-deleted-hover: var(--red-400); - --object-status-unknown-hover: var(--gray-400); + --object-status-active-hover: var(--green-300); + --object-status-inactive-hover: var(--yellow-300); + --object-status-deleted-hover: var(--red-300); + --object-status-unknown-hover: var(--gray-300); } From c7d30283def54dd492f868bd89b890f63475aa85 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 1 Apr 2025 16:23:55 -0400 Subject: [PATCH 13/33] style: item edit colors and layout. --- client/components/edit/ObjectButtonBar.module.css | 7 +++---- client/components/edit/ObjectStatus.module.css | 1 + client/components/edit/ObjectSummary.module.css | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/client/components/edit/ObjectButtonBar.module.css b/client/components/edit/ObjectButtonBar.module.css index 4a2fab575..b2e73ae65 100644 --- a/client/components/edit/ObjectButtonBar.module.css +++ b/client/components/edit/ObjectButtonBar.module.css @@ -1,11 +1,10 @@ .objectBar { display: grid; - grid-template-columns: repeat(4, minmax(120px, 1fr)); - width: min-content; - max-width: 100%; + grid-template-columns: repeat(4, auto); + width: fit-content; & button { - width: 100%; + width: fit-content; white-space: nowrap; border-color: transparent; background-color: transparent; diff --git a/client/components/edit/ObjectStatus.module.css b/client/components/edit/ObjectStatus.module.css index b1222ef07..8c1c6fb20 100644 --- a/client/components/edit/ObjectStatus.module.css +++ b/client/components/edit/ObjectStatus.module.css @@ -1,4 +1,5 @@ .status_btn { + min-width: 120px; text-align: start; } diff --git a/client/components/edit/ObjectSummary.module.css b/client/components/edit/ObjectSummary.module.css index 8789f99f0..6a980db83 100644 --- a/client/components/edit/ObjectSummary.module.css +++ b/client/components/edit/ObjectSummary.module.css @@ -1,8 +1,9 @@ .infobox { - padding-inline: clamp(1rem, 5%, 3rem); + padding-inline: 1lh; padding-block: 1rem; color: var(--info-text); background-color: var(--info); + border: 1px solid var(--sky-500); } .infobox h2 { From 7ef316dee0de12af45b4fc7f42a90e5fc337d7f5 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Tue, 1 Apr 2025 16:24:10 -0400 Subject: [PATCH 14/33] style: job paginator. --- client/styles/job-paginator.css | 45 +++++++++++++++++++++++---------- client/styles/variables.css | 12 ++++----- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/client/styles/job-paginator.css b/client/styles/job-paginator.css index 39ef5509c..e4f8f1943 100644 --- a/client/styles/job-paginator.css +++ b/client/styles/job-paginator.css @@ -1,7 +1,7 @@ /* Layout */ body:has(#paginator) { - background-color: var(--light-1); + background-color: var(--soft); } .controls { @@ -14,13 +14,14 @@ body:has(#paginator) { margin-top: 0.5rem; padding: 0.25rem; padding-bottom: 400px; - border: 1px solid var(--border); + border: 1px solid var(--edge); background-color: Canvas; border-radius: 6px 0 0 6px; } .top-row { display: flex; + align-items: end; width: 100%; margin-block: 0.25rem; } @@ -40,9 +41,9 @@ body:has(#paginator) { input { height: 100%; - padding-block: 0.25rem; + padding: 0.5rem; font: inherit; - border: 1px solid var(--border); + border: 1px solid var(--edge); border-radius: 0.25rem; --outline-color: var(--primary); @@ -59,7 +60,7 @@ label { cursor: pointer; } label:hover { - background-color: var(--light-1); + background-color: var(--soft); } label input[type="text"], label input[type="number"], @@ -83,8 +84,16 @@ label input[type="radio"] { } .group button { width: 100%; + color: white; + background-color: var(--slate-700); + border-color: black; border-right-width: 0; border-radius: 0; + + &:hover, + &:focus { + background-color: black; + } } .group button:first-child, .group input[type="text"] + button { @@ -101,10 +110,11 @@ label input[type="radio"] { .toggles { display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + grid-column: 1 / 3; } .toggles button:not(:hover) { - color: var(--secondary-text); - background-color: var(--secondary); + color: var(--text); + background-color: white; } .controls button.delete-btn { @@ -118,22 +128,24 @@ label input[type="radio"] { } .thumbnail { - position: relative; float: left; + position: relative; display: flex; align-items: center; width: 125px; height: 202px; margin: 2px; padding: 0.25rem; - background-color: var(--panel); font-weight: 400; text-align: center; - cursor: pointer; word-break: break-all; + background-color: var(--soft); + border: 1px solid var(--edge); + cursor: pointer; } .thumbnail.selected { background-color: var(--selected); + border-color: var(--amber-500); } .thumbnail img { display: block; @@ -155,13 +167,18 @@ label input[type="radio"] { .thumbnail .number { position: absolute; display: table; - top: 0; - left: 0; - padding: 2px; - font-family: var(--family-monospace); + top: -1px; + left: -1px; + padding-inline: 0.75ch; + padding-block: 0.25ch; + font-family: monospace; + font-weight: 700; font-size: 10px; + color: var(--mute); background-color: Canvas; + border: inherit; } + .preview, #zoomy { text-align: center; diff --git a/client/styles/variables.css b/client/styles/variables.css index 4f06870cf..909bdbb50 100644 --- a/client/styles/variables.css +++ b/client/styles/variables.css @@ -32,14 +32,14 @@ --selected: var(--amber-200); --selected-text: black; - --info: var(--sky-200); - --info-text: var(--sky-900); + --info: var(--sky-100); + --info-text: var(--sky-800); - --success: var(--green-200); - --success-text: var(--green-900); + --success: var(--green-100); + --success-text: var(--green-800); - --danger: var(--red-200); - --danger-text: var(--red-950); + --danger: var(--red-100); + --danger-text: var(--red-800); --object-status-active: var(--green-600); --object-status-inactive: var(--yellow-600); From a7479c2a8393cec351fc2c725e90e9242d9f0553 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 20:25:08 +0000 Subject: [PATCH 15/33] Commit from GitHub Actions (Lint Pull Requests) --- client/components/edit/children/ChildList.tsx | 4 ++-- client/next-env.d.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/components/edit/children/ChildList.tsx b/client/components/edit/children/ChildList.tsx index b0201f26a..ebf0ca216 100644 --- a/client/components/edit/children/ChildList.tsx +++ b/client/components/edit/children/ChildList.tsx @@ -127,7 +127,7 @@ export const ChildList = ({ const endNumber = startNumber + pageSize - 1; const paginatorLabel = children.numFound > 1 ? ( -

+

Showing {startNumber} - {children.numFound < endNumber ? children.numFound : endNumber} of{" "} {children.numFound}

@@ -135,7 +135,7 @@ export const ChildList = ({ return (
- + {thumbsButton} {modelsButton} {childButton} diff --git a/client/next-env.d.ts b/client/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/client/next-env.d.ts +++ b/client/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. From a71c63bc853496e706ec9cef6e413ba90352bcb9 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Thu, 3 Apr 2025 13:00:45 -0400 Subject: [PATCH 16/33] css: status btn improvements. --- client/components/edit/ObjectOrder.tsx | 2 +- .../components/edit/ObjectStatus.module.css | 57 ++++++++++++------- .../components/edit/ObjectSummary.module.css | 8 +-- client/components/edit/ObjectSummary.tsx | 2 +- .../edit/children/ChildList.module.css | 5 ++ client/components/edit/children/ChildList.tsx | 13 +++-- .../edit/datastream/Datastream.module.css | 20 +++++++ .../datastream/DatastreamControlButton.tsx | 27 ++++----- 8 files changed, 85 insertions(+), 49 deletions(-) diff --git a/client/components/edit/ObjectOrder.tsx b/client/components/edit/ObjectOrder.tsx index 224afc3fb..7e9129e14 100644 --- a/client/components/edit/ObjectOrder.tsx +++ b/client/components/edit/ObjectOrder.tsx @@ -72,7 +72,7 @@ const ObjectOrder = ({ pid }: ObjectOrderProps): React.ReactElement => {
{statusMessage}
) : (
- Current sort: {currentSort} + Current sort: {currentSort} 

{title}

{HtmlReactParser(description)}
- {loaded ? : ""} + {loaded ?
: ""} {loaded ? : ""} {loaded ? : ""} PID: {currentPid} diff --git a/client/components/edit/children/ChildList.module.css b/client/components/edit/children/ChildList.module.css index 1d86276c9..736a19145 100644 --- a/client/components/edit/children/ChildList.module.css +++ b/client/components/edit/children/ChildList.module.css @@ -36,6 +36,11 @@ svg.childlist__expandicon { color: var(--text-muted); } +.childlist__toggles { + display: flex; + gap: 1ch; +} + /* Nested */ .childlist__list { diff --git a/client/components/edit/children/ChildList.tsx b/client/components/edit/children/ChildList.tsx index ebf0ca216..3c6de37e4 100644 --- a/client/components/edit/children/ChildList.tsx +++ b/client/components/edit/children/ChildList.tsx @@ -127,7 +127,7 @@ export const ChildList = ({ const endNumber = startNumber + pageSize - 1; const paginatorLabel = children.numFound > 1 ? ( -

+

Showing {startNumber} - {children.numFound < endNumber ? children.numFound : endNumber} of{" "} {children.numFound}

@@ -135,17 +135,18 @@ export const ChildList = ({ return (
- - {thumbsButton} - {modelsButton} - {childButton} - {paginatorLabel} {paginator} +   + + {thumbsButton} + {modelsButton} + {childButton} +
    {contents.length ? contents : Empty.}
diff --git a/client/components/edit/datastream/Datastream.module.css b/client/components/edit/datastream/Datastream.module.css index b3e4edae3..a53184c95 100644 --- a/client/components/edit/datastream/Datastream.module.css +++ b/client/components/edit/datastream/Datastream.module.css @@ -2,3 +2,23 @@ color: var(--selected-text); background-color: var(--selected); } + +div[role="group"] .datastreamControlButton { + font-size: 14pt; + color: inherit; + border-color: var(--mute); + opacity: 0.75; + transition: none; + + &:disabled { + opacity: 0.75; + color: var(--mute); + border-color: var(--mute); + } + + &:hover, + &:focus { + color: white; + background-color: black; + } +} diff --git a/client/components/edit/datastream/DatastreamControlButton.tsx b/client/components/edit/datastream/DatastreamControlButton.tsx index e9a0374b4..d627ea1c2 100644 --- a/client/components/edit/datastream/DatastreamControlButton.tsx +++ b/client/components/edit/datastream/DatastreamControlButton.tsx @@ -1,6 +1,6 @@ import React, { useState } from "react"; -import LoadingButton from "@mui/lab/LoadingButton"; -import Tooltip from "@mui/material/Tooltip"; +import styles from "./Datastream.module.css"; +import Button from "@mui/material/Button"; import DataObject from "@mui/icons-material/DataObject"; import Download from "@mui/icons-material/Download"; import Delete from "@mui/icons-material/Delete"; @@ -52,20 +52,15 @@ const DatastreamControlButton = ({ }; }; return ( - - - - {Icons[modalState]} - - - + ); }; From 337d25178d844e69159fe328883ff36c4c600487 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Thu, 3 Apr 2025 14:28:51 -0400 Subject: [PATCH 17/33] populated datastreams to green. fix status buttons in ObjectSummary. --- client/components/edit/ObjectEditor.tsx | 4 ++-- .../components/edit/ObjectSummary.module.css | 20 +++++++++---------- .../edit/datastream/Datastream.module.css | 7 +++++++ .../components/edit/datastream/Datastream.tsx | 2 +- client/components/paginate/JobPaginator.tsx | 2 +- client/styles/global.css | 2 +- client/styles/job-paginator.css | 2 +- client/styles/variables.css | 20 ++++++++++--------- 8 files changed, 34 insertions(+), 25 deletions(-) diff --git a/client/components/edit/ObjectEditor.tsx b/client/components/edit/ObjectEditor.tsx index ae464a9d6..d12805267 100644 --- a/client/components/edit/ObjectEditor.tsx +++ b/client/components/edit/ObjectEditor.tsx @@ -33,7 +33,7 @@ const ObjectEditor = ({ pid }: ObjectEditorProps): React.ReactElement => {

Editor: Object {pid}

- +

Object Tools

    @@ -43,7 +43,7 @@ const ObjectEditor = ({ pid }: ObjectEditorProps): React.ReactElement => {
- +

Datastreams

diff --git a/client/components/edit/ObjectSummary.module.css b/client/components/edit/ObjectSummary.module.css index 51bcb20a1..716af931b 100644 --- a/client/components/edit/ObjectSummary.module.css +++ b/client/components/edit/ObjectSummary.module.css @@ -3,24 +3,24 @@ padding-block: 1rem; color: var(--info-text); background-color: var(--info); - border: 1px solid var(--sky-400); + border: 1px solid var(--info-border); } .infobox h2 { margin: 0; } -.infobox.infobox button { +.infobox button { min-width: unset; margin-inline-end: 1ch; + padding-block: 0.5em 0.4em; font-size: 10pt; - color: var(--button-text); - background-color: var(--button-face); - border-color: var(--info-text); + background-color: white; + border: 1px solid black; - &:hover, &:focus { - color: var(--button-hover-text); - background-color: var(--button-hover); - border-color: var(--button-hover); - } + &:hover, + &:focus { + color: white; + background-color: black; + } } diff --git a/client/components/edit/datastream/Datastream.module.css b/client/components/edit/datastream/Datastream.module.css index a53184c95..8d3693091 100644 --- a/client/components/edit/datastream/Datastream.module.css +++ b/client/components/edit/datastream/Datastream.module.css @@ -1,6 +1,13 @@ +.datastream { + margin-block: 0.125em; + padding-block: 0.375em; + border: 1px solid transparent; +} + .enabled { color: var(--selected-text); background-color: var(--selected); + border-color: var(--selected-border); } div[role="group"] .datastreamControlButton { diff --git a/client/components/edit/datastream/Datastream.tsx b/client/components/edit/datastream/Datastream.tsx index 8817b1fd0..f3e986114 100644 --- a/client/components/edit/datastream/Datastream.tsx +++ b/client/components/edit/datastream/Datastream.tsx @@ -14,7 +14,7 @@ const Datastream = ({ datastream }: DatastreamProps): React.ReactElement => { const { stream, disabled } = datastream; return ( } > diff --git a/client/components/paginate/JobPaginator.tsx b/client/components/paginate/JobPaginator.tsx index fdb7cbfd1..5f4df72f6 100644 --- a/client/components/paginate/JobPaginator.tsx +++ b/client/components/paginate/JobPaginator.tsx @@ -26,7 +26,7 @@ const JobPaginator = ({ initialCategory, initialJob }: JobPaginatorProps): React return ( <> -
    +
    • Main Menu
    • diff --git a/client/styles/global.css b/client/styles/global.css index bebe6ee2f..9c5c8e04d 100644 --- a/client/styles/global.css +++ b/client/styles/global.css @@ -70,7 +70,7 @@ .breadcrumbs { width: fit-content; margin-block: 1rem; - padding-inline: 1rem; + padding-inline: 0; padding-block: 0.5rem; font-size: 0.875rem; list-style: none; diff --git a/client/styles/job-paginator.css b/client/styles/job-paginator.css index e4f8f1943..6a9cf2d9e 100644 --- a/client/styles/job-paginator.css +++ b/client/styles/job-paginator.css @@ -145,7 +145,7 @@ label input[type="radio"] { } .thumbnail.selected { background-color: var(--selected); - border-color: var(--amber-500); + border-color: var(--selected-border); } .thumbnail img { display: block; diff --git a/client/styles/variables.css b/client/styles/variables.css index 909bdbb50..acfbbb943 100644 --- a/client/styles/variables.css +++ b/client/styles/variables.css @@ -29,11 +29,13 @@ --active: oklch(0.577 0.245 27.325); /* Tailwind red-600 */ --active-text: white; - --selected: var(--amber-200); + --selected: var(--emerald-200); --selected-text: black; + --selected-border: var(--emerald-500); --info: var(--sky-100); --info-text: var(--sky-800); + --info-border: var(--sky-500); --success: var(--green-100); --success-text: var(--green-800); @@ -41,13 +43,13 @@ --danger: var(--red-100); --danger-text: var(--red-800); - --object-status-active: var(--green-600); - --object-status-inactive: var(--yellow-600); - --object-status-deleted: var(--red-600); - --object-status-unknown: var(--gray-600); + --object-status-active: var(--emerald-200); + --object-status-inactive: var(--yellow-200); + --object-status-deleted: var(--red-200); + --object-status-unknown: var(--gray-200); - --object-status-active-hover: var(--green-300); - --object-status-inactive-hover: var(--yellow-300); - --object-status-deleted-hover: var(--red-300); - --object-status-unknown-hover: var(--gray-300); + --object-status-active-text: var(--emerald-800); + --object-status-inactive-text: var(--yellow-800); + --object-status-deleted-text: var(--red-800); + --object-status-unknown-text: var(--gray-800); } From c40fe2498ea1f72eb52e12ad495c6e277cac16af Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Thu, 3 Apr 2025 14:43:17 -0400 Subject: [PATCH 18/33] lint --- client/components/edit/ObjectSummary.tsx | 8 +++++++- client/components/edit/children/ChildList.tsx | 6 ++++-- .../edit/datastream/DatastreamControlButton.tsx | 3 +-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/client/components/edit/ObjectSummary.tsx b/client/components/edit/ObjectSummary.tsx index e5fb83ab7..047d8d078 100644 --- a/client/components/edit/ObjectSummary.tsx +++ b/client/components/edit/ObjectSummary.tsx @@ -39,7 +39,13 @@ const ObjectSummary = (): React.ReactElement => {

{title}

{HtmlReactParser(description)}
- {loaded ?
: ""} + {loaded ? ( +
+ +
+ ) : ( + "" + )} {loaded ? : ""} {loaded ? : ""} PID: {currentPid} diff --git a/client/components/edit/children/ChildList.tsx b/client/components/edit/children/ChildList.tsx index 3c6de37e4..b646e5a08 100644 --- a/client/components/edit/children/ChildList.tsx +++ b/client/components/edit/children/ChildList.tsx @@ -127,7 +127,7 @@ export const ChildList = ({ const endNumber = startNumber + pageSize - 1; const paginatorLabel = children.numFound > 1 ? ( -

+

Showing {startNumber} - {children.numFound < endNumber ? children.numFound : endNumber} of{" "} {children.numFound}

@@ -141,7 +141,9 @@ export const ChildList = ({ {paginator} -   + +   + {thumbsButton} {modelsButton} diff --git a/client/components/edit/datastream/DatastreamControlButton.tsx b/client/components/edit/datastream/DatastreamControlButton.tsx index d627ea1c2..0951b8a99 100644 --- a/client/components/edit/datastream/DatastreamControlButton.tsx +++ b/client/components/edit/datastream/DatastreamControlButton.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React from "react"; import styles from "./Datastream.module.css"; import Button from "@mui/material/Button"; import DataObject from "@mui/icons-material/DataObject"; @@ -29,7 +29,6 @@ const DatastreamControlButton = ({ datastream, disabled, }: DatastreamControlButtonProps): React.ReactElement => { - const [isLoading, setLoading] = useState(false); const { action: { setActiveDatastream, setDatastreamModalState }, } = useEditorContext(); From f11d79760c28d0c43bff64d257d303879b50f0ee Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Mon, 14 Apr 2025 16:02:39 -0400 Subject: [PATCH 19/33] ci: mixed whitespace. --- client/components/edit/ObjectButtonBar.module.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/components/edit/ObjectButtonBar.module.css b/client/components/edit/ObjectButtonBar.module.css index b2e73ae65..db40a82c1 100644 --- a/client/components/edit/ObjectButtonBar.module.css +++ b/client/components/edit/ObjectButtonBar.module.css @@ -1,11 +1,11 @@ .objectBar { - display: grid; + display: grid; grid-template-columns: repeat(4, auto); width: fit-content; - & button { + & button { width: fit-content; - white-space: nowrap; + white-space: nowrap; border-color: transparent; background-color: transparent; @@ -13,6 +13,6 @@ &:focus { border-color: black; background-color: black; - } + } } } From 27a780154d2e4d34a83a6e6e32442663b694dd01 Mon Sep 17 00:00:00 2001 From: Chris Hallberg Date: Thu, 24 Apr 2025 15:18:27 -0400 Subject: [PATCH 20/33] fix: object button bar delete. --- .../edit/DeleteObjectButton.module.css | 7 +++++++ client/components/edit/DeleteObjectButton.tsx | 3 ++- .../components/edit/ObjectButtonBar.module.css | 18 +++++++++++------- .../components/edit/ObjectSummary.module.css | 12 ++++-------- 4 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 client/components/edit/DeleteObjectButton.module.css diff --git a/client/components/edit/DeleteObjectButton.module.css b/client/components/edit/DeleteObjectButton.module.css new file mode 100644 index 000000000..aff72ce21 --- /dev/null +++ b/client/components/edit/DeleteObjectButton.module.css @@ -0,0 +1,7 @@ +.deleteBtn { + &:hover, + &:focus { + background-color: var(--red-700); + border-color: var(--red-700); + } +} diff --git a/client/components/edit/DeleteObjectButton.tsx b/client/components/edit/DeleteObjectButton.tsx index 465599b4f..07822619d 100644 --- a/client/components/edit/DeleteObjectButton.tsx +++ b/client/components/edit/DeleteObjectButton.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from "react"; +import styles from "./DeleteObjectButton.module.css"; import { useEditorContext } from "../../context/EditorContext"; import Delete from "@mui/icons-material/Delete"; import { getObjectParentsUrl, getObjectRecursiveChildPidsUrl } from "../../util/routes"; @@ -90,7 +91,7 @@ const DeleteObjectButton = ({ pid }: DeleteObjectButtonProps): React.ReactElemen }; const visible = statusMessage.length === 0 && trashPid && loaded && childPidResponse?.loading !== true; return visible ? ( - ) : ( diff --git a/client/components/edit/ObjectButtonBar.module.css b/client/components/edit/ObjectButtonBar.module.css index db40a82c1..81f9d52ec 100644 --- a/client/components/edit/ObjectButtonBar.module.css +++ b/client/components/edit/ObjectButtonBar.module.css @@ -1,18 +1,22 @@ .objectBar { display: grid; - grid-template-columns: repeat(4, auto); + grid-template-columns: repeat(5, auto); width: fit-content; & button { width: fit-content; white-space: nowrap; - border-color: transparent; - background-color: transparent; + border-inline-width: 0; + border-radius: 0; - &:hover, - &:focus { - border-color: black; - background-color: black; + &:first-child { + border-inline-start-width: 1px; + border-radius: 4px 0 0 4px; + } + + &:last-child { + border-inline-end-width: 1px; + border-radius: 0 4px 4px 0; } } } diff --git a/client/components/edit/ObjectSummary.module.css b/client/components/edit/ObjectSummary.module.css index 716af931b..0842d2439 100644 --- a/client/components/edit/ObjectSummary.module.css +++ b/client/components/edit/ObjectSummary.module.css @@ -12,15 +12,11 @@ .infobox button { min-width: unset; - margin-inline-end: 1ch; padding-block: 0.5em 0.4em; font-size: 10pt; - background-color: white; - border: 1px solid black; - &:hover, - &:focus { - color: white; - background-color: black; - } + &:not(:hover,:focus) { + background-color: white; + border-color: black; + } } From c503f4238a0f22ca01e0d13cb72f9561955068e1 Mon Sep 17 00:00:00 2001 From: Demian Katz Date: Fri, 25 Apr 2025 12:56:16 -0400 Subject: [PATCH 21/33] Convert tabs to spaces. --- .../edit/DeleteObjectButton.module.css | 10 ++-- .../edit/ObjectButtonBar.module.css | 34 ++++++------- .../components/edit/ObjectSummary.module.css | 18 +++---- .../edit/children/ChildList.module.css | 50 +++++++++---------- .../edit/datastream/Datastream.module.css | 38 +++++++------- client/styles/global.css | 14 +++--- client/styles/job-paginator.css | 6 +-- client/styles/variables.css | 16 +++--- 8 files changed, 93 insertions(+), 93 deletions(-) diff --git a/client/components/edit/DeleteObjectButton.module.css b/client/components/edit/DeleteObjectButton.module.css index aff72ce21..6c08fb1c8 100644 --- a/client/components/edit/DeleteObjectButton.module.css +++ b/client/components/edit/DeleteObjectButton.module.css @@ -1,7 +1,7 @@ .deleteBtn { - &:hover, - &:focus { - background-color: var(--red-700); - border-color: var(--red-700); - } + &:hover, + &:focus { + background-color: var(--red-700); + border-color: var(--red-700); + } } diff --git a/client/components/edit/ObjectButtonBar.module.css b/client/components/edit/ObjectButtonBar.module.css index 81f9d52ec..5ee57a156 100644 --- a/client/components/edit/ObjectButtonBar.module.css +++ b/client/components/edit/ObjectButtonBar.module.css @@ -1,22 +1,22 @@ .objectBar { - display: grid; - grid-template-columns: repeat(5, auto); - width: fit-content; + display: grid; + grid-template-columns: repeat(5, auto); + width: fit-content; - & button { - width: fit-content; - white-space: nowrap; - border-inline-width: 0; - border-radius: 0; + & button { + width: fit-content; + white-space: nowrap; + border-inline-width: 0; + border-radius: 0; - &:first-child { - border-inline-start-width: 1px; - border-radius: 4px 0 0 4px; - } + &:first-child { + border-inline-start-width: 1px; + border-radius: 4px 0 0 4px; + } - &:last-child { - border-inline-end-width: 1px; - border-radius: 0 4px 4px 0; - } - } + &:last-child { + border-inline-end-width: 1px; + border-radius: 0 4px 4px 0; + } + } } diff --git a/client/components/edit/ObjectSummary.module.css b/client/components/edit/ObjectSummary.module.css index 0842d2439..62562e90f 100644 --- a/client/components/edit/ObjectSummary.module.css +++ b/client/components/edit/ObjectSummary.module.css @@ -1,7 +1,7 @@ .infobox { - padding-inline: 1lh; + padding-inline: 1lh; padding-block: 1rem; - color: var(--info-text); + color: var(--info-text); background-color: var(--info); border: 1px solid var(--info-border); } @@ -11,12 +11,12 @@ } .infobox button { - min-width: unset; - padding-block: 0.5em 0.4em; - font-size: 10pt; + min-width: unset; + padding-block: 0.5em 0.4em; + font-size: 10pt; - &:not(:hover,:focus) { - background-color: white; - border-color: black; - } + &:not(:hover,:focus) { + background-color: white; + border-color: black; + } } diff --git a/client/components/edit/children/ChildList.module.css b/client/components/edit/children/ChildList.module.css index 736a19145..dca83bb2e 100644 --- a/client/components/edit/children/ChildList.module.css +++ b/client/components/edit/children/ChildList.module.css @@ -1,8 +1,8 @@ .childlist { - padding-inline: 1rem; - padding-block: 1px; - color: CanvasText; - background-color: var(--soft); + padding-inline: 1rem; + padding-block: 1px; + color: CanvasText; + background-color: var(--soft); } .childlist__list { @@ -21,40 +21,40 @@ } svg.childlist__expandicon { - font-size: 21px; - cursor: pointer; + font-size: 21px; + cursor: pointer; - &:hover, - &:focus { - color: var(--active); - } + &:hover, + &:focus { + color: var(--active); + } } .childlist__pid { - font-family: var(--family-monospace); - text-align: end; - color: var(--text-muted); + font-family: var(--family-monospace); + text-align: end; + color: var(--text-muted); } .childlist__toggles { - display: flex; - gap: 1ch; + display: flex; + gap: 1ch; } /* Nested */ .childlist__list { - .childlist { - margin-inline-start: 0.5rem; - margin-block-end: -0.25em; - padding-inline-end: 0; - border-inline-start: 1px solid var(--edge); - } + .childlist { + margin-inline-start: 0.5rem; + margin-block-end: -0.25em; + padding-inline-end: 0; + border-inline-start: 1px solid var(--edge); + } - .childlist__pagination { - margin-block: 0.25em; - font-size: 10pt; - } + .childlist__pagination { + margin-block: 0.25em; + font-size: 10pt; + } } /* Pagination alignment */ diff --git a/client/components/edit/datastream/Datastream.module.css b/client/components/edit/datastream/Datastream.module.css index 8d3693091..167f553dd 100644 --- a/client/components/edit/datastream/Datastream.module.css +++ b/client/components/edit/datastream/Datastream.module.css @@ -1,31 +1,31 @@ .datastream { - margin-block: 0.125em; - padding-block: 0.375em; - border: 1px solid transparent; + margin-block: 0.125em; + padding-block: 0.375em; + border: 1px solid transparent; } .enabled { - color: var(--selected-text); + color: var(--selected-text); background-color: var(--selected); border-color: var(--selected-border); } div[role="group"] .datastreamControlButton { - font-size: 14pt; - color: inherit; - border-color: var(--mute); - opacity: 0.75; - transition: none; + font-size: 14pt; + color: inherit; + border-color: var(--mute); + opacity: 0.75; + transition: none; - &:disabled { - opacity: 0.75; - color: var(--mute); - border-color: var(--mute); - } + &:disabled { + opacity: 0.75; + color: var(--mute); + border-color: var(--mute); + } - &:hover, - &:focus { - color: white; - background-color: black; - } + &:hover, + &:focus { + color: white; + background-color: black; + } } diff --git a/client/styles/global.css b/client/styles/global.css index 9c5c8e04d..f1910f823 100644 --- a/client/styles/global.css +++ b/client/styles/global.css @@ -1,7 +1,7 @@ @layer reset { - html { - color-scheme: light; - } + html { + color-scheme: light; + } body { padding: 0; @@ -39,10 +39,10 @@ :is(a, button, input, textarea, summary):focus, /* :focus-visible styles */ :is(a, button, input, textarea):focus-visible { - position: relative; + position: relative; outline: var(--outline-size) var(--outline-style) var(--outline-color); outline-offset: var(--outline-offset, var(--outline-size)); - z-index: 100; + z-index: 100; } /* Remove fallback :focus styles when :focus-visible is available */ @@ -82,7 +82,7 @@ } .breadcrumbs li:not(:first-child):before { - color: var(--text-muted); + color: var(--text-muted); content: " ❭ "; } @@ -94,7 +94,7 @@ padding-inline: 1rem; padding-block: 0.5rem; color: var(--button-text); - line-height: normal; + line-height: normal; text-decoration: none; background-color: var(--button-face); border: 1px solid var(--edge); diff --git a/client/styles/job-paginator.css b/client/styles/job-paginator.css index 6a9cf2d9e..0ec2cd844 100644 --- a/client/styles/job-paginator.css +++ b/client/styles/job-paginator.css @@ -1,11 +1,11 @@ /* Layout */ body:has(#paginator) { - background-color: var(--soft); + background-color: var(--soft); } .controls { - font-size: 14px; + font-size: 14px; } .pageList { @@ -171,7 +171,7 @@ label input[type="radio"] { left: -1px; padding-inline: 0.75ch; padding-block: 0.25ch; - font-family: monospace; + font-family: monospace; font-weight: 700; font-size: 10px; color: var(--mute); diff --git a/client/styles/variables.css b/client/styles/variables.css index acfbbb943..ab9b23797 100644 --- a/client/styles/variables.css +++ b/client/styles/variables.css @@ -1,10 +1,10 @@ /* Harmony colors imported in _app.tsx */ :root { - --soft: var(--zinc-100); - --edge: var(--zinc-500); - --mute: var(--zinc-700); - --text: var(--zinc-900); + --soft: var(--zinc-100); + --edge: var(--zinc-500); + --mute: var(--zinc-700); + --text: var(--zinc-900); } :root { @@ -29,12 +29,12 @@ --active: oklch(0.577 0.245 27.325); /* Tailwind red-600 */ --active-text: white; - --selected: var(--emerald-200); - --selected-text: black; + --selected: var(--emerald-200); + --selected-text: black; --selected-border: var(--emerald-500); - --info: var(--sky-100); - --info-text: var(--sky-800); + --info: var(--sky-100); + --info-text: var(--sky-800); --info-border: var(--sky-500); --success: var(--green-100); From 5feb626b8b295db7b6c662b00eb0fe7add5c1e2f Mon Sep 17 00:00:00 2001 From: Demian Katz Date: Fri, 25 Apr 2025 13:10:24 -0400 Subject: [PATCH 22/33] Update snapshots. --- .../DeleteObjectButton.test.tsx.snap | 1 + .../__snapshots__/ObjectEditor.test.tsx.snap | 4 +- .../__snapshots__/ObjectOrder.test.tsx.snap | 2 + .../__snapshots__/ObjectStatus.test.tsx.snap | 4 +- .../__snapshots__/ObjectSummary.test.tsx.snap | 10 +- .../__snapshots__/Child.test.tsx.snap | 10 +- .../__snapshots__/ChildList.test.tsx.snap | 145 +++++++++++------- .../__snapshots__/Datastream.test.tsx.snap | 2 +- .../DatastreamControlButton.test.tsx.snap | 64 +++----- .../__snapshots__/JobPaginator.test.tsx.snap | 5 - 10 files changed, 137 insertions(+), 110 deletions(-) diff --git a/client/components/edit/__snapshots__/DeleteObjectButton.test.tsx.snap b/client/components/edit/__snapshots__/DeleteObjectButton.test.tsx.snap index e778aa445..cfcd3a8e3 100644 --- a/client/components/edit/__snapshots__/DeleteObjectButton.test.tsx.snap +++ b/client/components/edit/__snapshots__/DeleteObjectButton.test.tsx.snap @@ -2,6 +2,7 @@ exports[`DeleteObjectButton renders correctly when data is loaded 1`] = `
- ObjectButtonBar +
+ ObjectButtonBar +
ObjectOrder ObjectChildCounts PID: diff --git a/client/components/edit/children/__snapshots__/Child.test.tsx.snap b/client/components/edit/children/__snapshots__/Child.test.tsx.snap index f6a94dd4f..bb5ad869c 100644 --- a/client/components/edit/children/__snapshots__/Child.test.tsx.snap +++ b/client/components/edit/children/__snapshots__/Child.test.tsx.snap @@ -49,7 +49,7 @@ exports[`Child handles empty titles appropriately 1`] = ` CopyPidButton
+
+
+   +
+
-
-
    +
    +
    +   +
    +
    -
    -
      +
      +
      +   +
      +
      -
      -
        +

        + Showing + 1 + - + 10 + of + + 10000 +

        +
        +
        + Pagination +
        +
        +   +
        +
        -
        -

        - Showing - 1 - - - 10 - of - - 10000 -

        -
        -
        - Pagination -
        +
        +
        +   +
        +
        -
        -
          +
          +
          +   +
          +
          -
          -
            +
            +
            +   +
            +
            -
            -
              ,