Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions assets/wheretf.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions web/app/activity/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { useCallback, useEffect, useState } from "react";
import Spinner from "../components/Spinner";

interface Transaction {
id: string;
Expand Down Expand Up @@ -139,8 +140,8 @@ export default function ActivityPage() {
{/* Transaction list */}
<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="flex items-center justify-center py-12 text-slate-500">
Loading...
<div className="flex items-center justify-center py-12 text-accent">
<Spinner size={32} />
</div>
) : filtered.length === 0 ? (
<div className="flex items-center justify-center py-12 text-slate-500 text-sm">
Expand Down
25 changes: 22 additions & 3 deletions web/app/components/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,32 @@ export default function Sidebar() {
<nav
className={`${width} bg-slate-800 border-r border-slate-700 flex flex-col shrink-0 transition-[width] duration-150 group/sidebar`}
>
{/* Header row: brand space + collapse chevron (appears on hover) */}
<div className="h-10 flex items-center justify-end px-2 border-b border-slate-700/50 shrink-0">
{/* Header row: logo + collapse chevron */}
<div className="h-10 flex items-center px-2 border-b border-slate-700/50 shrink-0 gap-2">
<Link href="/" className="flex items-center gap-2 min-w-0 flex-1">
<svg
viewBox="0 0 32 32"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="w-5 h-5 shrink-0 text-accent"
>
<path
d="M16 2C10.477 2 6 6.477 6 12c0 5.523 10 18 10 18s10-12.477 10-18c0-5.523-4.477-10-10-10zm0 14a4 4 0 110-8 4 4 0 010 8z"
fill="currentColor"
fillRule="evenodd"
/>
</svg>
{expanded && (
<span className="text-sm font-bold text-slate-200 truncate">
WhereTF
</span>
)}
</Link>
<button
onClick={() => setExpanded((v) => !v)}
title={`${expanded ? "Collapse" : "Expand"} sidebar (Ctrl/Cmd + \\)`}
aria-label={expanded ? "Collapse sidebar" : "Expand sidebar"}
className="w-6 h-6 rounded flex items-center justify-center text-slate-500 hover:text-slate-200 hover:bg-slate-700/70 transition-all opacity-0 group-hover/sidebar:opacity-100 focus:opacity-100"
className="w-6 h-6 rounded flex items-center justify-center text-slate-500 hover:text-slate-200 hover:bg-slate-700/70 transition-all opacity-0 group-hover/sidebar:opacity-100 focus:opacity-100 shrink-0"
>
<svg
viewBox="0 0 24 24"
Expand Down
26 changes: 26 additions & 0 deletions web/app/components/Spinner.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export default function Spinner({
size = 24,
className = "",
}: {
size?: number;
className?: string;
}) {
return (
<svg
viewBox="0 0 32 32"
fill="none"
xmlns="http://www.w3.org/2000/svg"
width={size}
height={size}
className={`animate-pulse-pin ${className}`}
role="status"
aria-label="Loading"
>
<path
d="M16 2C10.477 2 6 6.477 6 12c0 5.523 10 18 10 18s10-12.477 10-18c0-5.523-4.477-10-10-10zm0 14a4 4 0 110-8 4 4 0 010 8z"
fill="currentColor"
fillRule="evenodd"
/>
</svg>
);
}
12 changes: 12 additions & 0 deletions web/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,16 @@

@theme {
--color-accent: #ff6600;
--animate-pulse-pin: pulse-pin 1.4s ease-in-out infinite;
}

@keyframes pulse-pin {
0%, 100% {
opacity: 1;
transform: translateY(0);
}
50% {
opacity: 0.5;
transform: translateY(-12%);
}
}
3 changes: 3 additions & 0 deletions web/app/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions web/app/inserts/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import { Suspense, useCallback, useEffect, useMemo, useState } from "react";
import Spinner from "../components/Spinner";
import { CellGrid, type CellRow } from "@/app/_components/CellGrid";

interface Insert {
Expand Down Expand Up @@ -170,8 +171,8 @@ function InsertsPageInner() {

<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="p-6 text-center text-slate-500 text-sm">
Loading…
<div className="flex items-center justify-center p-6 text-accent">
<Spinner size={24} />
</div>
) : inserts.length === 0 ? (
<div className="p-6 text-center text-slate-500 text-sm">
Expand Down
5 changes: 3 additions & 2 deletions web/app/items/ItemGrid.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { useMemo } from "react";
import Spinner from "../components/Spinner";

interface RichItem {
id: string;
Expand Down Expand Up @@ -68,7 +69,7 @@
sortBy,
sortDirection,
onSort,
onRefresh,

Check warning on line 72 in web/app/items/ItemGrid.tsx

View workflow job for this annotation

GitHub Actions / lint

'onRefresh' is defined but never used
onCreateItem,
}: {
items: RichItem[];
Expand Down Expand Up @@ -188,9 +189,9 @@
<tr>
<td
colSpan={columns.length}
className="px-3 py-8 text-center text-slate-500"
className="px-3 py-8 text-center text-accent"
>
Loading...
<Spinner size={24} />
</td>
</tr>
) : items.length === 0 ? (
Expand Down
5 changes: 3 additions & 2 deletions web/app/items/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { useSearchParams, useRouter } from "next/navigation";
import { Suspense, useCallback, useEffect, useState } from "react";
import FilterPanel from "./FilterPanel";
import Spinner from "../components/Spinner";
import ItemGrid from "./ItemGrid";
import ItemDetail from "./ItemDetail";
import CreateItemModal from "./CreateItemModal";
Expand Down Expand Up @@ -292,8 +293,8 @@ export default function ItemsPage() {
return (
<Suspense
fallback={
<div className="flex-1 flex items-center justify-center text-slate-500">
Loading...
<div className="flex-1 flex items-center justify-center text-accent">
<Spinner size={32} />
</div>
}
>
Expand Down
1 change: 1 addition & 0 deletions web/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Sidebar from "./components/Sidebar";
export const metadata: Metadata = {
title: "WhereTF",
description: "R&D workshop item tracker",
icons: { icon: "/icon.svg" },
};

export default function RootLayout({
Expand Down
5 changes: 3 additions & 2 deletions web/app/modules/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { useParams, useRouter } from "next/navigation";
import Link from "next/link";
import { useCallback, useEffect, useState, useMemo } from "react";
import Spinner from "../../components/Spinner";
import { CellGrid } from "@/app/_components/CellGrid";

// --- Types ---
Expand Down Expand Up @@ -898,8 +899,8 @@ export default function ModuleDetailPage() {

if (loading) {
return (
<div className="flex-1 flex items-center justify-center text-slate-500">
Loading...
<div className="flex-1 flex items-center justify-center text-accent">
<Spinner size={32} />
</div>
);
}
Expand Down
5 changes: 3 additions & 2 deletions web/app/modules/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useCallback, useEffect, useState } from "react";
import Spinner from "../components/Spinner";

interface Module {
id: string;
Expand Down Expand Up @@ -121,8 +122,8 @@ export default function ModulesPage() {

if (loading) {
return (
<div className="flex-1 flex items-center justify-center text-slate-500">
Loading…
<div className="flex-1 flex items-center justify-center text-accent">
<Spinner size={32} />
</div>
);
}
Expand Down
17 changes: 7 additions & 10 deletions web/app/taxonomy/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { useCallback, useEffect, useRef, useState } from "react";
import CreateFromDesignationDialog from "@/app/items/CreateFromDesignationDialog";
import GenerateSetDialog from "@/app/items/GenerateSetDialog";
import Spinner from "../components/Spinner";
import BulkAspectImport from "./BulkAspectImport";
import { parseSiValue } from "@/lib/siPrefix";

Expand Down Expand Up @@ -698,7 +699,7 @@ export function AspectsTab() {
</div>
<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="p-4 text-center text-slate-500 text-sm">Loading...</div>
<div className="flex items-center justify-center p-4 text-accent"><Spinner size={20} /></div>
) : aspects.length === 0 ? (
<div className="p-4 text-center text-slate-500 text-sm">
No aspects defined yet.
Expand Down Expand Up @@ -1045,8 +1046,8 @@ function AspectParameterMatrix({

if (loading) {
return (
<div className="flex-1 flex items-center justify-center text-slate-500 text-sm">
Loading matrix…
<div className="flex-1 flex items-center justify-center text-accent">
<Spinner size={32} />
</div>
);
}
Expand Down Expand Up @@ -1686,9 +1687,7 @@ export function ParametersTab() {
</div>
<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="p-4 text-center text-slate-500 text-sm">
Loading…
</div>
<div className="flex items-center justify-center p-4 text-accent"><Spinner size={20} /></div>
) : filteredParamDefs.length === 0 ? (
<div className="p-4 text-center text-slate-500 text-sm">
{paramDefs.length === 0 ? "No parameters yet." : "No matches."}
Expand Down Expand Up @@ -2525,9 +2524,7 @@ export function CategoriesTab() {
</div>
<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="p-4 text-center text-slate-500 text-sm">
Loading…
</div>
<div className="flex items-center justify-center p-4 text-accent"><Spinner size={20} /></div>
) : filtered.length === 0 ? (
<div className="p-4 text-center text-slate-500 text-sm">
{categories.length === 0 ? "No categories yet." : "No matches."}
Expand Down Expand Up @@ -3075,7 +3072,7 @@ export function StandardsTab() {
)}
<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="p-3 text-xs text-slate-500">Loading…</div>
<div className="flex items-center justify-center p-3 text-accent"><Spinner size={16} /></div>
) : standards.length === 0 ? (
<div className="p-3 text-xs text-slate-500 italic">None yet</div>
) : (
Expand Down
5 changes: 3 additions & 2 deletions web/app/templates/_components/TemplateEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { useCallback, useEffect, useMemo, useState } from "react";
import { getGridLabel } from "@/lib/gridLabels";
import Spinner from "../../components/Spinner";

type Origin = "top-left" | "top-right" | "bottom-left" | "bottom-right";

Expand Down Expand Up @@ -442,8 +443,8 @@ export default function TemplateEditor({

if (loading) {
return (
<div className="flex-1 flex items-center justify-center text-slate-500">
Loading…
<div className="flex-1 flex items-center justify-center text-accent">
<Spinner size={32} />
</div>
);
}
Expand Down
9 changes: 5 additions & 4 deletions web/app/templates/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import { Suspense, useCallback, useEffect, useState } from "react";
import Spinner from "../components/Spinner";
import TemplateEditor from "./_components/TemplateEditor";

interface Template {
Expand Down Expand Up @@ -92,8 +93,8 @@ function TemplatesPageInner() {

<div className="flex-1 overflow-y-auto">
{loading ? (
<div className="p-6 text-center text-slate-500 text-sm">
Loading…
<div className="flex items-center justify-center p-6 text-accent">
<Spinner size={24} />
</div>
) : templates.length === 0 ? (
<div className="p-6 text-center text-slate-500 text-sm">
Expand Down Expand Up @@ -193,8 +194,8 @@ export default function TemplatesPage() {
return (
<Suspense
fallback={
<div className="flex-1 flex items-center justify-center text-slate-500">
Loading…
<div className="flex-1 flex items-center justify-center text-accent">
<Spinner size={32} />
</div>
}
>
Expand Down
1 change: 0 additions & 1 deletion web/public/file.svg

This file was deleted.

1 change: 0 additions & 1 deletion web/public/globe.svg

This file was deleted.

3 changes: 3 additions & 0 deletions web/public/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion web/public/next.svg

This file was deleted.

1 change: 0 additions & 1 deletion web/public/vercel.svg

This file was deleted.

1 change: 0 additions & 1 deletion web/public/window.svg

This file was deleted.

Loading