diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.tanstack/tmp/f64cbeea-8570005595b70a237a0e7fa607dd1113 b/.tanstack/tmp/f64cbeea-8570005595b70a237a0e7fa607dd1113 new file mode 100644 index 0000000..8e55124 --- /dev/null +++ b/.tanstack/tmp/f64cbeea-8570005595b70a237a0e7fa607dd1113 @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/setup')({ + component: RouteComponent, +}) + +function RouteComponent() { + return
Hello "/setup"!
+} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 0000000..c8fb6d4 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + AIQ Lite + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..76c2c42 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "aiq-lite-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^7.1.0", + "@fortawesome/free-solid-svg-icons": "^7.1.0", + "@fortawesome/react-fontawesome": "^3.1.1", + "@tailwindcss/vite": "^4.1.18", + "@tanstack/react-router": "^1.141.6", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@tanstack/router-vite-plugin": "^1.141.7", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } +} diff --git a/public/MAV-Blue.svg b/public/MAV-Blue.svg new file mode 100644 index 0000000..99dc9b2 --- /dev/null +++ b/public/MAV-Blue.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/MAV.svg b/public/MAV.svg new file mode 100644 index 0000000..a2cce6c --- /dev/null +++ b/public/MAV.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..3d7ded3 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..3cc880d --- /dev/null +++ b/src/index.css @@ -0,0 +1,37 @@ +@import "tailwindcss"; + +body { + background: #1e2a38; + color: #fff; + font-family: Arial, Helvetica, sans-serif; +} + +/* Modal animations */ +.ReactModal__Overlay { + opacity: 0; + transition: opacity 200ms ease-in-out; +} + +.ReactModal__Overlay--after-open { + opacity: 1; +} + +.ReactModal__Overlay--before-close { + opacity: 0; +} + +.ReactModal__Content { + transform: scale(0.9) translateY(-20px); + opacity: 0; + transition: all 200ms ease-in-out; +} + +.ReactModal__Content--after-open { + transform: scale(1) translateY(0); + opacity: 1; +} + +.ReactModal__Content--before-close { + transform: scale(0.9) translateY(-20px); + opacity: 0; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..8aa86cf --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,22 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import { RouterProvider, createRouter } from "@tanstack/react-router"; +import { routeTree } from "./routeTree.gen.ts"; + +const router = createRouter({ + routeTree, + basepath: "/aiq-lite", +}); + +declare module "@tanstack/react-router" { + interface Register { + router: typeof router; + } +} + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts new file mode 100644 index 0000000..4fd81f6 --- /dev/null +++ b/src/routeTree.gen.ts @@ -0,0 +1,77 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as SetupRouteImport } from './routes/setup' +import { Route as IndexRouteImport } from './routes/index' + +const SetupRoute = SetupRouteImport.update({ + id: '/setup', + path: '/setup', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/setup': typeof SetupRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/setup': typeof SetupRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/setup': typeof SetupRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/setup' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/setup' + id: '__root__' | '/' | '/setup' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + SetupRoute: typeof SetupRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/setup': { + id: '/setup' + path: '/setup' + fullPath: '/setup' + preLoaderRoute: typeof SetupRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + SetupRoute: SetupRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx new file mode 100644 index 0000000..0115855 --- /dev/null +++ b/src/routes/__root.tsx @@ -0,0 +1,19 @@ +import { createRootRoute, Outlet } from "@tanstack/react-router"; +import Header from "../ui/Header"; +import Footer from "../ui/Footer"; + +const RootLayout = () => { + return ( + <> +
+
+ +
+