-
+
{rows.length === 0
? "No planning parameter data for this site."
: "No planning parameter data matches the current filters."}
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.test.ts b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.test.ts
new file mode 100644
index 00000000000..abe90005a43
--- /dev/null
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.test.ts
@@ -0,0 +1,38 @@
+import { describe, expect, it } from "vitest";
+
+import { sortPlanningRows } from "./helpers";
+
+import type { PlanningRow } from "./row-types";
+
+const planningRow = (
+ label: string,
+ periodMaterialValue: number | null,
+): PlanningRow =>
+ ({
+ label,
+ periodMaterialValue,
+ }) as unknown as PlanningRow;
+
+describe("sortPlanningRows material value", () => {
+ const rows = [
+ planningRow("missing", null),
+ planningRow("high", 500),
+ planningRow("low", 100),
+ ];
+
+ it("sorts ascending with missing values last", () => {
+ expect(
+ sortPlanningRows(rows, { key: "materialValue", dir: "asc" }).map(
+ (row) => row.label,
+ ),
+ ).toEqual(["low", "high", "missing"]);
+ });
+
+ it("sorts descending with missing values last", () => {
+ expect(
+ sortPlanningRows(rows, { key: "materialValue", dir: "desc" }).map(
+ (row) => row.label,
+ ),
+ ).toEqual(["high", "low", "missing"]);
+ });
+});
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.ts b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.ts
index b1d95a3edbc..74337cab19e 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.ts
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/helpers.ts
@@ -165,6 +165,13 @@ export function sortPlanningRows(
: Number.POSITIVE_INFINITY;
va = left.deviationPct ?? nullRank;
vb = right.deviationPct ?? nullRank;
+ } else if (sort.key === "materialValue") {
+ const nullRank =
+ sort.dir === "desc"
+ ? Number.NEGATIVE_INFINITY
+ : Number.POSITIVE_INFINITY;
+ va = left.periodMaterialValue ?? nullRank;
+ vb = right.periodMaterialValue ?? nullRank;
} else if (sort.key === "exceeding") {
va = left.pct_exceeding_plan ?? 0;
vb = right.pct_exceeding_plan ?? 0;
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/row-types.ts b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/row-types.ts
index f619c488984..3789d1b7f05 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/row-types.ts
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/row-types.ts
@@ -7,6 +7,7 @@ export type Tab = "dwell" | "planning" | "trends" | "suppliers";
export type SortKey =
| "median"
| "cost"
+ | "materialValue"
| "moq"
| "safetyStock"
| "material"
@@ -46,6 +47,7 @@ export type DwellRow = SiteNode & {
};
export type PlanningRow = SiteNode & {
+ periodMaterialValue: number | null;
/** Null when the applicable plan is zero: the row remains visible but no percentage is meaningful. */
deviationPct: number | null;
trendPct: number | null;
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/use-site-overview-rows.ts b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/use-site-overview-rows.ts
index 059d50b5b6c..2861a764a4d 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/use-site-overview-rows.ts
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/use-site-overview-rows.ts
@@ -1,7 +1,11 @@
import { useEffect, useMemo, useState } from "react";
import { DWELL_TYPES } from "../../shared/categories";
-import { useCostParams, useOutlierSetting } from "../../shared/cost";
+import {
+ computePeriodMaterialValue,
+ useCostParams,
+ useOutlierSetting,
+} from "../../shared/cost";
import { fetchSupplierPerformance } from "../../shared/data";
import { selectStat, useBaseMeasure } from "../../shared/measure-context";
import { applyOutlierSelectionToNode } from "../../shared/outlier-selection";
@@ -130,6 +134,10 @@ export function useSiteOverviewRows({
return new Map(historicalNodes.map((count) => [siteNodeKey(count), count]));
}, [historicalNodes]);
+ const sourceNodesByKey = useMemo(() => {
+ return new Map(dedupedNodes.map((count) => [siteNodeKey(count), count]));
+ }, [dedupedNodes]);
+
const planningVisibleNodes = useMemo(() => {
if (!excludeLowSamples) {
return filteredNodes;
@@ -222,6 +230,7 @@ export function useSiteOverviewRows({
return [];
}
const historical = historicalNodesByKey.get(siteNodeKey(count)) ?? count;
+ const source = sourceNodesByKey.get(siteNodeKey(count)) ?? count;
const trend = computeTimingTrend(historical, timeRange, measure);
const deviationPct =
plan <= 0
@@ -237,13 +246,23 @@ export function useSiteOverviewRows({
return {
...count,
plan,
+ periodMaterialValue: computePeriodMaterialValue(
+ source.material_value,
+ timeRange,
+ ),
deviationPct,
trendPct: trend.pctChange,
previousValue: trend.previousValue,
previousTrendN: trend.previousN,
};
});
- }, [planningVisibleNodes, historicalNodesByKey, timeRange, measure]);
+ }, [
+ planningVisibleNodes,
+ historicalNodesByKey,
+ sourceNodesByKey,
+ timeRange,
+ measure,
+ ]);
const windowedSupplier = useMemo(() => {
if (!supplierData) {
diff --git a/libs/@local/hash-isomorphic-utils/src/production-schedule/schema.ts b/libs/@local/hash-isomorphic-utils/src/production-schedule/schema.ts
index c437159db17..091389d47af 100644
--- a/libs/@local/hash-isomorphic-utils/src/production-schedule/schema.ts
+++ b/libs/@local/hash-isomorphic-utils/src/production-schedule/schema.ts
@@ -254,7 +254,6 @@ export const productionScheduleDispatchEventSchema = z.strictObject({
});
const scheduleBaseShape = {
- schema_version: z.literal("1.1"),
artifact_type: z.literal("production_schedule"),
product_id: nonEmptyString,
product_name: nonEmptyString,
@@ -273,6 +272,7 @@ const sourceBaseShape = {
export const productionScheduleLegacySchema = z.strictObject({
...scheduleBaseShape,
+ schema_version: z.literal("1.1"),
artifact_version: z.union([z.literal("1.0"), z.literal("1.1")]),
lanes: z.array(productionScheduleLegacyLaneSchema).min(1),
consumption_evidence: z.array(productionScheduleConsumptionEvidenceSchema),
@@ -285,6 +285,7 @@ export const productionScheduleLegacySchema = z.strictObject({
export const productionScheduleV12Schema = z.strictObject({
...scheduleBaseShape,
+ schema_version: z.literal("1.2"),
artifact_version: z.literal("1.2"),
lanes: z.array(productionScheduleV12LaneSchema).min(1),
consumption_events: z.array(productionScheduleConsumptionEventSchema),
From f1d7652249ae72d84e6ea67c2ca8d570313bb8fb Mon Sep 17 00:00:00 2001
From: Ciaran Morinan
Date: Mon, 27 Jul 2026 13:10:47 +0100
Subject: [PATCH 2/4] fix potential stylesheet cascade issues, add regression
test for slideover visibility
---
.../shared/action-button-styles.ts | 9 ++--
.../supply-chain/shared/action-buttons.tsx | 28 +++++++----
.../supply-chain/shared/docs/docs-modal.tsx | 11 +++--
.../supply-chain/shared/header-actions.tsx | 8 ++--
.../supply-chain/shared/segmented-control.tsx | 2 +-
.../supply-chain/shared/slide-over.test.tsx | 48 +++++++++++++++++++
.../pages/supply-chain/shared/slide-over.tsx | 5 +-
.../supply-chain/shared/step-detail-panel.tsx | 2 +-
.../product/e2e-what-if/what-if-kpis.tsx | 4 +-
.../production-schedule/schedule-summary.tsx | 16 +++----
.../supply-chain-data-shell/site.tsx | 8 ++--
.../site/shared/filter-menu.tsx | 7 ++-
12 files changed, 108 insertions(+), 40 deletions(-)
create mode 100644 apps/hash-frontend/src/pages/supply-chain/shared/slide-over.test.tsx
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/action-button-styles.ts b/apps/hash-frontend/src/pages/supply-chain/shared/action-button-styles.ts
index 21d88385cb3..e740947d73c 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/action-button-styles.ts
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/action-button-styles.ts
@@ -28,15 +28,18 @@ export const neutralActionButtonStyle = css({
borderRadius: "sm",
borderWidth: "1px",
borderStyle: "solid",
- borderColor: "bd.subtle",
- bg: "bgSolid.min",
px: "2.5",
py: "1",
textStyle: "xs",
lineHeight: "none",
fontWeight: "medium",
- color: "fg.muted",
cursor: "pointer",
whiteSpace: "nowrap",
+});
+
+export const neutralActionButtonToneStyle = css({
+ borderColor: "bd.subtle",
+ bg: "bgSolid.min",
+ color: "fg.muted",
_hover: { borderColor: "bd.strong", color: "fg.heading" },
});
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/action-buttons.tsx b/apps/hash-frontend/src/pages/supply-chain/shared/action-buttons.tsx
index b9f7c46fba4..ac12520d56b 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/action-buttons.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/action-buttons.tsx
@@ -5,6 +5,7 @@ import { Link } from "../../../shared/ui/link";
import {
briefLinkStyle,
neutralActionButtonStyle,
+ neutralActionButtonToneStyle,
} from "./action-button-styles";
import { StatusIcon } from "./status-dialog";
@@ -22,13 +23,12 @@ const docsButton = css({
borderWidth: "1px",
borderStyle: "solid",
borderColor: "bd.subtle",
- bg: "bgSolid.min",
- color: "fg.subtle",
cursor: "pointer",
transition: "colors",
_hover: { color: "fg.heading", bg: "bg.subtle" },
});
const docsButtonActive = css({ color: "fg.heading", bg: "bg.subtle" });
+const docsButtonInactive = css({ color: "fg.subtle", bg: "bgSolid.min" });
const statusSuccess = css({
borderColor: "status.success.bd.subtle",
bg: "status.success.bg.subtle",
@@ -62,7 +62,11 @@ export const DocsIconButton = ({
return (
@@ -104,16 +108,25 @@ export const NeutralActionButton = ({
icon,
children,
className,
+ tone = "neutral",
}: {
onClick: MouseEventHandler;
icon?: ReactNode;
children: ReactNode;
className?: string;
+ tone?: StatusActionState["tone"];
}) => {
+ const toneClassName =
+ tone === "success"
+ ? statusSuccess
+ : tone === "danger"
+ ? statusDanger
+ : neutralActionButtonToneStyle;
+
return (
{icon}
@@ -136,11 +149,8 @@ export const StatusActionButton = ({
}
- className={cx(
- state.tone === "success" && statusSuccess,
- state.tone === "danger" && statusDanger,
- className,
- )}
+ className={className}
+ tone={state.tone}
>
{state.label}
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/docs/docs-modal.tsx b/apps/hash-frontend/src/pages/supply-chain/shared/docs/docs-modal.tsx
index 9e959011950..f5b4a6ece77 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/docs/docs-modal.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/docs/docs-modal.tsx
@@ -95,13 +95,11 @@ const navEntry = css({
pr: "4",
py: "1",
textStyle: "sm",
- color: "fg.subtle",
cursor: "pointer",
bg: "[transparent]",
border: "none",
borderLeftWidth: "2px",
borderLeftStyle: "solid",
- borderLeftColor: "[transparent]",
_hover: { color: "fg.muted" },
});
const navEntryActive = css({
@@ -109,6 +107,10 @@ const navEntryActive = css({
fontWeight: "medium",
borderLeftColor: "fg.heading",
});
+const navEntryInactive = css({
+ color: "fg.subtle",
+ borderLeftColor: "[transparent]",
+});
const content = css({
flex: "1",
minW: "0",
@@ -334,8 +336,9 @@ export const DocsModal = ({
className={cx(
navEntry,
section.id === activeSection &&
- entry.id === activeEntryId &&
- navEntryActive,
+ entry.id === activeEntryId
+ ? navEntryActive
+ : navEntryInactive,
)}
onClick={() =>
navigate({ section: section.id, sub: entry.id })
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/header-actions.tsx b/apps/hash-frontend/src/pages/supply-chain/shared/header-actions.tsx
index dbae5c2044a..886ad821cf8 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/header-actions.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/header-actions.tsx
@@ -39,13 +39,12 @@ const iconButton = css({
borderWidth: "1px",
borderStyle: "solid",
borderColor: "bd.subtle",
- bg: "bgSolid.min",
- color: "fg.subtle",
cursor: "pointer",
transition: "colors",
_hover: { color: "fg.heading", bg: "bg.subtle" },
});
const iconButtonActive = css({ color: "fg.heading", bg: "bg.subtle" });
+const iconButtonInactive = css({ color: "fg.subtle", bg: "bgSolid.min" });
const settingsWrap = css({
mt: "3",
borderTopWidth: "1px",
@@ -143,7 +142,10 @@ export const HeaderActionButtons = ({
{
+ cleanup();
+ vi.restoreAllMocks();
+});
+
+describe("SlideOver", () => {
+ it("moves the panel and backdrop into their visible state", async () => {
+ const animationFrames: FrameRequestCallback[] = [];
+ vi.spyOn(window, "requestAnimationFrame").mockImplementation((callback) => {
+ animationFrames.push(callback);
+ return animationFrames.length;
+ });
+
+ render(
+ {}}>
+ Step content
+ ,
+ );
+
+ const dialog = screen.getByRole("dialog", { name: "Step details" });
+ const positioner = dialog.parentElement as HTMLElement;
+ const backdrop = document.querySelector(
+ '[data-scope="dialog"][data-part="backdrop"]',
+ );
+
+ expect(backdrop).not.toBeNull();
+ expect(positioner.style.right).toBe("-960px");
+ expect(backdrop?.style.opacity).toBe("0");
+
+ act(() => {
+ const queuedFrames = animationFrames.splice(0);
+ for (const animationFrame of queuedFrames) {
+ animationFrame(0);
+ }
+ });
+
+ await waitFor(() => {
+ expect(positioner.style.right).toBe("0px");
+ expect(backdrop?.style.opacity).toBe("1");
+ });
+ });
+});
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx b/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx
index cdb3feff6d0..a4171a3a682 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx
@@ -65,10 +65,8 @@ const backdropBase = css({
inset: "0",
bg: "neutral.a80",
zIndex: "overlay",
- opacity: "[0]",
transition: "[opacity 200ms ease-out]",
});
-const backdropVisible = css({ opacity: "[1]" });
const positionerBase = css({
position: "fixed",
@@ -123,7 +121,8 @@ export const SlideOver = ({
>
+
{label}
{value}
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/product/production-schedule/schedule-summary.tsx b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/product/production-schedule/schedule-summary.tsx
index 446150e1b58..a85c1daa114 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/product/production-schedule/schedule-summary.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/product/production-schedule/schedule-summary.tsx
@@ -1,4 +1,5 @@
import { css, cx } from "@hashintel/ds-helpers/css";
+import { token } from "@hashintel/ds-helpers/tokens";
const INVENTORY_DWELL_COLOR = "#f3f8ff";
const USED_ELSEWHERE_HATCH =
@@ -131,15 +132,12 @@ export const ProductionScheduleSummary = ({
{hasOverDepletedInventory && (
Over-depleted inventory
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site.tsx b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site.tsx
index 658e94e1da7..40a13f20079 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site.tsx
@@ -196,11 +196,10 @@ const SiteSearchInput = ({
const settingsCollapse = css({
display: "grid",
- gridTemplateRows: "0fr",
- opacity: "0",
transition: "[grid-template-rows 180ms ease, opacity 160ms ease]",
overflow: "hidden",
});
+const settingsCollapseClosed = css({ gridTemplateRows: "0fr", opacity: "0" });
const settingsCollapseOpen = css({ gridTemplateRows: "1fr", opacity: "1" });
const settingsCollapseInner = css({ minH: "0", overflow: "hidden" });
@@ -589,7 +588,10 @@ export const SiteOverview = ({
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/filter-menu.tsx b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/filter-menu.tsx
index 4375c425fa2..1ce9e40563f 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/filter-menu.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/shared/filter-menu.tsx
@@ -29,12 +29,12 @@ const triggerButton = css({
justifyContent: "center",
p: "0.5",
borderRadius: "sm",
- color: "fg.subtle",
cursor: "pointer",
transition: "colors",
_hover: { bg: "bg.subtle" },
});
const triggerActive = css({ color: "[#2563eb]" });
+const triggerInactive = css({ color: "fg.subtle" });
const content = css({
display: "flex",
@@ -206,7 +206,10 @@ export const FilterMenu = ({
From e9989a5d5df841b4f9429c148747e20c53daaeb4 Mon Sep 17 00:00:00 2001
From: Ciaran Morinan
Date: Mon, 27 Jul 2026 17:45:37 +0100
Subject: [PATCH 3/4] fixes to slideover open/close animation
---
.../supply-chain/shared/slide-over.test.tsx | 55 +++++++++++++++++--
.../pages/supply-chain/shared/slide-over.tsx | 26 +++++----
2 files changed, 65 insertions(+), 16 deletions(-)
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.test.tsx b/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.test.tsx
index 3acee97fce9..c775204676d 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.test.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.test.tsx
@@ -1,8 +1,15 @@
// @vitest-environment jsdom
-import { act, cleanup, render, screen, waitFor } from "@testing-library/react";
+import {
+ act,
+ cleanup,
+ fireEvent,
+ render,
+ screen,
+ waitFor,
+} from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
-import { SlideOver } from "./slide-over";
+import { SlideOver, SlideOverClose } from "./slide-over";
afterEach(() => {
cleanup();
@@ -30,7 +37,9 @@ describe("SlideOver", () => {
);
expect(backdrop).not.toBeNull();
- expect(positioner.style.right).toBe("-960px");
+ expect(positioner.style.inset).toBe("0");
+ expect(positioner.style.right).toBe("");
+ expect(dialog.style.right).toBe("-960px");
expect(backdrop?.style.opacity).toBe("0");
act(() => {
@@ -41,8 +50,46 @@ describe("SlideOver", () => {
});
await waitFor(() => {
- expect(positioner.style.right).toBe("0px");
+ expect(dialog.style.right).toBe("0px");
expect(backdrop?.style.opacity).toBe("1");
});
});
+
+ it("slides the panel right without moving its viewport positioner on close", () => {
+ const animationFrames: FrameRequestCallback[] = [];
+ vi.spyOn(window, "requestAnimationFrame").mockImplementation((callback) => {
+ animationFrames.push(callback);
+ return animationFrames.length;
+ });
+
+ render(
+ {}}>
+
+ {(close) => (
+
+ Close
+
+ )}
+
+ ,
+ );
+
+ const dialog = screen.getByRole("dialog", { name: "Step details" });
+ const positioner = dialog.parentElement as HTMLElement;
+
+ act(() => {
+ const queuedFrames = animationFrames.splice(0);
+ for (const animationFrame of queuedFrames) {
+ animationFrame(0);
+ }
+ });
+ expect(dialog.style.right).toBe("0px");
+
+ fireEvent.click(screen.getByRole("button", { name: "Close" }));
+
+ expect(positioner.style.inset).toBe("0");
+ expect(positioner.style.right).toBe("");
+ expect(dialog.style.right).toBe("-960px");
+ expect(dialog.style.transition).toBe("right 200ms ease-out");
+ });
});
diff --git a/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx b/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx
index a4171a3a682..15ad6c10a55 100644
--- a/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/shared/slide-over.tsx
@@ -18,12 +18,13 @@ import { css, cx } from "@hashintel/ds-helpers/css";
* click. Portals into the supply-chain layout scope so tokens resolve. Caller
* owns header + body.
*
- * Enter/exit animation: the panel slides via the positioner's `right` offset and
- * the backdrop fades, driven by a local `visible` flag. We deliberately animate
- * `right` (not `transform`) so no containing block is created — the data-table
- * modal renders inline inside the content with `position: fixed` and must stay
- * relative to the viewport. On close we play the exit animation, then defer the
- * caller's `onClose` (which unmounts us) until the transition finishes.
+ * Enter/exit animation: the panel slides via its `right` offset while the
+ * full-viewport positioner stays fixed and the backdrop fades, driven by a
+ * local `visible` flag. We deliberately animate `right` (not `transform`) so no
+ * containing block is created — the data-table modal renders inline inside the
+ * content with `position: fixed` and must stay relative to the viewport. On
+ * close we play the exit animation, then defer the caller's `onClose` (which
+ * unmounts us) until the transition finishes.
*/
const EXIT_MS = 200;
@@ -70,14 +71,9 @@ const backdropBase = css({
const positionerBase = css({
position: "fixed",
- top: "0",
- bottom: "0",
- right: "[-960px]",
display: "flex",
zIndex: "modal",
- transition: "[right 200ms ease-out]",
});
-const positionerVisible = css({ right: "0" });
const contentStyles = css({
height: "full",
@@ -125,11 +121,17 @@ export const SlideOver = ({
style={{ opacity: visible ? 1 : 0 }}
/>
{children}
From 3ca38f98588452c4b9b423afc114a9dde9ed07ab Mon Sep 17 00:00:00 2001
From: Ciaran Morinan
Date: Mon, 27 Jul 2026 17:59:24 +0100
Subject: [PATCH 4/4] linting / PR feedback
---
.../supply-chain-data-shell/site/planning-table.tsx | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/planning-table.tsx b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/planning-table.tsx
index 610582a58d8..2a72eeed117 100644
--- a/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/planning-table.tsx
+++ b/apps/hash-frontend/src/pages/supply-chain/supply-chain-data-shell/site/planning-table.tsx
@@ -19,7 +19,6 @@ import {
type StatusActionLabel,
type StatusStore,
} from "../../shared/status";
-import { useTimeRange } from "../../shared/time-range-context";
import { TrendIndicator } from "../../shared/trend-indicator";
import { buildColumnFilter, countBy } from "./shared/column-filter";
import { ColumnHeader } from "./shared/column-header";
@@ -133,7 +132,6 @@ export const PlanningTable = ({
onStatusHiddenChange: (next: Set) => void;
}) => {
const { measure } = useBaseMeasure();
- const { timeRange } = useTimeRange();
const measureLabel = MEASURE_LABELS[measure];
const {
@@ -243,7 +241,7 @@ export const PlanningTable = ({