From 672917ac928ca2f07adfaa2a49dd8c3418ecf587 Mon Sep 17 00:00:00 2001 From: Kenneth Date: Sun, 26 Jan 2025 01:22:33 +0000 Subject: [PATCH] initial implementation --- app/app.css | 8 +- app/components/button.tsx | 21 +++ app/queue.ts | 44 +++++ app/root.tsx | 122 ++++++------- app/routes.ts | 4 +- app/routes/home.tsx | 350 ++++++++++++++++++++++++++++++++++++- app/use-ui-mode.ts | 23 +++ app/welcome/logo-dark.svg | 23 --- app/welcome/logo-light.svg | 23 --- app/welcome/welcome.tsx | 89 ---------- biome.json | 31 ++++ bun.lockb | Bin 143474 -> 148636 bytes package.json | 12 +- public/favicon.ico | Bin 15086 -> 0 bytes 14 files changed, 538 insertions(+), 212 deletions(-) create mode 100644 app/components/button.tsx create mode 100644 app/queue.ts create mode 100644 app/use-ui-mode.ts delete mode 100644 app/welcome/logo-dark.svg delete mode 100644 app/welcome/logo-light.svg delete mode 100644 app/welcome/welcome.tsx create mode 100644 biome.json delete mode 100644 public/favicon.ico diff --git a/app/app.css b/app/app.css index 303fe15..3c43e72 100644 --- a/app/app.css +++ b/app/app.css @@ -4,9 +4,9 @@ html, body { - @apply bg-white dark:bg-gray-950; + @apply bg-white dark:bg-neutral-900; - @media (prefers-color-scheme: dark) { - color-scheme: dark; - } + @media (prefers-color-scheme: dark) { + color-scheme: dark; + } } diff --git a/app/components/button.tsx b/app/components/button.tsx new file mode 100644 index 0000000..08f1d03 --- /dev/null +++ b/app/components/button.tsx @@ -0,0 +1,21 @@ +import clsx from "clsx" + +function Button({ + className, + ...props +}: React.DetailedHTMLProps< + React.ButtonHTMLAttributes, + HTMLButtonElement +>) { + return ( + + ) : null} + + + ))} + {isAddingStage ? ( +
  • + +
  • + ) : null} + + {!isAddingStage ? ( +
    + + + + +
    + ) : ( +
    + + +
    + )} + + ) +}) + +function AddApplicationForm() { + const [isAddingEntry, setIsAddingEntry] = useState(false) + const addEntry = useStore((state) => state.addEntry) + const hasEntry = useStore((state) => state.hasEntry) + const inputRef = useRef(null) + + function onAddButtonClick() { + if (!isAddingEntry) { + setIsAddingEntry(true) + } else if (inputRef.current) { + const entryName = inputRef.current.value + if (hasEntry(entryName)) { + alert(`There is already an application named ${entryName}!`) + } else { + addEntry(entryName) + setIsAddingEntry(false) + } + } + } + + function cancelEntry() { + setIsAddingEntry(false) + } + + return ( +
    + {isAddingEntry ? ( + + ) : null} +
    + + {isAddingEntry ? : null} +
    +
    + ) } diff --git a/app/use-ui-mode.ts b/app/use-ui-mode.ts new file mode 100644 index 0000000..7798056 --- /dev/null +++ b/app/use-ui-mode.ts @@ -0,0 +1,23 @@ +import { useEffect, useState } from "react" + +function useUiMode() { + const [mode, setMode] = useState<"light" | "dark">("light") + + useEffect(() => { + const query = window.matchMedia("(prefers-color-scheme: dark)") + setMode(query.matches ? "dark" : "light") + + function onChange(event: MediaQueryListEvent) { + setMode(event.matches ? "dark" : "light") + } + + query.addEventListener("change", onChange) + return () => { + query.removeEventListener("change", onChange) + } + }, []) + + return mode +} + +export { useUiMode } diff --git a/app/welcome/logo-dark.svg b/app/welcome/logo-dark.svg deleted file mode 100644 index dd82028..0000000 --- a/app/welcome/logo-dark.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/welcome/logo-light.svg b/app/welcome/logo-light.svg deleted file mode 100644 index 7328492..0000000 --- a/app/welcome/logo-light.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/welcome/welcome.tsx b/app/welcome/welcome.tsx deleted file mode 100644 index 8ac6e1d..0000000 --- a/app/welcome/welcome.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import logoDark from "./logo-dark.svg"; -import logoLight from "./logo-light.svg"; - -export function Welcome() { - return ( -
    -
    -
    -
    - React Router - React Router -
    -
    -
    - -
    -
    -
    - ); -} - -const resources = [ - { - href: "https://reactrouter.com/docs", - text: "React Router Docs", - icon: ( - - - - ), - }, - { - href: "https://rmx.as/discord", - text: "Join Discord", - icon: ( - - - - ), - }, -]; diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..bde8525 --- /dev/null +++ b/biome.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "asNeeded" + } + } +} diff --git a/bun.lockb b/bun.lockb index 772c14a191cebd95da5a2634453735ecea8407d9..fec5af0c887249f6aa0fb15e33f608155a055765 100755 GIT binary patch delta 29982 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 MJ#v@u?>ck-54bUYqW}N^ delta 26526 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 X_*LMplcJz#<9lLphW37SvH1T0ZU`^a diff --git a/package.json b/package.json index 778141f..35b9281 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,17 @@ "dependencies": { "@react-router/node": "^7.1.3", "@react-router/serve": "^7.1.3", + "clsx": "^2.1.1", + "immer": "^10.1.1", "isbot": "^5.1.17", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router": "^7.1.3" + "react-google-charts": "^5.2.1", + "react-router": "^7.1.3", + "zustand": "^5.0.3" }, "devDependencies": { + "@biomejs/biome": "^1.9.4", "@react-router/dev": "^7.1.3", "@types/node": "^20", "@types/react": "^19.0.1", @@ -27,5 +32,8 @@ "typescript": "^5.7.2", "vite": "^5.4.11", "vite-tsconfig-paths": "^5.1.4" - } + }, + "trustedDependencies": [ + "@biomejs/biome" + ] } \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 5dbdfcddcb14182535f6d32d1c900681321b1aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI33v3ic7{|AFEmuJ-;v>ep_G*NPi6KM`qNryCe1PIJ8siIN1WZ(7qVa)RVtmC% z)Ch?tN+afMKm;5@rvorJk zcXnoOc4q51HBQnQH_jn!cAg&XI1?PlX>Kl^k8qq0;zkha`kY$Fxt#=KNJAE9CMdpW zqr4#g8`nTw191(+H4xW8Tmyru2I^3=J1G3emPxkPXA=3{vvuvse_WWSshqaqls^-m zgB7q8&Vk*aYRe?sn$n53dGH#%3y%^vxv{pL*-h0Z4bmb_(k6{FL7HWIz(V*HT#IcS z-wE{)+0x1U!RUPt3gB97%p}@oHxF4|6S*+Yw=_tLtxZ~`S=z6J?O^AfU>7qOX`JNBbV&8+bO0%@fhQitKIJ^O^ zpgIa__qD_y07t@DFlBJ)8SP_#^j{6jpaXt{U%=dx!qu=4u7^21lWEYHPPY5U3TcoQ zX_7W+lvZi>TapNk_X>k-KO%MC9iZp>1E`N34gHKd9tK&){jq2~7OsJ>!G0FzxQFw6G zm&Vb(2#-T|rM|n3>uAsG_hnbvUKFf3#ay@u4uTzia~NY%XgCHfx4^To4BDU@)HlV? z@EN=g^ymETa1sQK{kRwyE4Ax8?wT&GvaG@ASO}{&a17&^v`y z!oPdiSiia^oov(Z)QhG2&|FgE{M9_4hJROGbnj>#$~ZF$-G^|zPj*QApltKe?;u;uKHJ~-V!=VLkg7Kgct)l7u39f@%VG8e3f$N-B zAu3a4%ZGf)r+jPAYCSLt73m_J3}p>}6Tx0j(wg4vvKhP!DzgiWANiE;Ppvp}P2W@m z-VbYn+NXFF?6ngef5CfY6ZwKnWvNV4z6s^~yMXw2i5mv}jC$6$46g?G|CPAu{W5qF zDobS=zb2ILX9D827g*NtGe5w;>frjanY{f)hrBP_2ehBt1?`~ypvg_Ot4x1V+43P@Ve8>qd)9NX_jWdLo`Zfy zoeam9)@Dpym{4m@+LNxXBPjPKA7{3a&H+~xQvr>C_A;7=JrfK~$M2pCh>|xLz>W6SCs4qC|#V`)# z)0C|?$o>jzh<|-cpf

    K7osU{Xp5PG4-K+L2G=)c3f&}H&M3wo7TlO_UJjQ-Oq&_ zjAc9=nNIYz{c3zxOiS5UfcE1}8#iI4@uy;$Q7>}u`j+OU0N<*Ezx$k{x_27+{s2Eg z`^=rhtIzCm!_UcJ?Db~Lh-=_))PT3{Q0{Mwdq;0>ZL%l3+;B&4!&xm#%HYAK|;b456Iv&&f$VQHf` z>$*K9w8T+paVwc7fLfMlhQ4)*zL_SG{~v4QR;IuX-(oRtYAhWOlh`NLoX0k$RUYMi z2Y!bqpdN}wz8q`-%>&Le@q|jFw92ErW-hma-le?S z-@OZt2EEUm4wLsuEMkt4zlyy29_3S50JAcQHTtgTC{P~%-mvCTzrjXOc|{}N`Cz`W zSj7CrXfa7lcsU0J(0uSX6G`54t^7}+OLM0n(|g4waOQ}bd3%!XLh?NX9|8G_|06Ie zD5F1)w5I~!et7lA{G^;uf7aqT`KE&2qx9|~O;s6t!gb`+zVLJyT2T)l*8l(j