diff --git a/web-interface/bun.lock b/web-interface/bun.lock index 2727e0e..b37b8a5 100644 --- a/web-interface/bun.lock +++ b/web-interface/bun.lock @@ -1,6 +1,5 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "web-interface", @@ -14,12 +13,12 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "tailwindcss": "^4.1.18", + "use-immer": "^0.11.0", }, "devDependencies": { "@tailwindcss/typography": "^0.5.16", "@tanstack/devtools-vite": "latest", "@tanstack/eslint-config": "latest", - "@tanstack/router-plugin": "latest", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^22.10.2", @@ -618,6 +617,8 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "immer": ["immer@11.1.4", "", {}, "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], @@ -850,6 +851,8 @@ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "use-immer": ["use-immer@0.11.0", "", { "peerDependencies": { "immer": ">=8.0.0", "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0" } }, "sha512-RNAqi3GqsWJ4bcCd4LMBgdzvPmTABam24DUaFiKfX9s3MSorNRz9RDZYJkllJoMHUxVLMDetwAuCDeyWNrp1yA=="], + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], diff --git a/web-interface/package.json b/web-interface/package.json index a4e366c..b9e0451 100644 --- a/web-interface/package.json +++ b/web-interface/package.json @@ -23,7 +23,8 @@ "lucide-react": "^0.545.0", "react": "^19.2.0", "react-dom": "^19.2.0", - "tailwindcss": "^4.1.18" + "tailwindcss": "^4.1.18", + "use-immer": "^0.11.0" }, "devDependencies": { "@tailwindcss/typography": "^0.5.16", diff --git a/web-interface/src/components/Buttons.tsx b/web-interface/src/components/Buttons.tsx index 6d99004..1225fc8 100644 --- a/web-interface/src/components/Buttons.tsx +++ b/web-interface/src/components/Buttons.tsx @@ -1,26 +1,43 @@ +import type { ReactNode } from 'react' + const variantStyles = { success: 'bg-green-200 text-green-800 hover:bg-green-300', warning: 'bg-yellow-200 text-yellow-800 hover:bg-yellow-300', danger: 'bg-red-200 text-red-800 hover:bg-red-300', + normal: 'bg-blue-200 text-blue-800 hover:bg-blue-300', + disabled: 'bg-gray-200 text-gray-800', } +const fontSizeStyles = { + xs: 'text-xs', + sm: 'text-sm', + base: 'text-base', + lg: 'text-lg', + xl: 'text-xl', +}; + + type ButtonVariant = keyof typeof variantStyles +type ButtonFontSize = keyof typeof fontSizeStyles export function Button({ + children, onClick, - text, variant, + fontSize, }: { + children: ReactNode onClick: () => void - text: string variant: ButtonVariant + fontSize: ButtonFontSize }) { return ( ) } diff --git a/web-interface/src/components/Navbar.tsx b/web-interface/src/components/Navbar.tsx index 09e74d3..79f01d5 100644 --- a/web-interface/src/components/Navbar.tsx +++ b/web-interface/src/components/Navbar.tsx @@ -52,7 +52,7 @@ export default function Navbar() { > {dropdown && ( -
+